Метод 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 не вызывался.