我有一个带有图像和textField的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
}
}
答案 0 :(得分:1)
将Objective-C翻译成Swift字面意思总是一个坏主意。
datasource
和delegate
都连接到Interface Builder中的视图控制器。NSTableCellView
的标识符为MainCell
最重要的更改:创建自定义结构,使事情变得更加容易。
struct Asset {
var name : String
var image : NSImage
}
将数据源数组声明为结构类型的Swift数组。
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
}