2015-10-08 3 views
0

технологии: Xcode 7.0, Swift 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

Информация отсутствует. Например, вы используете раскадровки или нет. Какова связь между контроллерами: используете ли вы контроллер навигации или, например, представленную деталь.

Предполагая контроллер навигации в раскадровке: есть несколько способов, которыми ваш контроллер детали должен знать о контроллере главного представления. Если вы действительно хотите использовать переменную, как в вашем примере, вы можете установить ее перед выполнением сеанса раскадровки.

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

    detailController.masterViewController = self 
} 

Однако в целом плохая практика имеет такие формальные отношения, как эта. Что касается возможности повторного использования, вы теперь ограничиваете контроллер детали представлением только MasterViewController.

Общим образцом, используемым в таких случаях, является шаблон делегата. Определите делегатский протокол и свойство делегата на вашем контроллере подробностей. Установите делегат контроллера детали на главный контроллер в вашем prepareForSegue, например. И выполните любые действия, чтобы перезагрузить таблицу в методе делегата на главном контроллере.

+0

Это дает мне ошибку. «MasterViewController» не имеет элемента «masterViewController» участника на странице detailController.masterViewController = self. Кроме того, где это должно быть помещено в мой detailViewController; как его интегрировать в мой код выше? Еще раз спасибо. –

+0

Извините, актеры должны были, очевидно, быть в 'DetailViewController'. Исправлено это в примере. Этот метод должен быть добавлен в MasterViewController и вызывается до того, как segue отобразит ваш 'DetailViewController'. –

+0

@John Kluivers теперь я получаю эту ошибку из обновленного кода «Не могу присвоить значение типа« DetailViewController »значению типа« MasterViewController? »« Hmm ... –

Смежные вопросы