访问不同控制器中的功能&初始化我的masterViewController?

时间:2015-10-08 20:14:39

标签: ios swift swift2 ios9

技术:XCode 7.0,Swift 2

在我的detailViewController文件中,我(除其他外):

    var masterViewController: MasterViewController? = nil

    @IBAction func saveItem(sender: anyObject) {
            if let newItem = something,
                    let tagItem = newItem
                    self.masterViewController!.model.saveQuery(newItem, forTag: tagItem, syncToCloud: true)
                    let indexPath =
                    NSIndexPath(forRow: 0, inSection: 0)
                    self.masterViewController!.tableView.insertRowsAtIndexPaths([indexPath],
                        withRowAnimation: .Automatic)
                    self.masterViewController?.forceSearch(indexPath)
                    self.masterViewController?.tableView.reloadData()
            }

     }

所以,我在self.masterViewController...saveQuery行上遇到了错误的执行错误,我认为这与我的MasterViewController设置为nil的事实有关。但是,我不确定我应该如何启动我的MasterViewController变量或我应该设置它(如果这是有道理的)。

我应该如何正确启动?

1 个答案:

答案 0 :(得分:1)

缺少很多信息。例如,您是否使用故事板。控制器之间的关系是什么:您使用导航控制器还是以模态方式呈现的细节。

假设故事板中有导航控制器:您的细节控制器可以通过多种方式了解主视图控制器。如果你确实想要使用像你的例子中的变量,你可以在故事板segue执行之前设置它。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    guard let detailController = segue.destinationController as? DetailViewController else {
        return
    }

    detailController.masterViewController = self
}

然而,总的来说,建立这样的正式关系是不好的做法。在可重用性方面,您现在限制细节控制器仅由MasterViewController提供。

在这种情况下使用的常见模式是委托模式。在详细信息控制器上定义委托协议和委托属性。例如,将详细控制器的委托设置为prepareForSegue中的主控制器。并执行任何操作以在主控制器上的委托方法中重新加载表。