2015-10-08 26 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?'的值'」嗯... –

相關問題