在UITableView单元中加载UITableView的最佳方法是什么?

时间:2016-04-09 14:34:50

标签: ios swift uitableview ios8

我的偶然尝试不是在呼叫cellForRowAtIndexPath。我假设我的设置不对。

let wordTableView        = WordTableView(frame: CGRectZero)
wordTableView.delegate   = self
wordTableView.dataSource = self
wordTableView.words      = words
let currentCell = wordTableView.cellForRowAtIndexPath(indexPath)
cell.contentView.addSubview(wordTableView)
wordTableView.viewDidLoad()
wordTableView.reloadData()

当我运行它时,我的UITableView的viewDidLoad()被调用。但没有任何实际负载。如果我查看Debug View Hierarchy,我可以看到没有添加任何内容。所以我假设我遗漏了一些特别关于实例化这个tableView的东西。

供参考,这是我的UITableView。但说实话,我完全猜测UITableView究竟需要实例化什么。这将是我最好的尝试:

class WordTableView: UITableView {

    var words = [Word]()

    func viewDidLoad() {
        self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell")
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return words.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("WordCell", forIndexPath: indexPath) as! WordCell

        let word = words[indexPath.row]
        cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit")
        cell.definition.text = "Definition" // word.valueForKey("definition")

        return cell
    }
}

2 个答案:

答案 0 :(得分:1)

您设置wordTableView数据源并委托给setter类,因此不会在WordTableView类中调用表视图数据源和委托函数。
既然你说过调用了viewDidLoad,那么让我们在这个函数中设置委托。

let wordTableView = WordTableView(frame: CGRectZero)
wordTableView.words = words
let currentCell = wordTableView.cellForRowAtIndexPath(indexPath)
cell.contentView.addSubview(wordTableView)
wordTableView.viewDidLoad()
wordTableView.reloadData()

WordTableView

class WordTableView: UITableView, UITableViewDelegate, UITableViewDataSource {

    var words = [Word]()

    func viewDidLoad() {
        self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell")
        self.delegate = self
        self.dataSource = self
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return words.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("WordCell", forIndexPath: indexPath) as! WordCell

        let word = words[indexPath.row]
        cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit")
        cell.definition.text = "Definition" // word.valueForKey("definition")

        return cell
    }
}

作为旁注,您不应直接致电viewDidLoad(),最好让WordTableView继承UIViewController并将您的表格视图放入其中。

答案 1 :(得分:1)

我认为你的viewDidLoad是被调用的,因为你是明确地这样做的,但你的框架是CGRectZero,所以它在技术上没有大小,所以没有什么可以添加为subView,所以没有任何东西被调用。

我认为初始化表格视图的更好方法是创建自己的初始化程序,例如

class WordTableView: UITableView {

var words = [Word]()

init(frame: CGRect, wordArray: [Word], delegate: UITableViewDelegate, dataSource: UITableViewDataSource) {
    self.frame = frame
    words = wordArray
    self.delegate = delegate
    self.dataSource = dataSource 
    self.reloadData()
}

func viewDidLoad() {
    self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell")
}

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return words.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("WordCell", forIndexPath: indexPath) as! WordCell

    let word = words[indexPath.row]
    cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit")
    cell.definition.text = "Definition" // word.valueForKey("definition")

    return cell
}

}

然后在你的设置中:

let wordTableView = WordTableView(frame: cell.contentView.bounds, wordArray: words, delegate: self, dataSource: self)
let currentCell = wordTableView.cellForRowAtIndexPath(indexPath)
cell.contentView.addSubview(wordTableView)
cell.setNeedsDisplay()