2016-09-23 65 views
0

我有一個tableView與圖像和textField,但他們沒有顯示數據。有什麼可能會丟失?NStableView不顯示我的數據

我將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 
} 

}

+1

把一些斷點檢查數據和細胞都是有效的。打印(「obj:\(obj)」) – Koen

+0

我得到控制檯中的所有數據。另外tableView插座連接 – Alex

+0

你確定連接你的'MainCell'插座('textField'和'imageView')嗎? –

回答

1

翻譯Objective-C的斯威夫特字面上始終是一個壞主意。

  • 首先確保兩個datasource和表格視圖delegate連接到在界面生成器視圖控制器。
  • 還需確保了NSTableCellView的標識是MainCell
  • 最重要的變化:創建一個自定義的結構,它使事情變得更輕鬆。

    struct Asset { 
        var name : String 
        var image : NSImage 
    } 
    
  • 聲明數據源數組爲Swift結構類型的數組。

    var tableContents = [Asset]() 
    
  • 這是真正的銀行代碼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 
    } 
    
+0

非常徹底。謝謝! – Alex