2015-06-20 4 views
2

Я изучаю основные представления таблиц в Swift и сталкиваюсь с проблемой при попытке использовать tableView.dequeueResuableCellWithIdentifier.Почему я получаю ошибку времени выполнения с помощью tableView.dequeueReusableCellWithIdentifier

Я работал над созданием нового UITableViewCell при каждом вызове этого метода (например, var cell = UITableViewCell()), но я знаю, что это очень неэффективно и не рекомендуется. Теперь, с приведенным ниже кодом, я получаю ошибку времени выполнения в 'var cell = tableView.dequeueReusableCellWithIdentifier («cell», forIndexPath: indexPath) как! UITableViewCell.

Я указал одну ячейку Prototype и дал ей идентификатор повторного использования 'cell'.

class ViewController: UIViewController, UITableViewDataSource { 

let devCourses = [ 
    ("iOS App Dev with Swift Essential Training","Simon Allardice"), 
    ("iOS 8 SDK New Features","Lee Brimelow"), 
    ("Data Visualization with D3.js","Ray Villalobos"), 
    ("Swift Essential Training","Simon Allardice"), 
    ("Up and Running with AngularJS","Ray Villalobos"), 
    ("MySQL Essential Training","Bill Weinman"), 
    ("Building Adaptive Android Apps with Fragments","David Gassner"), 
    ("Advanced Unity 3D Game Programming","Michael House"), 
    ("Up and Running with Ubuntu Desktop Linux","Scott Simpson"), 
    ("Up and Running with C","Dan Gookin") ] 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return devCourses.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! UITableViewCell 

    let (courseTitle, courseAuthor) = devCourses[indexPath.row] 

    cell.textLabel?.text = courseTitle 
    return cell 
} 

Единственный выход, который я получаю (lldb), так что я понятия не имею, в чем проблема. Я использую Xcode 6.3.2.

Спасибо!

+0

Где вы регистрируете идентификатор ячейки с табличным представлением? –

+0

Из раскадровки я выбрал ячейку прототипа в представлении таблицы, а затем в Инспекторе атрибутов я ввел ячейку в поле Идентификатор. – Jim

+1

Вы говорите, что у вас есть ошибка времени выполнения в определенной строке, но единственный вывод, который у вас есть, - lldb. Вы уверены, что не просто установили точку останова в этой строке? – EmilioPelaez

ответ

0

Если вы используете стандартную ячейку, которая вам кажется, вы все равно должны зарегистрировать класс как класс ячейки для удаления из очереди. Прямо сейчас, вы tableView не знаете, какой тип dequeue.

В viewDidLoad этого метода, вы должны сделать что-то вроде этого:

self.tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "cell") 

Таким образом, представление таблицы будет правильно вывода из ячейки идентификатора "cell" для этой таблицы.

0

Если вы хотите быть уверены, что что-то еще в раскадровки не перекрывая регистрацию, попробуйте следующее:

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Make sure that "cell" is the name of the reuse identifier. Maybe use a const in M file to set it. 
    let nibName = UINib(nibName: "YourNibName", bundle:nil) 
    self.tableView.registerNib(nibName, forCellReuseIdentifier: "cell") 
} 

Поскольку viewDidLoad происходит после перо получает загружен, это будет гарантировать, что все, что вы вызываете проблему, вы получаете последнее слово - если это не что-то в вашем коде в другом месте.

struct UIConstants { 
    struct SomeViewControllerUIConstants { 
     static let cellNibName   = "SpecialCell"; 
     static let cellReuseIdentifier = "cell"; 
    } 
} 

Кроме того, возможно, рассмотреть вопрос об объявлении псевдо- conststruct, как указано выше. Это уменьшит вероятность возникновения проблемы с орфографией или капитализацией, вызвав такое исключение для выполнения, которое, кстати, я думаю, что Apple может потратить пару часов на программирование, чтобы обрабатывать более изящно. Почему бы не сделать поиск без учета регистра, или случайный размер строки нечувствителен, чтобы увидеть, может ли он найти ровно один матч на расстоянии 0 или 1? Во всяком случае, я отвлекся.

0

Я могу сделать ваш код без изменений. Ключ находится в правильной настройке раскадровки.

  1. Убедитесь, что класс ViewController в раскадровку устанавливается в Удостоверение инспектора к ViewController. Примечание: не UIViewController.

    set Class

  2. Убедитесь, что Tableview DataSource установлено. Вы можете управление -выражение из таблицыView в вашей раскадровке до значка ViewController вверху и выберите dataSource из всплывающего окна.

    drag from tableView

    choose dataSource

  3. Убедитесь, что клетка прототип имеет идентификатор повторного набора в "ячейки".

    enter image description here

0

Спасибо всем за ваши ответы. Оказывается, я сделал что-то глупое - я случайно добавил точку останова на этой линии. ЭмилиоПелаес предположил, что это может быть проблемой, и, конечно же, это было так. Код теперь работает как ожидалось.

Еще раз спасибо!

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

  • Нет связанных вопросов^_^