摘要:var scrollView :NSscrollView! //创建一个NSScrollView 控件var tableView :NSTableView! //创建一个NSTableView 控件
要实现这样效果窗体的tableView 绑定数据需要如下步骤:
1、打开Xcode,创建new Poject ,选中mas OS的APP
2、语言选择swift,Interface 选择Storyboard,下一步即可,选择create 创建
3、选中ViewController 文件
4、创建控件,一个tableView控件,一个scorllView 控件
var scrollView :NSscrollView! //创建一个NSScrollView 控件var tableView :NSTableView! //创建一个NSTableView 控件5、创建数据源
//定义学员结构struct Student{let name:Stringlet age:Intlet gender:Stringlet phone:Stringlet address:String}//创建学员数组let students=[Student(name:"jack",age:20,gender:"男",phone: "123-456",address: "北京朝阳区"),Student(name:"tom",age:20,gender:"男",phone: "123-345",address: "上海市浦东区"),Student(name:"lucy",age:20,gender:"女",phone: "012-456",address: "十堰茅箭区"),Student(name:"join",age:20,gender:"女",phone: "123-656",address: "北京朝阳区"),Student(name:"roby",age:20,gender:"男",phone: "123-666",address: "深圳天河区"),]6、当视图加载完成时调用的方法,进行初始化设置
// 当视图加载完成时调用的方法,进行初始化设置override func viewDidLoad {// 调用父类的viewDidLoad方法(必须的UIViewController生命周期方法)super.viewDidLoad// 创建滚动视图,大小与当前视图控制器的主视图相同scrollView=NSScrollView(frame: self.view.bounds)// 将滚动视图添加到主视图中self.view.addSubview(scrollView)// 创建表格视图,初始大小与滚动视图的边界相同(后续会自动调整)tableView = NSTableView.init(frame: CGRect(x: 0, y: 0, width: scrollView.bounds.size.width, height: scrollView.bounds.size.height))// 设置表格视图的委托为当前视图控制器(需实现NSTableViewDelegate协议)tableView.delegate = self// 设置表格视图的数据源为当前视图控制器(需实现NSTableViewDataSource协议)tableView.dataSource = self// 创建第一列:姓名列let fcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "fcol"))fcol.width=60 // 设置列宽fcol.title="Name" // 设置列标题tableView.addTableColumn(fcol) // 将列添加到表格视图// 创建第二列:年龄列let scol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "scol"))scol.width=50scol.title="Age"tableView.addTableColumn(scol)// 创建第三列:性别列let tcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "tcol"))tcol.width=50tcol.title="gender"tableView.addTableColumn(tcol)// 创建第四列:电话列let fhcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "fhcol"))fhcol.width=120fhcol.title="phone"tableView.addTableColumn(fhcol)// 创建第五列:地址列let shcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "shcol"))shcol.width = 200shcol.title="address"tableView.addTableColumn(shcol)// 将表格视图设置为滚动视图的内容视图(文档视图)// 这是NSScrollView显示可滚动内容的标准方式scrollView.documentView = tableView}注意,这时候
// 设置表格视图的委托为当前视图控制器(需实现NSTableViewDelegate协议)tableView.delegate = self// 设置表格视图的数据源为当前视图控制器(需实现NSTableViewDataSource协议)tableView.dataSource = self会报错,先代码注释掉或者不管它
7、扩展ViewController实现表格视图的代理和数据源协议
extension ViewController:NSTableViewDelegate,NSTableViewDataSource{// 返回表格的行数(必须实现的数据源方法)func numberOfRows(in tableView:NSTableView)->Int{return students.count // 返回学生数组的元素个数作为行数}// 为指定列和行创建单元格视图(核心的单元格生成方法)func tableView(_ tableView:NSTableView,viewFor tableColumn:NSTableColumn?,row:Int)->NSView?{let text=NSTextField // 创建基础文本显示框text.isEditable=false // 禁止文本编辑text.backgroundColor = .clear // 透明背景//获取对应行的学生数据let stu=students[row]//使用switch处理不同列的显示逻辑switch tableColumn?.identifier{case NSUserInterfaceItemIdentifier("fcol"):text.stringValue = stu.name // 姓名列case NSUserInterfaceItemIdentifier("scol"): // 年龄列text.stringValue = "\(stu.age)" // 将Int转换为Stringcase NSUserInterfaceItemIdentifier("tcol"):text.stringValue = stu.gender // 性别列case NSUserInterfaceItemIdentifier("fhcol"):text.stringValue = stu.phone // 电话列case NSUserInterfaceItemIdentifier("shcol"): // 地址列text.stringValue = stu.addressdefault:text.stringValue = "N/A" // 未知列处理}// 创建单元格容器视图let cell = NSTableCellViewcell.addSubview(text) // 将文本添加到单元格// 配置文本显示样式text.drawsBackground=false // 禁用背景绘制text.isBordered = false // 隐藏边框// 启用自动布局text.translatesAutoresizingMaskIntoConstraints=false// 添加自动布局约束(使文本居中并保持边距)// 垂直居中约束cell.addConstraint(NSLayoutConstraint(item: text, attribute: .centerY, relatedBy: .equal, toItem: cell, attribute: .centerY, multiplier: 1, constant: 0))// 左侧间距约束(距离左边13点)cell.addConstraint(NSLayoutConstraint(item: text, attribute: .left, relatedBy: .equal, toItem: cell, attribute: .left, multiplier: 1, constant: 13))// 右侧间距约束(距离右边-13点,即保留13点右边距)cell.addConstraint(NSLayoutConstraint(item: text, attribute: .right, relatedBy: .equal, toItem: cell, attribute: .right, multiplier: 1, constant: -13))return cell // 返回配置好的单元格}// 为行创建视图容器(可选实现的代理方法)func tableView(_ tableView:NSTableView,rowViewForRow row:Int)->NSTableRowView?{let rowView=NSTableRowViewrowView.isEmphasized = false // 禁用选中时的高亮强调效果return rowView}}完整代码如下:
//// ViewController.swift// mytable//// Created by 1234 on 2025/4/17.//import Cocoa//定义学员结构struct Student{let name:Stringlet age:Intlet gender:Stringlet phone:Stringlet address:String}//创建学员数组let students=[Student(name:"jack",age:20,gender:"男",phone: "123-456",address: "北京朝阳区"),Student(name:"tom",age:20,gender:"男",phone: "123-345",address: "上海市浦东区"),Student(name:"lucy",age:20,gender:"女",phone: "012-456",address: "十堰茅箭区"),Student(name:"join",age:20,gender:"女",phone: "123-656",address: "北京朝阳区"),Student(name:"roby",age:20,gender:"男",phone: "123-666",address: "深圳天河区"),]class ViewController: NSViewController {var scrollView :NSScrollView! //创建一个NSScrollView 控件var tableView :NSTableView! //创建一个NSTableView 控件// 当视图加载完成时调用的方法,进行初始化设置override func viewDidLoad {// 调用父类的viewDidLoad方法(必须的UIViewController生命周期方法)super.viewDidLoad// 创建滚动视图,大小与当前视图控制器的主视图相同scrollView=NSScrollView(frame: self.view.bounds)// 将滚动视图添加到主视图中self.view.addSubview(scrollView)// 创建表格视图,初始大小与滚动视图的边界相同(后续会自动调整)tableView = NSTableView.init(frame: CGRect(x: 0, y: 0, width: scrollView.bounds.size.width, height: scrollView.bounds.size.height))// 设置表格视图的委托为当前视图控制器(需实现NSTableViewDelegate协议)tableView.delegate = self// 设置表格视图的数据源为当前视图控制器(需实现NSTableViewDataSource协议)tableView.dataSource = self// 创建第一列:姓名列let fcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "fcol"))fcol.width=60 // 设置列宽fcol.title="Name" // 设置列标题tableView.addTableColumn(fcol) // 将列添加到表格视图// 创建第二列:年龄列let scol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "scol"))scol.width=50scol.title="Age"tableView.addTableColumn(scol)// 创建第三列:性别列let tcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "tcol"))tcol.width=50tcol.title="gender"tableView.addTableColumn(tcol)// 创建第四列:电话列let fhcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "fhcol"))fhcol.width=120fhcol.title="phone"tableView.addTableColumn(fhcol)// 创建第五列:地址列let shcol=NSTableColumn(identifier: NSUserInterfaceItemIdentifier(rawValue: "shcol"))shcol.width = 200shcol.title="address"tableView.addTableColumn(shcol)// 将表格视图设置为滚动视图的内容视图(文档视图)// 这是NSScrollView显示可滚动内容的标准方式scrollView.documentView = tableView}override var representedObject: Any? {didSet {// Update the view, if already loaded.}}}// 扩展ViewController实现表格视图的代理和数据源协议extension ViewController:NSTableViewDelegate,NSTableViewDataSource{// 返回表格的行数(必须实现的数据源方法)func numberOfRows(in tableView:NSTableView)->Int{return students.count // 返回学生数组的元素个数作为行数}// 为指定列和行创建单元格视图(核心的单元格生成方法)func tableView(_ tableView:NSTableView,viewFor tableColumn:NSTableColumn?,row:Int)->NSView?{let text=NSTextField // 创建基础文本显示框text.isEditable=false // 禁止文本编辑text.backgroundColor = .clear // 透明背景//获取对应行的学生数据let stu=students[row]//使用switch处理不同列的显示逻辑switch tableColumn?.identifier{case NSUserInterfaceItemIdentifier("fcol"):text.stringValue = stu.name // 姓名列case NSUserInterfaceItemIdentifier("scol"): // 年龄列text.stringValue = "\(stu.age)" // 将Int转换为Stringcase NSUserInterfaceItemIdentifier("tcol"):text.stringValue = stu.gender // 性别列case NSUserInterfaceItemIdentifier("fhcol"):text.stringValue = stu.phone // 电话列case NSUserInterfaceItemIdentifier("shcol"): // 地址列text.stringValue = stu.addressdefault:text.stringValue = "N/A" // 未知列处理}// 创建单元格容器视图let cell = NSTableCellViewcell.addSubview(text) // 将文本添加到单元格// 配置文本显示样式text.drawsBackground=false // 禁用背景绘制text.isBordered = false // 隐藏边框// 启用自动布局text.translatesAutoresizingMaskIntoConstraints=false// 添加自动布局约束(使文本居中并保持边距)// 垂直居中约束cell.addConstraint(NSLayoutConstraint(item: text, attribute: .centerY, relatedBy: .equal, toItem: cell, attribute: .centerY, multiplier: 1, constant: 0))// 左侧间距约束(距离左边13点)cell.addConstraint(NSLayoutConstraint(item: text, attribute: .left, relatedBy: .equal, toItem: cell, attribute: .left, multiplier: 1, constant: 13))// 右侧间距约束(距离右边-13点,即保留13点右边距)cell.addConstraint(NSLayoutConstraint(item: text, attribute: .right, relatedBy: .equal, toItem: cell, attribute: .right, multiplier: 1, constant: -13))return cell // 返回配置好的单元格}// 为行创建视图容器(可选实现的代理方法)func tableView(_ tableView:NSTableView,rowViewForRow row:Int)->NSTableRowView?{let rowView=NSTableRowViewrowView.isEmphasized = false // 禁用选中时的高亮强调效果return rowView}}来源:肖潇科技观
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!