我目前正试图从一个特定的子reddit解析reddit标题,并将其显示在一个NSTableView中。问题是,numberOfRows
函数被调用并返回正确的整数,但是tableView
委托函数从未被调用。
据我所知,代码中的所有内容都连接正确。
视图控制器:
@IBOutlet weak var tableView: NSTableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
Downloader.load(url: URL(string: "https://www.reddit.com/r/" + "gaming" + ".json")!){
(result) in
let tvc = TableViewController(data: result)
self.tableView.delegate = tvc
self.tableView.dataSource = tvc
self.tableView.reloadData()
}
}
表视图控制器:
class TableViewController: NSObject{
var json: JSON!
init(data: JSON) {
super.init()
self.json = data
}
}
extension TableViewController : NSTableViewDataSource {
func numberOfRows(in tableView: NSTableView) -> Int {
return JSONFormatController.getTitlesFrom(json: json).count
}
}
extension TableViewController : NSTableViewDelegate {
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
var titles = JSONFormatController.getTitlesFrom(json: json)
if let cell = tableView.make(withIdentifier: "entry", owner: nil) as? NSTableCellView {
cell.textField?.stringValue = titles[row]
return cell
} else {
return nil
}
}
}
result
变量和getTitlesFrom
方法确实有效,我检查了这些。 最佳答案
我认为您的问题是您的TableViewController
对象正在被释放,因为您没有保留对它的引用。试试这个:
@IBOutlet weak var tableView: NSTableView!
var tvc : TableViewController!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
Downloader.load(url: URL(string: "https://www.reddit.com/r/" + "gaming" + ".json")!){
(result) in
self.tvc = TableViewController(data: result)
self.tableView.delegate = self.tvc
self.tableView.dataSource = self.tvc
self.tableView.reloadData()
}
}
说明:
tvc
是下载块的一个局部变量,它在执行后被释放。想必您的假设是,将tvc
存储在delegate
和/或dataSource
中可以保持tvc
的活性。但他们不是,他们是弱参考。关于swift - NSTableView Delegate方法不会被调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40795545/