Метод UITableView cellForRowAtIndexPath не вызывается
My UITableView
не показывает никаких данных. Я думаю, проблема в следующем:
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell?`
Это мой код:
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
// Configure the cell...
let cellId: NSString = "Cell"
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell
if let ip = indexPath {
//var data: NSManagedObject = myList[ip.row] as NSManagedObject
//cell.textLabel.text = data.valueForKey("name") as String
cell.textLabel.text = "Hi"
}
return cell
}
Я видел обучающие материалы на youtube, которые используют этот код, но я не могу заставить его работать.
Сначала я боролся с проблемой, связанной с моим массивом, но когда я просто вставлял в нее текст, он все равно ничего не показывает.
Я запускаю Xcode6 beta 3, но этот код действительно отлично работает в бета-версии 2.
У меня нет предупреждений или сообщений об ошибках.
EDIT: Я посмотрел на некоторые другие проекты Swift, у меня была такая же функция, и она работала 2 недели назад, но теперь она также не работает. Возможно, это проблема Xcode6 beta 3?
Мой класс имеет тип UITableViewController
.
EDIT: Я просматривал форумы разработчиков Apple и видел связанные проблемы после обновления до xCode 6 beta 3, поэтому, вероятно, проблема с xCode 6 beta 3!
EDIT: Метод не вызывается.
Ответы
Ответ 1
Получил это!
Имел ту же проблему - я также добавил tableview в uiviewcontroller, и он также не работал, но теперь я знаю проблему.
Если вы добавите tableview в конструктор интерфейса и нажмите "Добавить отсутствующие ограничения", он добавит ограничения, которые не могут работать вместе.
В моем положении у меня был табличный вид на весь мой uiview, и после нажатия "Добавить недостающие ограничения" он добавит это здесь:
![enter image description here]()
И теперь, если вы удалите одно из Trailing или Leading Alignments, оно будет работать - cellforrowatindexPath будет вызван! Не знаю, почему это так, но это сработает.
Надеюсь, я могу вам помочь.
Ответ 2
Вам нужно реализовать это, или cellForRowAtIndexPath
никогда не будет вызываться:
override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
// Return the count of the number of rows in the table
return 5
}
5
- это, конечно, пример. Вы вернете количество элементов в массиве.
Ответ 3
Похоже, что для этого нет решения. Возврат к xCode 6 beta 2 исправил проблему. Надеюсь, и, вероятно, он будет исправлен в Beta 4.
Ответ 4
Возможно, это поможет вам.
У меня есть следующее:
self.myTableView.rowHeight = 60
в функции heightForHeaderInSection: return 60
cellForRowAtIndexPath не называется
если значение value = 60 возвращается в heightForHeaderInSection, cellForRowAtIndexPath не вызывается.
Даже когда я устанавливаю self.myTableView.rowHeight = 59 (или 59 или 58), если я вернусь в heightForHeaderInSection значение >= 60, cellForRowAtIndexPath не вызывается.
Итак, я возвращаю значение <= 59 в функции heightForHeaderInSection и затем вызывается cellForRowAtIndexPath. (используйте контрольные точки в cellForRowAtIndexPath, чтобы проверить это).
Другая проблема: Если вызывается cellForRowAtIndexPath, но вы не видите строки таблицыView: это потому, что высота вашего tableView слишком короткая.
Например:
(в этом случае titulo_tabla - это UILabel, который у меня выше моей таблицы. aOrdenes - это NSArray, из которого я получаю подсчет строк, которые я показываю).
var width = self.view.frame.size.width
var height = self.view.frame.size.height
...
myTableView.frame = CGRectMake(width * 0.03, titulo_tabla.frame.origin.y + titulo_tabla.frame.height, width - 2 * (width * 0.03), 60.0 * CGFloat(aOrdenes.count) + 50)
В последнем коде последний параметр..., 60.0 * CGFloat (aOrdenes.count) + 50) 60 - это rowHeight (self.myTableView.rowHeight = 60), а 50 - это значение, возвращаемое в функции heightForHeaderInSection, При этом отображаются таблицы tableView.
Ответ 5
XCode Version 6.3.1 (6D1002) Я просто столкнулся с этой проблемой. В моем случае я дублирую UITableViewController и повторно использую его где-нибудь, вызывая эту проблему.
Мое решение
- Создать новый UITableViewController
- Дублировать только UITableViewCell
- Удалить все ограничения (не уверен, что вам это понадобится, но для меня это беспорядок)
- В моем случае "Добавить недостающие ограничения" и "Reset к ограничениям предложений" беспорядок, поэтому я вручную добавляю его.
Ничего общего с datasource btw, вы можете просто добавить некоторый контент foo к некоторой метке в ячейке для отдельной задачи.
НТН
Ответ 6
Возможно, вы объявили делегата в init:
-(instancetype)init{
self = [super init];
if(self){
_tableView.delegate = self;
,...
}
return self;
}
Должно быть вызвано это в ViewDidload:
- (void)viewDidLoad {
[super viewDidLoad];
_tableView.delegate = self;
,...
}
Ответ 7
Проверьте, есть ли у вас эти строки:
tableView.delegate = self
tableView.dataSource = self
Если dataSource = self
не реализован, это может быть причиной не cellForRowAt indexPath
метода cellForRowAt indexPath
Ответ 8
Вы должны убедиться, что источник данных правильно назначен и что вы используете правильную подпись метода. Вы указали, что некоторые опции неверны.
func tableView(tableView: UITableView!,
cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { }
Ответ 9
override func tableView(_ tableView: UITableView!,
cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { }
Я пропустил подчеркивание в качестве первого параметра tableView.
Это также вероятно нуждалось в переопределении. Вы узнаете, правильно ли вы описали функцию, если переопределение работает.
Ответ 10
У меня была такая же неприятная проблема, когда я перенес старый код Swift 2.3, разработанный в Xcode 8.2.1, в Swift 3.0 в Xcode 8.3, для меня numberOfRows получал вызов
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 2
}
но основные методы источника данных никогда не будут вызваны,
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
Основная проблема заключалась в том, что UITableView, созданный с помощью кода Swift, не был добавлен ни к одному виду, он был добавлен, но позже заменен другим видом, поэтому метод источника данных никогда не вызывался. Надеюсь, это поможет кому-то.
Ответ 11
У меня также была проблема с UITableView, я также установил источник данных и делегировал их в представление таблицы, но мой метод cellForRowAtIndexPath
не вызывался.
Решение:
-
моя сеть заблокировала мой метод (используя брандмауэр). Я попросил сетевого администратора, и мне был предоставлен полный доступ к сети, а затем был вызван мой метод cellForRowIndexPath
.
-
когда мой ответ приходит из веб-службы, из-за того, что ответ блока сети был черным, поэтому метод cellForRowIndexPath
не вызывался.