2017-02-26 2 views
0

再利用したいカスタムビューコントローラの一部としてIBで定義したビューの一部であるNSTableViewにプログラムで列を追加しようとしています(各列をカスタマイズします特定の用途)。プログラムでNSTableViewに列を追加する

私は行/列の値を提供するためにデータソース/デリゲートを使用しています。私は問題を再現するのに必要な最小限のコードに自分のコードを単純化しました。

テーブルは完全に不気味な動作を示します:私は1000の行を作成しますが、最初の〜17人だけが表示され、残りの部分はスクロールして表示されます。バックアップをスクロールすると、最初のものも消えてしまいます。さらに、行ビューは切り取られます。ここでは、ビデオを再生することができない人のために https://www.youtube.com/watch?v=toRpIfp5A6w

スクロールを通じてスクリーンショットハーフ方法です:

は、ここでの行動のビデオです。テーブルは1000行あるはずです。

Table view visual errors

ここに私のコードです。 IBで

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 
    } 
} 

ビューコントローラ

これらは、NSTableViewの設定 です

NSTableView settings 2

問題に対処する方法上の任意の提案は大歓迎です!

EDIT:ビューベースに切り替えるのを忘れました。私は新しいスクリーンショットをアップロードしました。まだ問題は残っています。

+0

テーブルビューをビューベースに切り替えます。 – Willeke

+0

チップをありがとう。私はそれを逃した。しかし、ビューベースに切り替えると、問題は解決されませんでした。 – Marco83

答えて

0

解決済み:テーブルビューの委任/データソースは、何も参照されていないためすぐに割り当てが解除されました。

デリゲートが弱いプロパティNSTableViewであるため、セルの値を取得しようとするとそれ以上の試みは失敗します。

ロングストーリーTestViewControllerがスコープ変数として宣言され、そのビューがビュー階層に追加されました。しかし、このビューコントローラ自体は何も保持していなかったので、すぐに割り当てが解除されました。また、ビューコントローラはデリゲート/データソースを保持しているので、これも割り当て解除されます。

お名前:@biappi私はこれを整理するのを手伝ってくれました。

関連する問題