【问题标题】:Pass data from child controller back to parent controller将数据从子控制器传回父控制器
【发布时间】:2013-12-10 16:45:45
【问题描述】:

我正在开发一个 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 上的开关状态(例如:YES),然后返回到 ControllerA,然后当返回到 ControllerB 时,用户应该看到与导航返回时相同的开关状态。 (即:是)

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

几个设计问题:

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

【问题讨论】:

标签: ios ios7 uiswitch


【解决方案1】:

根本不需要控制器 A 参与其中,只是不要在每次推送时都实例化新的控制器 B。为控制器B创建一个属性,并在推送之前检查控制器是否存在。

- (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,那么您应该使用委托来执行此操作(顺便说一句,控制器 B 不是控制器 A 的子级。它们都是导航控制器的子级,其中使他们成为同胞)。

【讨论】:

  • 你成就了我的一天!!非常感谢!!我现在不需要额外的委托或属性来处理这个。
【解决方案2】:

我会将开关的状态保存在全局对象中(单例可能是一个不错的选择)或者 CoreData 或 plist 如果您需要在应用程序打开之间持续存在。要保存该值,您无需将信息传递给父视图控制器,每次更改开关状态时都可以这样做。

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

【讨论】:

  • 如果我仍然使用委托,我不会在 ControllerB 中为 ControllerA 创建一个对象吗?只是想了解它是否是让控制器对象相互连接的好方法。
  • 据我了解您的建议,是否使用委托与在您的视图控制器之一中创建对象或属性无关。例如,如果你想在你的控制器 A 中保存开关的状态,你应该在控制器 A 中有 something 来保存那个状态。
  • 是的,我将创建一个属性或委托来处理控制器 A 中的开关状态...也许委托会是一个更好的主意。
  • 感谢您的回复!!
  • 请记住属性 != 委托。一种类似于具有 getter/setter 的 ivar(类中的变量),另一种是在视图控制器之间传递消息的一种方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多