Итак, я прочитал article по адресу objc.io о функциональных TableViewControllers. Звучит и выглядит чистым, поэтому я должен был попробовать.Общий UITableViewController в Swift компилирует, но не перезагружает свои данные
import Foundation
import UIKit
class TableViewController<A>: UITableViewController {
override init(style: UITableViewStyle) {
super.init(style: style)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
var data: [A] = [] {
didSet { self.tableView.reloadData() }
}
var configureCell: (UITableViewCell, A) ->() = { _ in() }
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
configureCell(cell, data[indexPath.row])
return cell
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.data.count
}
}
Это компилируется просто отлично. Я инициализирую его i следующим кодом.
let controller = TableViewController<String>(style: .Plain)
controller.configureCell = { (cell:UITableViewCell, data:String) in
cell.textLabel?.text = data
}
controller.data = ["1", "2"]
Но numberOfRowsInSection
никогда не вызывается (и для этого ни cellForRowAtIndexPath
). didSet { self.tableView.reloadData() }
, однако, называется.
Я также проверил, что tableView
имеет свои данные. Источник и делегат сидят правильно.
Итак, если я удалю это <A>
в объявлении класса и заменим все остальные String
. Он работает отлично.
Любые идеи в чем-то не так?
Привет, Крис. Проверьте мой ответ в этом сообщении. – dimpiax
См. Также: http://www.objc.io/snippets/22.html –
«Любой» не замаскирован как общий. Не выглядит красиво. – dimpiax