2015-10-08 28 views
0

技术:7.0的XCode,斯威夫特2在不同的控制器中访问函数并初始化我的masterViewController?

在我的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

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

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

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

    detailController.masterViewController = self 
} 

但是,一般来说,这样的正式关系是不好的做法。就可重用性而言,您现在将限制细节控制器仅由MasterViewController提供。

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

+0

这给了我一个错误“'MasterViewController'在detailController.masterViewController = self行上没有成员'masterViewController'”。此外,这应该放在我的detailViewController中;我如何将它集成到我的代码上面?再次感谢。 –

+0

对不起,剧组显然应该是'DetailViewController'。修正了这个例子。这个方法应该被添加到MasterViewController中,并且会在segue显示你的'DetailViewController'之前被调用。 –

+0

@John Kluivers现在我从更新后的代码中得到这个错误“无法将类型'DetailViewController'的值赋值为类型'MasterViewController?'的值'”嗯... –

相关问题