【问题标题】:passing data to Programmatic UITabBarController将数据传递给 Programmatic UITabBarController
【发布时间】:2016-10-15 21:14:36
【问题描述】:

在 Swift 3 中从 UIViewController 向 UITabBarController 传递数据的最佳方式是什么?

我正在构建一个单视图应用程序,我有一个需要分成 4 个部分的详细信息视图。我想使用 TabBar 来实现这一点,并从 UIViewController 的列表中传递一个 ID,然后将该值传递给 TabBar 中的每个单独的 UIViewController。这样我就可以调用一个 Web 方法,该方法采用 ID 来填写各个视图中的数据。

该应用程序正在从带有 Storyboard 的 Obj-C 转换为没有 Storyboard 的 Swift 3,因此我无法访问我拥有的通常的 segue 定义。我还曾经在 Obj-C 版本中使用 UserDefaults 来保存选定的 ID,然后在各个视图中再次将其拉出。但是,我不相信这是实现我所追求的最佳方式。

到目前为止,我已经尝试通过访问初始 UIViewController 中的 UITabBarController 类并在 ViewController 中设置一个变量,然后将其传递给第一个选项卡中的 ViewController。如果我从 UIViewController 推送到 UIViewController(TabBar 中的第一个视图,但独立运行)但当目标控制器是 TabBarController 时不起作用。

我还尝试在 ViewControler 中发布通知并在 TabBarController 中观察结果。然而,观察代码永远不会被调用。我正在使用:

所选行:

NotificationCenter.default.post(name: notificationName, object: selectedRowID)

然后在 TabBarController 上的 ViewDidLoad 中(也尝试了 viewDidAppear 和 viewWillAppear):

NotificationCenter.default.addObserver(self, selector: #selector(setID), name: notificationName, object: nil)

上述方法有效,但是,只有当我选择第二个选项卡然后返回到第一个选项卡然后它被调用两次时!?!?!

我也尝试过 Singleton 类,但完全没有用。

使用 UserDefaults 真的是最好的方法吗?

【问题讨论】:

    标签: uiviewcontroller uitabbarcontroller swift3 nsnotificationcenter


    【解决方案1】:

    您可以创建一个新类来保存变量以传递值:

    class MyTabController: UITabBarController {
        var myPassedString = String()
    }
    

    转到 StoryBoard,选择标签栏控制器并打开身份检查器,将类更改为:MyTabController。

    let tabBarController = window?.rootViewController as? UITabBarController
    

    在需要共享数据的每个 ViewController 中定义:

    var myPassedString = String()
    

    要使这个变量共享,每个 ViewController 中的代码:

    override func viewDidLoad() {
      super.viewDidLoad()  
      myPassedString = (tabBarController as! MyTabController).myPassedString
    }
    

    【讨论】:

      【解决方案2】:

      谢谢。我没有使用故事板。

      在意识到这一点后使用单例使其工作 1. 要取回值,您必须在 viewWillAppear 中调用单例,而不是在 viewDidLoad 中调用 2. 当以编程方式创建这个时,观察的是 TabBar 中第一个子视图的 viewWillAppear,而不是实际 TabBar 控制器本身的 viewWillAppear。

      供其他尝试做类似的人参考,我的代码如下

      open class LastAccessedEvent {
          var ID : String = ""
          class var sharedInstance : LastAccessedEvent {
              struct Static {
                  static let instance : LastAccessedEvent = LastAccessedEvent()
          }
              return Static.instance
          }
      
          var EventID : String {
              get{
                  return self.ID
              }
      
              set {
                  self.ID = newValue
              }
          }
      }
      

      然后在子视图的viewWillAppear中,

          if !LastAccessedEvent.sharedInstance.ID.isEmpty{
              let myEventID = LastAccessedEvent.sharedInstance.ID
          }
      

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 2018-07-14
        • 2013-01-20
        • 1970-01-01
        • 2015-11-16
        • 2015-09-23
        相关资源
        最近更新 更多