2014-10-31 3 views
2

Я работаю в Swift с одним TableViewController с одной ячейкой прототипа. У ячейки есть идентификатор повторного использования, указанный в раскадровке, но он никогда не удаляется должным образом. Я всегда получаю сообщение об ошибке «неожиданно обнаружил нуль при распаковке необязательного значения».Swift TableViewController reuseIdentifier никогда не работает

Я правильно зарегистрировал класс следующим образом:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "myNewCell") 

Код-нарушителем является:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCellWithIdentifier("myNewCell") as UITableViewCell 

    let textField = cell.viewWithTag(123) as UITextField 
    textField.text = "test" 

    return cell 
} 

Я чувствую, что я попробовал все здесь, но это не правильно дает ячейку с этот идентификатор. Даже при использовании резервной копии (если nil, создать ячейку с этим идентификатором) все еще дает ошибку. Это определенно проблема с получением ячейки с этим идентификатором, но она зарегистрирована и указана в раскадровке ... Любая помощь очень ценится!

+0

Я предполагаю, что ошибка на viewWithTag: линии, так как при регистрации класса, вы получаете по умолчанию UITableViewCell, что не будет иметь вид с тегом 123. УДАЛЕНИЕ, что регистрация метод должен исправить проблема (Предположим, что вы установили идентификатор ячейки в «myNewCell» в IB). – rdelmar

+0

Хотите узнать, почему вы переопределите cellForRowAtIndexPath? –

+0

Довольно уверен, что это функция в TableViewController, которая я подклассифицирую для моего уникального PrefixTableViewController. Так что это переопределенный метод. Xcode вставил это ключевое слово для меня. – dhganey

ответ

4

При использовании прототипов сотовых телефонов вы не вызываете registerClass. Раскадровка делает это для вас. Если прототип ячейки имеет свой идентификатор, то только все dequeueReusableCellWithIdentifier и он должен найти прототип вашей камеры без инцидентов.

Я бы предложил проверить орфографию/заглавные буквы идентификатора в раскадровке и убедиться, что он идентичен тому, что используется в коде cellForRowAtIndexPath.


Я заметил, что вы пытаетесь получить доступ к метке ячейки, используя номер тега. В настоящее время, когда речь идет о макетах пользовательских ячеек, мы обычно создаем собственную таблицу вида подкласса, например:

// CustomTableViewCell.swift 

import UIKit 

class CustomTableViewCell: UITableViewCell { 

    @IBOutlet weak var customTextField: UITextField! // note, I would use something other than textLabel to avoid confusion with base class 

} 

Мы бы тогда перейти на наш мобильный прототип и указать его базовый класс:

cell base class

Мы также установить идентификатор мобильного прототипа:

enter image description here

Мы бы тогда подключить уплотнительное utlet между прототипом ячейки и нашим пользовательским классом @IBOutlet.

Сделав все это, cellForRowAtIndexPath будет:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("myNewCell", forIndexPath: indexPath) as CustomTableViewCell 

    cell.customTextField.text = "Row \(indexPath.row)" 

    return cell 
} 
+0

Я подтвердил, что идентификатор был прав, поэтому я честно понятия не имею, что происходит. Я завершил подклассификацию UITableViewCell и исправил его. – dhganey

-4

Если dequeueReusableCellWithIdentifier дает вам проблемы, то просто не использовать его.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
let cell = UITableViewCell() 

let textField = cell.viewWithTag(123) as UITextField 
textField.text = "test" 

return cell 
} 
+2

Это ужасно, он полностью обходит очередь повторного использования и будет влиять на производительность ни на чем, кроме тривиальных ячеек.И использование тегов для идентификации ячеек - это огромный запах кода. – Anorak

+0

Тэги от искателя, а не от меня. Однако это решение будет работать, даже если производительность немного отличается. – AMAN77

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