2016-03-15 3 views
0

По какой-то причине функция tableload reloadData вызывается, несмотря на то, что функция cellForRowAtIndexPath не вызывается. Я разместил полный код ниже. В двух словах, используя видео в качестве источника данных, каждый раз, когда изменяются значения видео, таблица перезагружает свои данные. Я подтвердил, что эта часть функциональности работает так, как я ее отлаживал, и количество видео выводится каждый раз, когда происходит эта функция. Несмотря на это, cellForRowAtIndexPath не может быть вызван даже один раз.UITAbleview Cell для строки в указателе не указан

import Foundation 
import UIKit 
import ReactiveCocoa 
import enum Result.NoError 
public typealias NoError = Result.NoError 

public class VideosTable: UITableView, UITableViewDataSource, UITableViewDelegate { 
// MARK: Public variables 
public var currentVideo: Video! 

// MARK: Private variables 
private let videos = MutableProperty<[Video]?>(nil) 
private let cellId = "cell" 

// MARK Initializers 
public required init(signal: Signal<[Video]?, NoError>, frame: CGRect) { 
    super.init(frame: frame, style: .Plain) 
    self.dataSource = self 
    self.delegate = self 
    self.registerClass(UITableViewCell.self, forCellReuseIdentifier: cellId) 
    videos <~ signal 
    videos.signal.observeNext{_ in 
     self.reloadData() 
    } 
} 

    videos <~ signal 
    videos.signal.observeNext{_ in 
     print("values changed") 
     self.reloadData() 
    } 
} 
public required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

// MARK: DataSource 
public func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    let videoCount = videos.value?.count ?? 0 
    print("Video Count: \(videoCount)") 
    return videoCount 
} 
public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = self.dequeueReusableCellWithIdentifier(cellId) ?? UITableViewCell() 
    cell.textLabel?.text = videos.value![indexPath.row].title 
    return cell 
} 
public func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60.0 
} 

// MARK: Delegate 
public func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    print("User selected row at \(indexPath.row)") 
    currentVideo = videos.value![indexPath.row] 
} 

}

+0

Вместо этого вы должны использовать контроллер (таблицы), чтобы обращаться с такими вещами. Если вам нужно, найдите некоторые обучающие материалы MVC. – Eendje

+0

На самом деле я использую TableViewController, который содержит таблицу, а именно эту внутри одной из своих ячеек. –

ответ

2

проблема была решена. Вышеприведенный код на самом деле все правильно, это было в другой части приложения, которая вызывала ошибку. В принципе, таблица не была правильно добавлена ​​в иерархию представлений, и поэтому CellForRow не вызывался, а tableReload был. Аналогично, высота таблицы была фактически нулевой после инициализации и оставалась равной нулю. Если высота каждого TableCell, определяемая обратным вызовом, heightForRowAtIndexPath превышает высоту таблицы, CellForRow никогда не будет вызываться.