不会调用NSTableView Delegate方法

时间:2016-11-24 22:59:43

标签: swift macos nstableview

我目前正在尝试从特定的subreddit解析reddit标题并在NSTableView中显示这些标题。问题是,numberOfRows函数被调用并返回正确的整数,但tableView委托函数永远不会被调用。

据我所知,代码中的所有内容都已正确连接。

的ViewController:

@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()
    }
}

TableViewController:

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方法确实有效,我检查了这些。

1 个答案:

答案 0 :(得分:1)

我认为您的问题是您的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保持活跃状态​​。但他们不是,他们是弱参考。