【发布时间】:2016-05-23 03:35:46
【问题描述】:
我有一个独立于 UIViewController 的类,设置为我的 UITableView 委托和我的 UITableViewDataSource。
我尝试初始化 UITableViewDelegate 类,然后将其分配给 UITableView。
这就是奇怪的地方......
方法 numberOfSectionsInTableView 和 tableView(:numberOfRowsInSection) 被调用五次,而 tableView(_:cellForRowAtIndexPath) 从未被调用。
我已经验证 numberOfSectionsInTableView 和 tableView(:numberOfRowsInSection) 至少返回一个值。
如果我将 UITableViewDataSource 和 UITableViewDelegate 方法移动到 ViewController,代码可以正常工作。
是什么导致了这种行为?
class MessagesViewController: UIViewController, ManagedObjectContextSettable {
var managedObjectContext: NSManagedObjectContext!
@IBOutlet var messagesTableView: UITableView!
override func viewDidLoad() {
setupMessagesTableView()
}
private func setupMessagesTableView() {
let dataSource = MessagesTableViewDataSource(managedObjectContext: managedObjectContext, conversationList: fetchedObjects as! [Conversation])
// Assume fetchedObjects is an array fetched from CoreData store. I have removed the code that defines it for the purpose of this example.
self.messagesTableView.dataSource = dataSource
self.messagesTableView.delegate = dataSource
}
}
class MessagesTableViewDataSource: NSObject, UITableViewDataSource, UITableViewDelegate {
var managedObjectContext: NSManagedObjectContext!
var conversationList: [Conversation]
required init(managedObjectContext: NSManagedObjectContext, conversationList: [Conversation]) {
self.managedObjectContext = managedObjectContext
self.conversationList = conversationList
let conversation = Conversation()
self.conversationList.append(conversation)
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.conversationList.count }
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("CellID", forIndexPath: indexPath) as UITableViewCell!
let conversation: Conversation = self.conversationList[indexPath.row]
cell.textLabel!.text = conversation.name as? String
return cell
}
}
【问题讨论】:
-
确保 self.conversationList.count 大于零。
-
是否会在后台线程中填充会话列表,并且在显示 tableView 时未填充,在这种情况下计数为零?
-
我在 DataSource 类的 init 函数中为 conversationList 添加了一个实例,专门用来避免这个问题。我已经测试了 conversationList.count 的值以确保它是 1。
-
可能不相关,但你应该使用
dequeueReusableCellWithIdentifier:forIndexPath:(有forIndexPath),因为它永远不会返回nil。您当前的代码需要处理 cell=nil。 -
谢谢你,我已经用修复编辑了上面的代码
标签: swift uitableview xcode7