【问题标题】:NStableView does not show my dataNStableView 不显示我的数据
【发布时间】:2016-09-23 17:00:45
【问题描述】:

我有一个带有图像和文本字段的 tableView,但它们没有显示数据。可能缺少什么?

我将 tableColumn 标识符设置为 MainCell... 我将 obj-c 从 here 转换为 swift。

有什么建议吗?

import Cocoa

class viewTime: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

var tableContents:NSMutableArray = []

@IBOutlet var tableView: NSTableView!

override func viewDidLoad() {
    super.viewDidLoad()

    let path: NSString = "/Library/Application Support/Apple/iChat Icons/Flags"
    let fileManager:FileManager = FileManager.default
    let directoryEnum:FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path as String)!

        while let file = directoryEnum.nextObject() as? NSString{
            let filePath:NSString = path.appendingFormat("/%@", file)
            let obj:NSDictionary = ["image": NSImage(byReferencingFile:filePath as String), "name": file.deletingPathExtension]
            print("obj:\(obj)")
            tableContents.add(obj)
        }

    self.tableView.reloadData()
}

func numberOfRows(in tableView: NSTableView) -> Int {
    return tableContents.count
}


private func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView! {
    let cellView = tableView.make(withIdentifier: "MainCell", owner: self) as! NSTableCellView

    let flag:NSDictionary = tableContents[row] as! NSDictionary
    let identifier:NSString = tableColumn!.identifier as NSString

    if (identifier == "MainCell") {

        cellView.textField?.stringValue = flag["name"] as! String
        cellView.imageView!.image = flag["image"] as? NSImage
        return cellView
    }
    return nil
}

}

【问题讨论】:

  • 放置一些断点来检查数据和单元格是否都有效。
  • 在 print("obj:(obj)") 我在控制台中获取所有数据。还连接了 tableView 插座
  • 您确定连接您的MainCell 网点(textFieldimageView)吗?
  • 你是否也检查了viewForTableColumn的返回值?

标签: swift xcode cocoa tableview


【解决方案1】:

从字面上翻译 Objective-C 到 Swift 总是一个坏主意。

  • 首先确保表视图的datasourcedelegate 都连接到Interface Builder 中的视图控制器。
  • 还要确保NSTableCellView 的标识符是MainCell
  • 最重要的变化:创建一个自定义结构,它让事情变得更加容易。

    struct Asset {
      var name : String
      var image : NSImage
    }
    
  • 将数据源数组声明为struct类型的Swift Array。

     var tableContents = [Asset]()
    
  • 这是真正的 Swift 代码中的 viewDidLoad。除非编译器告诉你,否则不要注释类型。

    override func viewDidLoad() {
      super.viewDidLoad()
    
      let url = URL(fileURLWithPath:"/Library/Application Support/Apple/iChat Icons/Flags")
      let enumerator = FileManager.default.enumerator(at: url, includingPropertiesForKeys: [], options: .skipsHiddenFiles, errorHandler: nil)!
    
      for case let fileURL as URL in enumerator {
        let asset = Asset(name: fileURL.deletingPathExtension().lastPathComponent, image: NSImage(contentsOf:fileURL)!)
        tableContents.append(asset)
      }
    
      self.tableView.reloadData()
    }
    
  • numberOfRows 没问题。

  • tableView:viewForColumn:Row 可以简化为只有一个标识符和一列。

    func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
      let cellView = tableView.make(withIdentifier: "MainCell", owner: self) as! NSTableCellView
    
      let asset = tableContents[row]
    
      cellView.textField!.stringValue = asset.name
      cellView.imageView!.image = asset.image
      return cellView
    }
    

【讨论】:

  • 非常彻底。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-21
相关资源
最近更新 更多