2016-11-27 89 views
0

我正在创建一个简单的应用程序,它有一个标签栏控制器,其中摘要是一个选项卡,历史记录是另一个选项卡。在摘要选项卡中,有一个按钮可添加新一轮。每当这一轮被添加,它也必须去历史选项卡。TabBarController的第二个选项卡没有被实例化 - > IBOutlets是零

我想通过tabBarController发送数据。

我所遇到的是每当我添加新一轮之前我没有打开历史选项卡,我的程序崩溃,因为我的IBOutlets是零。但是,无论何时我首先打开选项卡,然后返回添加新一轮,它都可以正常工作。我也不必在每一轮之后重新打开标签。看起来这个标签在第一次打开之前没有被实例化。

失败的GIF(错误是图表View是无): http://i.imgur.com/VPa0RmK.gifv

的Gif成功: http://i.imgur.com/LqxYBjV.gifv

有没有办法手动做到这一点?

我是iOS编程的新手,所以这就是我认为的问题所在。如果发生其他问题,我想知道我的代码崩溃了!

回答

1

你说得对。问题是第二个选项卡的插口在您访问该选项卡之前无法设置。

解决方案:

  1. 您可以将数据写入到第二的viewController的属性,然后将数据移动到出口处的viewWillAppear覆盖。

  2. 另一种可能性是在写入之前检查插座是否为nil。如果是这样,请在第二个viewController上调用loadView来告诉它设置其出口,然后您就可以写入它们。请注意,如果您手动拨打loadView,则方法viewDidLoad将无法​​运行,因此如果您在此处进行任何其他设置,则还需要从loadView开始执行此操作。

  3. 也许比手动调用loadView更简单的方法是通过访问view属性来触发secondViewController的viewDidLoad。这可以是简单的:

    if let svc = self.tabBarController?.viewControllers?[1] as? SecondViewController { 
        // check if outlet is nil 
        if svc.myLabel == nil { 
         // trigger viewDidLoad to set up the outlets 
         _ = svc.view 
        } 
        svc.myLabel = "Success!" 
    } 
    
  4. 这就是说,直接访问其他的viewController的意见(即网点)是设计不良,违反了MVC(模型 - 视图 - 控制器)范例。你应该把你的数据放在一个可以被所有选项卡访问的地方,然后让每个viewController在viewWillAppear中自动更新。看到这个答案:Sharing data in a TabBarController的一种方法来做到这一点。

+0

感谢您的明确解释! –

0

这是它应该如何工作。每个选项卡仅在必须显示时才创建。这与TableViews和CollectionViews的想法是一样的。

解决这个问题的简单方法是重写HistoryViewController的viewWillAppear(或viewDidAppear)方法,并从那里刷新UI。

这样,您永远不会假设历史选项卡存在于摘要选项卡中,历史刷新自己的用户界面。

希望这会有所帮助。

相关问题