gpt4 book ai didi

swift - NStableView 不显示我的数据

转载 作者:行者123 更新时间:2023-11-28 16:10:15 25 4
gpt4 key购买 nike

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

我将 tableColumn 标识符设置为 MainCell...我从 here 转换了 obj-c 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
}

最佳答案

将 Objective-C 直接翻译成 Swift 总是一个坏主意。

  • 首先确保 TableView 的 datasourcedelegate 都连接到 Interface Builder 中的 View Controller 。
  • 还要确保 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
    }

关于swift - NStableView 不显示我的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39666020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com