将数据传递给Programmatic UITabBarController

时间:2016-10-15 21:14:36

标签: uiviewcontroller uitabbarcontroller swift3 nsnotificationcenter

从Swift 3中的UIViewController传递数据到UITabBarController的最佳方法是什么?

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

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

到目前为止,我尝试通过访问初始UIViewController中的UITabBarController类并在ViewController中设置变量然后将其传递给第一个选项卡中的ViewController来尝试传递。如果我从UIViewController推送到UIViewController(TabBar中的第一个视图,但是独立运行),但是当目标Controller是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真的是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

您可以创建一个包含变量的新类来传递值:

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

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

let tabBarController = window?.rootViewController as? UITabBarController

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

var myPassedString = String()

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

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

答案 1 :(得分:0)

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

在意识到这一点之后,让它使用单身人士 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
    }