使用结构填充NSTableView



我正在尝试用结构填充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:

  • 视图控制器采用NSTableViewDataSourceNSTableViewDelegate

  • 在视图控制器中实现这两种方法

    func numberOfRows(in tableView: NSTableView) -> Int
    {
    return orders.count
    }
    func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? {
    return orders[row]
    }
    
  • 在项目导航中选择情节提要或xib

  • 删除表格单元格视图的标识符

  • 选择表格视图(而不是滚动视图!(,按⌥د7打开连接检查器,并将dataSourcedelegate连接(控制拖动(到视图控制器

  • 在表格单元格视图中选择顺序文本字段。请确保是文本字段

  • ⌥\ 8打开绑定检查器

  • 点击Value旁边的披露三角形

  • 检查Bind To->Table Cell View

  • 模型密钥路径中,输入objectValue.order

  • 在其他文本字段中执行相同操作(分别用其他属性替换order(

  • 在视图控制器中,从Firebase接收数据后,在主线程上的闭包内重新加载表视图

    self.orders.append(newData)
    DispatchQueue.main.async { self.tableView.reloadData() }
    

相关内容

  • 没有找到相关文章

最新更新