我正在开发一款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再次初始化时,可以发送切换状态以设置交换机的状态。
很少有设计问题:
答案 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
发送通知,但这不常见,我建议使用代理。