2016-08-29 6 views
1

Я получаю эту ошибку:Зарегистрировать ячейку программно инстанциирован Table View Controller

'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier NavigationNodeCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard' 

Я использую две ячейки с тем же классом «NavigationItemCell» и два идентификаторы «NavigationNodeCell» и «NavigationLinkCell».

И создать ячейку например .:

let cell: NavigationItemCell = self.tableView.dequeueReusableCellWithIdentifier("NavigationNodeCell",  forIndexPath: indexPath) as! NavigationItemCell 

Эта проблема была передо мной, например, Assertion failure in dequeueReusableCellWithIdentifier:forIndexPath:

Как я понимаю (например, anser of Sebastian Borggrewe), должно быть достаточно, чтобы зарегистрировать UITableViewCell в доске объявлений с его пользовательским классом и идентификатором.

Это именно то, что я сделал, и я все еще получаю эту ошибку. Я попытался использовать два разных класса, но это не решило ошибку. Я также пытался зарегистрировать свои ячейки с помощью наконечника, но там я столкнулся с другими проблемами (метка - ноль).

Я обнаружил, что эта проблема, вероятно, возникает из-за того, что я программным образом создаю новый контроллер табличного представления.

var newController = MyTableViewController() 

Означает ли это, что мне придется регистрировать нибы? Является ли проблема, что мне придется регистрировать один и тот же класс дважды? И как мне избежать проблемы с меткой nil?

+0

Кроме ответов уже размещен, а также убедитесь, что ваш reuseIdentifier в cellForRowAtIndexPath таким же, как определено при регистрации cellClass/пера с Tableview и одной определенных в раскадровке/XIb клетки. – NSNoob

ответ

5

Вы должны создать экземпляр своего контроллера просмотра с идентификатором раскадровки. Заменить строку var newController = MyTableViewController() следующим кодом

let storyboard = UIStoryboard(name: "YOUR_STORYBOARD_NAME", bundle: nil) 
let newController = storyboard.instantiateViewController(withIdentifier: "VIEWCONTROLLER_ID_FROM_STORYBOARD") 

Edit: Также можно использовать: self.storyboard!.instantiateViewControllerWithIdentifier("VIEWCONTROLLER_ID_FROM_STORYBOARD")

если контроллер представления инстанциируется из раскадровки, и второй контроллер представления находится в такая же раскадровка

+0

Пробовал, я получаю сообщение об ошибке: 'storyBoardWithName (_: bundle:) _ недоступно: используйте конструкцию объектов' UIStoryBoard (имя: bundle :) ' – Nina

+0

Прошу прощения, я перевел код с объектива-c, попробовал это один 'UIStoryboard (имя:« MyStoryboardName », bundle: nil)' – Tiko

+0

Я попытался «позволить контроллеру = self.storyboard !.instantiateViewControllerWithIdentifier (« ID ») ... это, похоже, работает, но я еще не уверен, что ID моего UITableViewController: – Nina

1

Если вы создаете свой контроллер табличного представления с инициализатором (вместо storybaord.instantiateViewController(withIdentifier:)), то ваш контроллер табличного представления не будет знать о ячейках, которые вы кладете в раскадровку. Если вы хотите использовать инициализатор, вам необходимо вручную зарегистрировать собственный класс ячеек ввашего контроллера.

class MyTableViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad 
     tableView.register(NavigationNodeCell.self, forCellReuseIdentifier: "NavigationNodeCell") 
    } 

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