2016-11-24 1 views
0

현재 특정 하위 reddit 헤드 라인을 구문 분석하고이를 NSTableView에 표시하려고합니다. 문제는 numberOfRows 함수가 호출되고 올바른 정수를 반환하지만 tableView 대리자 함수가 호출되지 않는다는 것입니다.NSTableView 대리인 메서드가 호출되지 않습니다

코드에서 모든 것이 올바르게 연결되어있는 것을 볼 수 있습니다.

의 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 방법은 내가 이러한 확인 작업을한다.

답변

0

나는 당신의 문제가 귀하의 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가 실행 된 후 해제지고 다운로드 블록의 지역 변수입니다. 아마도 tvcdelegate 및/또는 dataSource에 저장하면 tvc이 유지되는 것으로 가정 할 수 있습니다. 그러나 그들은 그렇지 않습니다. 그들은 약한 참조입니다.

+0

완벽한, 그랬어! 고맙습니다 – Matty265

관련 문제