2016-11-20 3 views
-2

Я пытаюсь вернуть количество строк в таблице, используя следующий код:«Не удалось получить ячейки» ошибка при попытке использовать UITableView

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    let count = FirstTableArray.count 
    print(count)//prints 5 
    return count 
} 

Он не будет работать давая следующее сообщение об ошибке

2016-11-20 13: 28: 46,787 ModularProject [10870]: 2357799 * отказ утверждение - [UITableView _configureCellForDisplay: forIndexPath:], /BuildRoot/Library/Caches/com.apple.xbs/Sources /UIKit_Sim/UIKit-3600.5.2/UITableView.m:8035 2016-11-20 13: 28: 46.829 ModularProject [10870: 2357 799] * Завершение приложения из-за неперехваченного исключения «NSInternalInconsistencyException», причина: «UITableView (; layer =; contentOffset: {0, -64}; contentSize: {375, 44}>) не удалось получить ячейку из своего dataSource() '

Не могу понять, почему, заставляя 0 в качестве возвращаемой переменной работать, но не 1 ???

Edit 1:

Вот мой метод cellForRowAt для справки

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    print("runs") 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    print("runs2") 
    cell.textLabel?.text = "Foo" 
    return cell 
    print("runs3") 
} 
+5

Вы реализовали cellForRowAtIndexPath? – Adeel

+0

Да, я сделал потом –

+0

Что произошло после его реализации? – Adeel

ответ

-1

вы проверяете делегат и DataSource?

self.tableView.delegate = self 
self.tableVie.dataSource = self 

Не знаете, знаете ли вы, но вам нужно поставить протоколы в своем классе?

class MyClass: UIViewController, UITableViewDelegate, UITableViewDataSource {} 
+0

Ваш ответ не имеет ничего общего с ошибкой в ​​вопросе. Если источник данных не установлен, таблица просто не будет отображать строки. Ошибок не будет. Если протоколы не установлены в строке 'class', тогда код не будет компилироваться при попытке установить свойства' dataSource' и 'delegate'. – rmaddy

+0

@rmaddy Если вы прямо установили 'dataSource' и' delegate' из раскадровки ** и ** не соответствуют классу протоколам, код будет компилироваться и вызывать сбои OP. Не уверен, что это то, что имел в виду автор-ответ. – Rikh

0

Принуждение 0 работ, потому что тогда Tableview считает, что не имеет ни одной строки, чтобы показать, поэтому он не пытается вызвать метод cellForRowAt.

Поэтому, если вы хотите использовать любое число 1 или более, вы должны реализовать cellForRowAt, который требуется UITableViewDataSource. Вот пример:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    cell.textLabel?.text = "Foo" 
    return cell 
} 

Предполагая, что вы используете раскадровку, убедитесь, что вы установили свой идентификатор ячейки здесь в коде, который я использовал в примере как «Cell», чтобы соответствовать, что вы будете используя в качестве идентификатора ячейки в своем раскадровке.

0

Сначала проверьте, является ли вы получаете ячейку как ноль в

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
} 

если объект возврата ноль

let object = line. If the problem is that tableView.dequeueReusableCell(withIdentifier:) // check object here, if nil then 

Если вы используете современные шаблоны Xcode, где вы получите прототип ячейки сделал для вас, вероятно, вы должны использовать это вместо:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 

Если вы не используете Xcode temp поздно, использовать эту строку кода в любом случае затем зарегистрировать свой собственный повторно использовать идентификатор, как это:

tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell") 

Все время хорошо, что должно решить проблему. Если нет, проверьте правильность идентификатора ячейки: по умолчанию это «Ячейка», но вы, возможно, изменили ее. Такое нарушение орфографии должно привести к сбою, когда tableView.dequeueReusableCell(withIdentifier:) не удастся, но все равно стоит проверить.

Дайте мне знать, если это работает для вас.

+0

Эй, я понимаю ваши комментарии, но он все еще не работает. Ячейка идентификатора верна в раскадровке, а используемый вами код - это экзамен, такой же, как у меня (см. Раздел «Основная проблема»). Он печатает пробеги, но не выполняет2, показывая, что ошибка связана с линией «dequeueReusableIdentifier» –

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