如何在Xcode 10.1中创建使用NSTableView?含连接问题与增删刷新
NSTableView 连接问题及增删刷新操作指南
一、获取嵌套在 NSScrollView 中的 NSTableView
在 Cocoa 框架中,拖拽 NSTableView 到窗口时,系统会自动将其包裹在 NSScrollView 内,所以直接连线会得到 NSScrollView 实例。可通过以下两种方式获取内部的 NSTableView:
1. 代码方式获取(纯代码创建场景)
如果完全通过代码搭建视图层级:
// 假设已创建 scrollView 实例 if let tableView = scrollView.documentView as? NSTableView { // 配置代理与数据源 tableView.delegate = self tableView.dataSource = self // 后续可进行列配置等操作 }
2. XIB 中手动选择子视图(非 Storyboard 场景)
- 打开 XIB 文件,在右侧 Document Outline 面板展开 NSScrollView 的层级结构
- 找到嵌套在内的 NSTableView,直接拖拽到你的视图控制器类中创建 IBOutlet 连线
二、NSTableView 插入、删除与刷新方法
操作前需确保已正确设置 NSTableViewDataSource 代理,并维护好对应的数据源数组(例如 var dataSource: [String] = [])
1. 插入行
// 1. 先更新数据源 dataSource.insert("新条目", at: 0) // 2. 通知表格插入指定行 tableView.insertRows(at: IndexSet(integer: 0), withAnimation: .effectFade)
IndexSet支持指定多个行索引,例如IndexSet(integersIn: 0..<3)可插入多行- 动画参数可传
.none取消动画效果
2. 删除行
// 1. 先更新数据源 guard !dataSource.isEmpty else { return } dataSource.remove(at: 0) // 2. 通知表格删除指定行 tableView.removeRows(at: IndexSet(integer: 0), withAnimation: .effectFade)
注意:必须先修改数据源,再调用表格的删除方法,否则会因数据不一致导致崩溃
3. 刷新表格
刷新全部行
tableView.reloadData()
刷新指定行/列
// 刷新索引为 0、2 的行,且仅刷新第一列 tableView.reloadData(forRowIndexes: IndexSet([0, 2]), columnIndexes: IndexSet(integer: 0))
- 若需刷新所有列,可传入
IndexSet(integersIn: 0..<tableView.numberOfColumns)
三、纯代码创建 NSTableView 基础示例
如果完全不使用 XIB,可参考以下代码搭建基础表格:
class YourViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate { private var dataSource: [String] = ["条目1", "条目2", "条目3"] private var tableView: NSTableView! override func viewDidLoad() { super.viewDidLoad() // 创建滚动视图 let scrollView = NSScrollView(frame: view.bounds) scrollView.autoresizingMask = [.width, .height] view.addSubview(scrollView) // 创建表格视图 tableView = NSTableView(frame: scrollView.bounds) tableView.autoresizingMask = [.width, .height] tableView.dataSource = self tableView.delegate = self // 添加表格列 let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "ContentColumn")) column.title = "内容" tableView.addTableColumn(column) // 将表格绑定到滚动视图 scrollView.documentView = tableView } // MARK: - NSTableViewDataSource func numberOfRows(in tableView: NSTableView) -> Int { return dataSource.count } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { return dataSource[row] } }
内容的提问来源于stack exchange,提问作者user20295456
相关产品推荐
相关产品推荐

