2015-03-24 3 views
1

Я только начал изучать некоторые материалы IOS, и я использую Swift для кодирования моего приложения. Я столкнулся с проблемой с моими табличными представлениями, где по какой-то причине они похоже, не отображают содержимое в моем представлении таблицы.IOS TableView - RegisterClass не отображает контент

На мой взгляд, контроллер, который содержит TableView меня в viewDidLoad() метод:

self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: textCellIdentifier) 

Идя все ресурса, который я видел, что они, кажется, предполагают, что это то, что вам нужно, чтобы ваш стол просмотр для отображения элементов списка типа UITableViewCell. Когда я запускаю свою программу, ничего не появляется в моем объекте tableView. Я нашел учебник где-то, где они писали его несколько иначе. Вместо того чтобы использовать registerClass они имели:

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

Я заменил registerClass метод с этим, и это, кажется, работает прекрасно. Может ли кто-нибудь объяснить, почему мой метод registerClass не работает и что это другое решение сделало, чтобы оно работало? Является ли эта плохая практика в IOS присваиванием таких значений объектам вида?

ответ

2

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

Таким образом, вам нужно будет иметь все три линии. Вы можете сделать все это в Storyboard, поэтому некоторые учебники могут не содержать весь этот код.

Например, если вы используете статические или прототипированные ячейки в раскадровке, вы не включили бы registerClass. Аналогично, если вы рисуете табличное представление в своем классе в раскадровке и задаете его dataSource и delegate таким образом, вы не включили бы эти сеттеры.

Чтобы получить данные, отображающие на вашем столе вы должны присвоить ему источник данных (например, в вашем примере), а затем реализовать:

tableView:numberOfRowsInSection: - Сообщает таблицу, сколько строк должно быть (в данном разделе)

tableView:cellForRowAtIndexPath: - дает таблицу фактическую ячейку, чтобы представить (типа вы зарегистрированы выше)

+0

Это имеет большой смысл! Я пропустил dataSource и делегировал выходы в раскадровке. Всегда кажется, что-то скрыто от вас в этих уроках! Спасибо за помощь! –

+0

@StuartRobertson, да, есть. Один из недостатков раскадровки - тоже ИМО, им немного сложно узнать, что происходит с тех пор, как вам нужно копаться на ней, пытаясь выяснить, где/если что-то установлено. Рад, что он работает! – Firo

+0

Пожалуйста, исправьте меня, если я ошибаюсь: 'registerClass (UITableViewCell.self, forCellReuseIdentifier: textCellIdentifier)' <- то, что это делает, это: * связей * ванильный cellIdentifier для customClass, а затем добавляет/регистрирует его в tableView ? Позже мы используем этот идентификатор, т. Е. ** не ** класс для деактивации, потому что мы не можем деактивировать классы, поскольку у нас есть только один класс, но у нас могут быть разные типы ячеек того же класса. – Honey

1

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

self.tableView.dataSource = self говорит self.tableView, что нужно использовать self для методов DataSource (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDataSource_Protocol/index.html#//apple_ref/swift/intf/UITableViewDataSource), которые возвращают вещи, как количество секций, количество строк и т.д.

без подачи dataSource к tableView, он будет всегда быть пустым (потому что он не знает количества разделов, строк, заголовков, нижних колонтитулов и т. д., чтобы отобразить, поэтому он отобразит 0).

+0

так что, если из-за ограничения по высоте только 8 строк можно увидеть из нашего Tableview, регистр будет происходить только в 8 раз? – Honey

+0

@Honey - нет, 'registerClass' вызывается вручную, вы, вероятно, один раз за каждый идентификатор, который вы используете.Если ваш tableView может отображать только 8 строк, и все эти строки используют один и тот же идентификатор reuseIdentifier, то класс, указанный в вашем вызове 'registerClass: forCellReuseIdentifier', будет создан 8 раз (и, возможно, один или два для подготовки соседних экранированных UITableViewCells) – Adam

+0

, поэтому, если наш код будет таким же, как OP, регистр будет вызываться один раз. но UITableViewCell будет называться 8 раз. правильно? – Honey

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