IOS:在viewController之间传递数据(目标嵌入在NavigationController中)

时间:2014-01-13 21:23:40

标签: ios objective-c design-patterns model-view-controller storyboard

我只是在学习IOS开发,我想在ViewController之间传递数据。我正在使用Storyboard,我正在使用“prepareForSegue”方法。

我的主要问题是关于我在许多论坛和博客中发现的关于这种“信息传递”的模式。当原始控制器需要将数据传递到目标控制器时,源控制器使用以下代码访问目标控制器:

[segue destinationViewController] 

这很好,原始控制器不需要确切知道目标控制器的详细信息(我正在使用协议)。

但是当目标控制器是NavigationController(嵌入在NavigationController中的ViewController)时,建议的做法似乎是:

[[segue destinationViewController] topViewController]

但是,如果我这样做,则意味着原点控制器必须知道目标控制器是一个NavigationController。如果可能,我想避免这种情况?

也许我做错了什么?还有其他办法吗?

原点控制器是“详细页面”(来自TableView),目标控制器是“编辑页面”。

欢迎任何帮助。

由于

4 个答案:

答案 0 :(得分:1)

UINavigationController *navTmp = segue.destinationViewController;

YourController * xx = ((YourController *)[navTmp topViewController]);
xx.param = value;

答案 1 :(得分:0)

检查destinationViewController是否为UINavigationController,如果是,请获取topViewController。这样它只会自动处理任何一种情况,而且是安全的。

答案 2 :(得分:0)

  

但如果我这样做,就意味着原点控制器必须知道这一点   目标控制器是一个NavigationController。我想要   如果可能的话,避免这样做?

一种可能的解决方案是将UINavigationController子类化,使其可以接受源控制器提供的任何数据,然后将该数据传递给其根视图控制器。如果你有一些segue,有些可能会导致导航控制器而有些则没有,这可能会特别有意义,你想以同样的方式处理它们。

换句话说,创建一个UINavigationController子类,它的作用类似于其根控制器的代理。

答案 3 :(得分:0)

我看到两种可能性:

  1. 使用-isKindOfClass并检查它是否为UINavigationController
  2. 创建一个-rootViewController方法的协议,创建两个符合协议的类别,一个在UIViewController上,另一个在UINavigationController上,同时实现两个,UIViewController应该返回selfUINavigationController的一个应返回topViewController。现在,您可以在任何控制器上删除这些类别,并使用[[segue destinationViewController] rootViewController]