从tableviewcontroller将数据传递给父视图控制器

时间:2013-07-24 22:28:45

标签: iphone ios objective-c uiviewcontroller delegates

所以目前我有一个tableviewcontroller,如果发生某种情况,会在loginviewcontroller上方以模态方式呈现,然后一旦用户按下一个单元格,标题就应该传递给父视图控制器。

因此图片(A)是父 - 主视图,(B)是登录,(C)是tableviewcontroller ......

C位于B顶部,位于A顶部,而不是通过导航堆叠但是通过模块堆叠。所以C除了这个之外没有任何对A的引用:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self Login];
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

当用户按下单元格时,视图直接进入(A),因此从(C)到(A)跳过(B)。这就是我想要的......但问题是我如何将数据传递给(A)而不必再次实例化(A)?我的意思是再次实例化,它已经在应用程序启动开始时实例化,(B)如果用户尚未登录则显示在(A)上。所以(A)总是被加载,但是我如何传递数据对吗?

如果有更多信息需要提供,请通知我,我会尽快编辑。

修改 我看了几个与此相关的问题,我会使用NSNotification吗?还是代表团?我试图使用两者但没有一个真正起作用......我参考了我之前回答的有关授权实施授权解决方案的问题,但我必须在(A)中实例化(C)。但我已经在(B)中实例化了(C)。继续使用我将要使用但不会使用的解决方案:Delegation。以下是我尝试使用的NSNotification解决方案的链接:

将它放在viewDidLoad

中的父控制器中
- (void) viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];

    [self makeCallbacks];
    // get register to fetch notification
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(yourNotificationHandler:)
                                                 name:@"MODELVIEW DISMISS" object:nil];
}

//Now create yourNotificationHandler: like this in parent class
-(void)yourNotificationHandler:(NSNotification *)notice{
    str = [notice object];

}

将以下内容放在您的子课

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    NSLog(@"%@", cell.textLabel.text);
    // cell.textLabel.text logs this -> EDF ENRS
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MODELVIEW DISMISS" object:cell.textLabel.text];
    [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

当我记录'str'(null)打印时

现在的问题是,当我稍后在viewWillAppear中将str记录在通知之外时,它会一直返回null ....当我在通知方法中记录str时,只有DOESNT返回null ...我会试着弄清楚这一点以后但主要问题是我猜使用NSNotificationCenter解决了。

2 个答案:

答案 0 :(得分:2)

NSNotificationCenter背后的问题不起作用,是在viewDidAppear中声明它。 确保在每次显示屏幕时出现并写入更改的位置,例如 viewWillAppear

然后,在 viewWillAppear 方法中对parentView进行必要的更改。

此外,请确保在发布这些通知时,在调用的方法中删除通知。

答案 1 :(得分:1)

您的通知代码应该有效,除非您在某个时间点移除了观察者。

委托也会起作用,你只需要通过实例传递委托(传递给B,B传递给C)。

块是另一种选择,类似于委托但具有块类型而不是协议。再次,通过实例传递。


块可能是您的最佳选择。如果多个项目对事件感兴趣,则应使用通知,并且这些项目不一定与事件的触发器相关联。也就是说,通知是“最少代码选项”。