0

Я борется с переключением viewControllers.Невозможно вызвать tableViewController

я получил следующее раскадровку:

storyboard

левый верхний VC является Войти VC, который толкает вид на MainViewController (внизу слева) с помощью модального Segue.

Это прекрасно работает через:

self.performSegueWithIdentifier("MainSegue", sender: self) 

MainViewController Саваоф «Меню» бар элемент, который при нажатии на инициирующее управление какао SSASideMenu и представляет LeftSideMenu VC. Это также отлично работает.

LeftSideMenu VC имеет 2 пункта меню («домашний» и «заказ»). Пункт «home» вернется в MainViewController (пример 0 ниже - отлично работает). Элементу «order» необходимо представить ItemTableViewController (верхний правый), который представляет собой, в основном, tableVC с ячейкой прототипа, встроенной в контроллер навигации.

Случай 1 ниже, где все это идет не так:

func tableView(..........) { 

    tableView.deselectRowAtIndexPath(indexPath,animated: true) 

    switch (indexPath.row) { 
     case 0: 
      sideMenuViewController?.contentViewController = 
       UINavigationController(rootViewController: MainViewController()) 
      sideMenuViewController?.hideMenuViewController() 
     break 
     case 1: 
      sideMenuViewController?.contentViewController = 
       UINavigationController(rootViewController: ItemTableViewController()) 
      sideMenuViewController?.hideMenuViewController() 
     break 
    } 
} 

Таким образом, случай 1 приведет к Func Tableview из ItemTableViewController называться:

func tableView(tableView: UITableView, cellForRowAtIndexPath ...) { 

    let cellIdentifier = "MenuItemTableViewCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MenuItemTableViewCell! 

    let item = items[indexPath.row] 

    cell.cellTitle.text = item.name // **cell is always nil** 

    .... 

клетка всегда равна нулю.

Я пытался зарегистрировать класс (хотя я не должен, так как я использую раскадровку) с:

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MenuItemTableViewCell! 
    if cell == nil { 
      tableView.RegisterClass(MenuItemTableViewCell.self, forCellReuseIdentifier: cellIdentifier) 
      cell = MenuItemTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: cellIdentifier) 

    let item = items[indexPath.row] 

    cell.cellTitle.text = item.name // **cell is still nil** 

Я также пробовал с Segue, но получить не существует переход на ошибках LeftSideMenu (он существует с правильным CellIdentifier).

В нижней строке я не могу вызвать ItemTableViewController (верхний правый столVC)!

Любые подсказки, пожалуйста?

ответ

0

Вы никогда не должны никогда не звонить dequeueReusableCellWithIdentifier:. Вместо этого всегда используйте dequeueReusableCellWithIdentifier:forIndexPath:. Он может никогда не возвращает nil, и если есть проблемы, это даст вам хорошее сообщение об ошибке, объясняющее почему.

Ожидается, что вы получите сообщение об ошибке, сообщающее вам, что оно не подключено к ячейке прототипа в раскадровке. Тогда вам нужно выяснить, почему. Конечно, правильный идентификатор ячейки имеет решающее значение: он должен соответствовать идентификатору повторного использования кода точно, включая правописание. Но есть гораздо больше, чем это. Возможно, вы забыли установить пользовательский класс контроллера табличного представления в раскадровке. Или, возможно, вы получили неправильный экземпляр контроллера табличного представления, т. Е. Вы создали новый, а не получите фактический экземпляр из раскадровки, экземпляр, который имеет ячейку прототипа.

+0

Я использовал это первоначально. Ошибка была «неспособна деактивировать ячейку с идентификатором MenuItemTableViewCell - должна зарегистрировать nib или класс для идентификатора или подключить ячейку прототипа в раскадровке». Я использую раскадровку с правильным идентификатором, но – Polis

+0

Но вы видите, что ошибка _helpful_. Вы были неправы, чтобы скрыть это от себя, изменив звонок.:) Это говорит о том, что ваша связь между контроллером табличного представления и раскадрой неправильная. Я не знаю, что вы сделали неправильно, но это то, что вам нужно исправить. Возможно, вы забыли установить пользовательский класс контроллера табличного представления в раскадровке. Или, возможно, вы получили неправильный экземпляр контроллера табличного представления - т. Е. Вы создали новый, а не получаете экземпляр из раскадровки. Это проблема, но вы можете ее увидеть и исправить. – matt

+0

Как я могу получить экземпляр раскадровки tableVC, хотя, если он никогда не был создан ранее? Это первый вызов VC в приложении. – Polis

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