0

我可以使用 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变量的值(已从前一个视图控制器传递给此视图控制器)来调用数据库方法。

任何想法或建议如何做到这一点?提前致谢。

4

2 回答 2

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观察者,而是使用自定义设置器。唯一的区别是,因为它是一个设置器,所以你必须设置你的变量

@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 
}
于 2016-01-21T08:20:53.477 回答
0
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 
}
于 2016-01-21T09:31:22.550 回答