再利用したいカスタムビューコントローラの一部としてIBで定義したビューの一部であるNSTableView
にプログラムで列を追加しようとしています(各列をカスタマイズします特定の用途)。プログラムでNSTableViewに列を追加する
私は行/列の値を提供するためにデータソース/デリゲートを使用しています。私は問題を再現するのに必要な最小限のコードに自分のコードを単純化しました。
テーブルは完全に不気味な動作を示します:私は1000の行を作成しますが、最初の〜17人だけが表示され、残りの部分はスクロールして表示されます。バックアップをスクロールすると、最初のものも消えてしまいます。さらに、行ビューは切り取られます。ここでは、ビデオを再生することができない人のために https://www.youtube.com/watch?v=toRpIfp5A6w
スクロールを通じてスクリーンショットハーフ方法です:
は、ここでの行動のビデオです。テーブルは1000行あるはずです。
ここに私のコードです。 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の設定 です
と
問題に対処する方法上の任意の提案は大歓迎です!
EDIT:ビューベースに切り替えるのを忘れました。私は新しいスクリーンショットをアップロードしました。まだ問題は残っています。
テーブルビューをビューベースに切り替えます。 – Willeke
チップをありがとう。私はそれを逃した。しかし、ビューベースに切り替えると、問題は解決されませんでした。 – Marco83