【问题标题】:IOS : passing data between viewController (destination embedded in a NavigationController)IOS:在viewController(嵌入在NavigationController中的目的地)之间传递数据
【发布时间】:2014-01-13 21:23:39
【问题描述】:

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

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

[segue destinationViewController] 

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

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

[[segue destinationViewController] topViewController]

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

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

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

欢迎任何帮助。

谢谢

【问题讨论】:

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


    【解决方案1】:
    UINavigationController *navTmp = segue.destinationViewController;
    
    YourController * xx = ((YourController *)[navTmp topViewController]);
    xx.param = value;
    

    【讨论】:

      【解决方案2】:

      我看到了两种可能性:

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

      【讨论】:

      • 我选择这个答案是因为使用了我不知道的类别(我正在学习)。类别似乎以一种非常干净的方式解决了我的问题。感谢您的帮助。
      • 上面#2的问题是UINavigationController是UIViewController的子类,defining methods with the same name in two different categories can lead to problems。具体来说,您无法确定-rootViewController UINavigationController 将使用哪个实现。
      • 事实上,我在选择此答案之前进行了检查,只有当我的 Category 方法与类方法具有相同的名称时,才会出现您提到的问题。我将确保 UINavigationController 将使用为此类定义的类别,因为覆盖对类别方法的工作方式相同。因此,我的 UINavigationController 类别中的方法将覆盖我的 UIViewController 类别中的方法。如果我理解正确“类别”只是一种组织代码的方式,那么通常的继承规则就适用。同样,我正在学习(我是一名 java 开发人员),所以我可能错了。
      【解决方案3】:

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

      【讨论】:

      • 如果这是唯一的方法,我可能会这样做。我希望有另一种选择。谢谢你的回答。
      • 这似乎是一件合理的事情。它甚至可以非常彻底,并检查视图控制器是否是其他容器类型之一并从中获取子对象。然后,当它发现一个不是容器视图控制器时,它可以检查它是否符合您正在使用的协议。
      【解决方案4】:

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

      一种可能的解决方案是子类化UINavigationController,这样它就可以接受源控制器提供的任何数据,然后将这些数据传递给它的根视图控制器。如果您有许多 segue,有些导致导航控制器,有些没有,并且您希望以相同的方式处理它们,这可能特别有意义。

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

      【讨论】:

      • 感谢您的提议。这很简单,但@emanuelpenaaguilar 的分类解决方案对我更有吸引力。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2016-03-24
      相关资源
      最近更新 更多