我正在尝试用结构填充NSTableView
。该结构正在从Firebase获取其数据。我已经尝试过在iOS
中复制它的方式,但我还没有完全做到。
var orders = [OrderModel]()
struct OrderModel {
var order: String!
var name: String?
var adress: String?
var email: String?
}
从Firebase读取:
ref?.child("orders").observe( .childAdded, with: { (snapshot) in
let dict = snapshot.value as? [String : AnyObject] ?? [:]
let newData = OrderModel(order: dict["order"] as? String, name: dict["name"] as? String, adress: dict["adress"] as? String, email: dict["email"] as? String
self.orders.append(newData)
})
填充NSTableView
:
func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
guard let userCell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "ordersCell"), owner: self) as? OrdersTableViewCell else { return nil }
//the object
let order: OrderModel
//getting the object of selected position
order = orders[row] //Error index out of range
userCell.orderLabel.stringValue = order.order ?? "Error getting order"
userCell.nameLabel.stringValue = order.name ?? "Error getting name"
userCell.adressLabel.stringValue = order.adress ?? "Error getting address"
return userCell
}
我不知道这里唯一的问题是否是这条线:
order=orders[row]//错误索引超出范围
但这就是我现在的处境。
与macOS中的iOS不同,有一种更复杂的方法来填充表视图:Cocoa Bindings。由于您对所有数据只使用一个单元格视图,因此这是优选的。
-
首先使结构成为从
NSObject
继承的类@objcMembers class OrderModel : NSObject { dynamic var order: String? dynamic var name: String? dynamic var adress: String? dynamic var email: String? init(order : String?, name : String?, adress : String?, email : String?) { self.order = order self.name = name self.adress = adress self.email = email } }
-
删除整个方法
tableView: viewFor: row:
-
视图控制器采用
NSTableViewDataSource
和NSTableViewDelegate
-
在视图控制器中实现这两种方法
func numberOfRows(in tableView: NSTableView) -> Int { return orders.count } func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { return orders[row] }
-
在项目导航中选择情节提要或xib
-
删除表格单元格视图的标识符
-
选择表格视图(而不是滚动视图!(,按⌥د7打开连接检查器,并将
dataSource
和delegate
连接(控制拖动(到视图控制器 -
在表格单元格视图中选择顺序文本字段。请确保是文本字段。
-
按⌥\ 8打开绑定检查器
-
点击
Value
旁边的披露三角形 -
检查
Bind To
->Table Cell View
-
在模型密钥路径中,输入
objectValue.order
-
在其他文本字段中执行相同操作(分别用其他属性替换
order
( -
在视图控制器中,从Firebase接收数据后,在主线程上的闭包内重新加载表视图
self.orders.append(newData) DispatchQueue.main.async { self.tableView.reloadData() }