【问题标题】:Passing Data Between UIViewController's With Category Conflict在具有类别冲突的 UIViewController 之间传递数据
【发布时间】:2016-11-20 07:58:51
【问题描述】:

我有一个ViewController 课程。它有一个类别ViewController (Details),它执行:

(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

打开项目的详细信息。

当我向我的ViewController 类添加一个新按钮时,我想将一些数据作为NSArray *myData 传递给另一个控制器,例如SearchController。但是,我的prepareForSegue 永远不会执行,因为它位于ViewController (Details) 内部。所以将prepareForSegue 添加到ViewController 似乎忽略了它。

如果我在ViewController (Details) 中使用prepareForSegue 的工作版本,它适用于我的SearchController,但它看不到在ViewController 中声明的iVar NSArray *myData。理想情况下,我不想声明要在 ViewController (Details) 中设置的新数据变量,因为它无关紧要。

如果ViewController 未执行prepareForSegueViewController (Details) 未看到数据变量,如何通过按钮点击传递数据?有什么建议吗?

【问题讨论】:

  • 首先使用CoreData、Realm或静态引用之类的东西来存储你的数据,没关系。这里重要的是,如果您对数据使用单向流,您可能永远不会再遇到这个问题,因为您不需要在类之间传递数据,相反,您将始终从单一数据源获取数据并且就是这样。
  • 请显示代码 --- 仅显示相关代码 --- 来自 VC 和类别。
  • 而且@JanCássio 非常正确:vcs 应该自己访问应用程序的模型。他们有时必须传递数据,但是,例如,当用户在 vcA 中选择模型的某个方面,而 vcB 的工作是呈现有关它的详细信息时,vcA 将数据“传递”到 vcB 是合理和必要的,只要它进行通信一个选择。

标签: ios objective-c cocoa-touch uiviewcontroller


【解决方案1】:

除非必要,否则您不应使用类别。相反,如果您需要在子模块上划分大类,则应该使用类和复合模式。类别覆盖类上的方法并以未定义的顺序加载,多个类别实现相同的方法可能会导致非常难以调试的问题。类别不允许您在不使用关联对象的情况下在实例中存储任何内容,这比 ivars 难看且成本更高。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2020-10-23
    相关资源
    最近更新 更多