技术: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
变量或我应该设置它(如果这是有道理的)。
我应该如何正确启动?
答案 0 :(得分:1)
缺少很多信息。例如,您是否使用故事板。控制器之间的关系是什么:您使用导航控制器还是以模态方式呈现的细节。
假设故事板中有导航控制器:您的细节控制器可以通过多种方式了解主视图控制器。如果你确实想要使用像你的例子中的变量,你可以在故事板segue执行之前设置它。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
guard let detailController = segue.destinationController as? DetailViewController else {
return
}
detailController.masterViewController = self
}
然而,总的来说,建立这样的正式关系是不好的做法。在可重用性方面,您现在限制细节控制器仅由MasterViewController提供。
在这种情况下使用的常见模式是委托模式。在详细信息控制器上定义委托协议和委托属性。例如,将详细控制器的委托设置为prepareForSegue
中的主控制器。并执行任何操作以在主控制器上的委托方法中重新加载表。