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 的图像

如何将数据从一个视图传递到 IOS 中的另一个视图控制器?

将数据从任何视图控制器传递到 iOS 中的一个主视图控制器

将 managedobject 从 uitableview 传递到文本字段以在核心数据模型中进行编辑

如何使用 post 方法将 JSON 数据从登录功能传递到另一个视图控制器?