从TabBarController应用程序中的另一个ViewController在viewController中设置属性是一种不好的做法

时间:2017-06-21 13:12:20

标签: ios swift uiviewcontroller uitabbarcontroller

我最近将应用程序从单个控制器转换为UITabBar应用程序。在这个应用程序中,我需要将数据从tab1-ViewController传递到tab2-ViewController,我以前通过委派来完成,但现在通过从tab2中的tab1访问属性并直接在那里设置它来实现它的方式。

这被认为是一种不好的做法吗?如果是,在UITabBarController应用程序中的选项卡之间传递数据的最常用方法是什么?

这是代码......

Tab1 ViewController

class Tab1ViewController: UIViewController{
    var name:String = ""
    override func viewDidLoad() {
        super.viewDidLoad()

        /// Do something with name
    }
}

Tab2 ViewController

class Tab2ViewController: UIViewController{

    override func viewDidLoad() {
            let tab1VC = self.tabBarController?.viewControllers?[0] as! Tab1ViewController
            tab1VC.name = "John"
    }
}

2 个答案:

答案 0 :(得分:1)

你可以继承UITabBarController.It很容易从多个视图控制器访问

但正如我的快速研究@Woodster says

  

请记住,当您在Swift中传递数组时,您正在传递它   按值,与Objective-C不同,后者通过引用传递它。这意味着   您的第二个视图控制器所做的更改将不会反映出来   你的第一个视图控制器,因为你的第二个是使用副本   数组,不是同一个数组。如果你想要两个视图控制器   修改相同的数组,将数组放在一个类中,并传递一个   该类的实例。

据我所知,代码中的不良做法是直接展开值。如下所示

 let tab1VC = self.tabBarController?.viewControllers?[0] as! Tab1ViewController

答案 1 :(得分:1)

我认为代表是最好的方式。直接设置这样的属性时需要小心。由于您强制解包控制器,因此当控制器为空时它将会中断。在选项卡控制器中,如果默认显示tab2,则除非单击它,否则tab1将为空。

除此之外,如果您只想传递属性,我认为可以通过这种方式传递它。只需使用if let即可确保您的代码至少不会崩溃。