我只是在学习IOS开发,我想在ViewController之间传递数据。我正在使用Storyboard,我正在使用“prepareForSegue”方法。
我的主要问题是关于我在许多论坛和博客中发现的关于这种“信息传递”的模式。当原始控制器需要将数据传递到目标控制器时,源控制器使用以下代码访问目标控制器:
[segue destinationViewController]
这很好,原始控制器不需要确切知道目标控制器的详细信息(我正在使用协议)。
但是当目标控制器是NavigationController(嵌入在NavigationController中的ViewController)时,建议的做法似乎是:
[[segue destinationViewController] topViewController]
但是,如果我这样做,则意味着原点控制器必须知道目标控制器是一个NavigationController。如果可能,我想避免这种情况?
也许我做错了什么?还有其他办法吗?
原点控制器是“详细页面”(来自TableView),目标控制器是“编辑页面”。
欢迎任何帮助。
由于
答案 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)
我看到两种可能性:
-isKindOfClass
并检查它是否为UINavigationController
-rootViewController
方法的协议,创建两个符合协议的类别,一个在UIViewController
上,另一个在UINavigationController
上,同时实现两个,UIViewController
应该返回self
,UINavigationController
的一个应返回topViewController
。现在,您可以在任何控制器上删除这些类别,并使用[[segue destinationViewController] rootViewController]