我有一个单独的类来自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
}
}
答案 0 :(得分:1)
问题是您的MessagesTableViewDataSource实例被取消分配。 UITableView上的delegate和dataSource属性很弱。您将数据源(MessagesTableViewDataSource)声明为函数内的局部变量,因此没有任何对MessagesTableViewDataSource实例的强引用。
要解决此问题,请为dataSource定义一个实例变量,并在viewDidLoad中指定它。
示例代码:
类MessagesViewController:UIViewController,ManagedObjectContextSettable {
let dataSource: MessagesTableViewDataSource?
var managedObjectContext: NSManagedObjectContext!
@IBOutlet var messagesTableView: UITableView!
override func viewDidLoad() {
setupMessagesTableView()
}
private func setupMessagesTableView() {
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
}
}
答案 1 :(得分:0)
检查表格视图的框架。如果高度或宽度为0,则不会调用tableView:cellForRowAtIndexPath:
。
答案 2 :(得分:0)
我有同样的问题,我相信这是UIKit中的一个错误。
我创建了一个简单的列表数据源和一个小视图控制器来测试它,我可以确认cellForRowAtIndexPath
没有被调用。 ' numberOfRowsInSection'返回一个大于0的值,并且tableView的框架设置正确。
放入视图控制器时,相同的代码可以正常工作。也许我在这里遗漏了一些东西,但我认为这是苹果公司的一个错误。
<强> SimpleListDataSource.swift 强>
import UIKit
class SimpleListDataSource : NSObject, UITableViewDataSource {
var items: [String]
var cellIdentifier: String
typealias CellConfiguration = (UITableViewCell, String) -> ()
var cellConfiguration: CellConfiguration
init(items: [String], cellIdentifier: String, cellConfiguration: CellConfiguration) {
self.items = items
self.cellIdentifier = cellIdentifier
self.cellConfiguration = cellConfiguration
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("Number of rows: \(self.items.count)")
return self.items.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
print(__FUNCTION__)
let cell = tableView.dequeueReusableCellWithIdentifier(self.cellIdentifier, forIndexPath: indexPath)
self.cellConfiguration(cell, self.items[indexPath.row])
return cell
}
}
<强> ViewController.swift 强>
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let data = ["a", "b", "c"]
let dataSource = SimpleListDataSource(items: data, cellIdentifier: "cell") { (cell, string) -> () in
cell.textLabel?.text = string
}
self.tableView.dataSource = dataSource
self.tableView.reloadData()
}
}