iOS - 从一个视图控制器传递数据以在另一个视图控制器的 init 方法中使用
Posted
技术标签:
【中文标题】iOS - 从一个视图控制器传递数据以在另一个视图控制器的 init 方法中使用【英文标题】:iOS - Pass data from one viewcontroller to use in the init method of another viewcontroller 【发布时间】:2016-01-21 07:57:44 【问题描述】:我可以使用 prepareForSegue 方法在两个视图控制器之间传递数据。但是这样一来,传递的数据就不能在第二个视图控制器的 init 方法中使用了。
另外,我正在使用 XLForm。所以在init方法里面访问数据是很有必要的。
谁能帮我解决这个问题。
这是第一个视图控制器的 prepareForSegue 方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([[segue identifier] isEqualToString:@"SessionToWorkout"])
WorkoutsViewController *vc = [segue destinationViewController];
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
UITableViewCell *selectedCell = [self.tableView cellForRowAtIndexPath:indexPath];
cellName = selectedCell.textLabel.text;
NSString *sectionTitle = [self tableView:self.tableView titleForHeaderInSection:indexPath.section];
sectionName = sectionTitle;
vc.sectionName = sectionName;
vc.cellName = cellName;
这是第二个视图控制器的 initWithCoder 方法:
- (instancetype)initWithCoder:(NSCoder *)coder
self = [super initWithCoder:coder];
if (self)
//Retrieve Workouts from DB
NSString *day_id;
day_id = [[DBHandler database] getDayIdWhere:@[@"day_name"]
whereValues:@[cellName]];
workoutsArray = [[DBHandler database] getWorkoutsForDayWhere:@[@"day_id"]
whereValues:@[day_id]];
AppLog(@"Workouts array %@", workoutsArray);
[self initializeForm];
return self;
在 initWithCoder 方法中,我需要使用 cellName 变量的值(已从之前的视图控制器传递给此视图控制器)来调用数据库方法。
任何想法或建议如何做到这一点? 提前致谢。
【问题讨论】:
您可以使用变量的didSet
观察者来初始化您的数据库。
@MichaëlAzevedo 对不起,我不熟悉 didSet 观察者。你能进一步解释一下吗?
我刚刚添加了一个答案:)
【参考方案1】:
didSet
观察者在变量被修改时被调用(它在变量被初始化时不被调用)。设置 cellName 时初始化数据库:
斯威夫特:
var cellName : String = ""
didSet
// The cell name has been set, create the database here as in any other function
目标-C:
在目标 C 中非常相似,但是您没有 didSet
观察者,而是使用自定义设置器。唯一的区别是,因为它是一个 setter,所以你必须设置你的变量
@property(nonatomic, strong) NSString * cellName;
-(void)setCellName:(NSString *)newValue
// First, set the new value to the variable
_cellName = newValue;
// The cell name has been set, create the database here
【讨论】:
谢谢。哦,等等,这很快吧?但我正在使用objective-c:/ 哦,我的错,你也可以在 Objective C 中做到这一点。让我编辑我的答案! 另一个问题,我在前一个视图控制器的 prepareForSegue 方法中设置了这个“cellName”变量的值。所以它已经设置好了。但是当我试图在 initWithCoder 方法中访问它时,它给了我一个空值。可能是因为在设置值之前调用了“initWithCoder”方法?如果是这样,有什么方法可以在调用“initWithCoder”方法时设置这个变量的值? 你不能在initwmithcoder
之前设置值,因为它是初始化你的对象的方法。因此,initwmithcoder
中的值为 null(或默认值)。您必须在自定义设置器中使用此值,或者如果您愿意,也可以创建一个自定义初始化函数,并为此字符串值添加一个新参数。【参考方案2】:
if ([[segue identifier] isEqualToString:@"SessionToWorkout"])
UITableViewCell *cell = sender;
// Get reference to the destination view controller
WorkoutsViewController *vc = [segue destinationViewController];
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
//you can get cell value in didSelectRowAtIndexPath fun
cellName = cell.textLabel.text;
NSString *sectionTitle = [self tableView:self.tableView titleForHeaderInSection:indexPath.section];
sectionName = sectionTitle;
[vc setSectionName: sectionName];
[vc setCellName: cellName];
//check it have right value
NSLog(@"Cell name %@ Section name %@", cellName ,sectionName);
//*** in viewControllerB set sectionName, cellName as @property and set it to @synthesize
【讨论】:
以上是关于iOS - 从一个视图控制器传递数据以在另一个视图控制器的 init 方法中使用的主要内容,如果未能解决你的问题,请参考以下文章
如何从视图控制器发送数据以在 swift 5 中嵌入视图控制器?
在另一个视图控制器中传递 ImagePickerView 的图像