2017-02-26 96 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帮助我解决这个问题。

相关问题