将数据从子控制器传递回父控制器

时间:2013-12-10 16:45:45

标签: ios ios7 uiswitch

我正在开发一款iPad应用程序,我可以处理2个控制器。我的父控制器(比如控制器A)有一个单元,当单击时通过pushViewController调用/导航到子控制器(比如控制器B),如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    ControllerB *controllerB = [[ControllerB alloc] initWithStyle:UITableViewStyleGrouped];

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered
                                                                  target:nil action:nil];
    [self.navigationItem setBackBarButtonItem:backButton];
    [self.navigationController pushViewController:controllerB animated:YES];
} 

现在在ControllerB中,我处理一个开关,当用户从ControllerB来回导航到ControllerA然后再返回到ControllerB,即用户更改ControllerB上的开关状态时(例如:是),它必须保持其状态,返回到ControllerA然后当回到ControllerB时,用户应该看到他导航回来时所处的开关状态。 (即:是)

我正在考虑将ControllerB的状态从ControllerB发送回ControllerA,这样当ControllerB再次初始化时,可以发送切换状态以设置交换机的状态。

很少有设计问题:

  • 在控制器之间建立交叉连接是个好主意。即ControllerA有一个ControllerB的对象,但为了发回交换机状态,我计划在ControllerA中创建一个属性来保持交换机状态,并在控制器B中为它分配交换机状态值。但为此,我必须创建一个ControllerB中ControllerA的对象,可以是交叉连接。
  • 将数据从子控制器传递到父控制器的其他最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

根本不需要将控制器A包含在内,只要每次按下它都不要实例化新的控制器B.为controllerB创建一个属性,并在推送之前检查控制器是否存在。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (! self.controllerB) {
        self.controllerB = [[ControllerB alloc] initWithStyle:UITableViewStyleGrouped];
    }

    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered
                                                                  target:nil action:nil];
    self.navigationItem setBackBarButtonItem:backButton];
    [self.navigationController pushViewController:self.controllerB animated:YES];
} 

如果你需要从控制器B将数据传回控制器A,出于任何原因,那么你应该使用委托来做到这一点(BTW,controllerB不是控制器A的子节点。他们都是导航控制器的子节点,让他们同胞)。

答案 1 :(得分:0)

我会将交换机的状态保存在全局对象中(单例可能是一个不错的选项),或者如果您需要在应用程序开头之间保留,可以使用CoreData或plist。要保存该值,您无需将信息传递给父视图控制器,您可以在每次更改开关状态时执行此操作。

无论如何,如果您必须将数据传递给父视图控制器,您应该使用代理,或者您可以通过NSNotificationCenter发送通知,但这不常见,我建议使用代理。