2017-02-26 44 views
0

我試圖以編程方式將列添加到NSTableView,我用IB定義的視圖的一部分作爲我想重用的自定義視圖控制器的一部分(並且我將自定義每個列具體使用)。以編程方式將列添加到NSTableView

我使用數據源/委託,以提供行/列的值。我將我的代碼簡化爲重現問題所需的最小代碼。

表顯示完全古怪的行爲:我創建了1000行,但只有前17〜(那些誰適合初始視口)顯示,休息,向下滾動可見的,是空的。當滾動回來時,即使是最初的那些也不見了。另外,行視圖被裁剪。

這裏是行爲的視頻: https://www.youtube.com/watch?v=toRpIfp5A6w

對於那些誰不能播放視頻,在這裏是通過滾動截圖中途。請記住,該表應該有1000行。

Table view visual errors

這裏是我的代碼。

的AppDelegate

import Cocoa 

@NSApplicationMain 
class AppDelegate: NSObject, NSApplicationDelegate { 

    @IBOutlet weak var window: NSWindow! 

    func applicationDidFinishLaunching(_ aNotification: Notification) { 
     let controller = TestViewController() 
     self.window.contentView?.addSubview(controller.view) 
     controller.view.translatesAutoresizingMaskIntoConstraints = false 
     controller.view.heightAnchor.constraint(equalTo: self.window.contentView!.heightAnchor).isActive = true 
     controller.view.widthAnchor.constraint(equalTo: self.window.contentView!.widthAnchor).isActive = true 
     controller.view.trailingAnchor.constraint(equalTo: self.window.contentView!.trailingAnchor).isActive = true 
    } 

    func applicationWillTerminate(_ aNotification: Notification) { 
    } 
} 

視圖控制器

import Cocoa 

class TestViewController: NSViewController { 

    @IBOutlet weak var tableView: NSTableView! 
    private var tableSource = TestTableSource() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let columns = self.tableView.tableColumns 
     columns.forEach { 
      self.tableView.removeTableColumn($0) 
     } 
     let column = NSTableColumn(identifier: "c1") 
     column.title = "COL1" 
     self.tableView.addTableColumn(column) 
     self.tableView.delegate = self.tableSource 
     self.tableView.dataSource = self.tableSource 
     self.tableView.reloadData() 
    } 
} 

class TestTableSource: NSObject, NSTableViewDelegate, NSTableViewDataSource { 

    let array = (0..<1000).map { "row \($0)" } 

    func numberOfRows(in tableView: NSTableView) -> Int { 
     return array.count 
    } 

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {   
     guard tableColumn?.identifier == "c1" else { fatalError() } 
     let view = NSTextField(string: array[row]) 
     return view 
    } 
} 

視圖控制器在IB

這些都是NSTableView的設置 NSTableView settings

NSTableView settings 2

就如何解決這一問題的任何建議,歡迎!

編輯:我忘了切換到基於視圖的。我上傳了新的截圖。問題仍然存在。

+0

將表視圖切換到基於視圖。 – Willeke

+0

感謝您的提示。我錯過了那一個。但切換到基於視圖後,它沒有解決問題。 – Marco83

回答

0

已解決:表視圖委託/數據源被立即釋放,因爲沒有任何內容持有對它的強引用。

由於委託是NSTableView中的弱財產,因此任何進一步獲取單元值的嘗試都將失敗。

長篇故事TestViewController被聲明爲範圍變量,然後將其視圖添加到視圖層次結構中。但由於這個視圖控制器本身沒有任何東西,所以它立即被釋放。而且由於視圖控制器是保留委託/數據源的視圖控制器,所以這也將被解除分配。

榮譽@biappi幫助我解決這個問題。

相關問題