2016-09-23 7 views
0

私は画像とtextFieldを持つtableViewを持っていますが、データを表示していません。何が失われる可能性がありますか?NStableViewは自分のデータを表示しません

私はtableColumn識別子をMainCellとして設定しています... obj-cをhereからswiftに変換しました。

提案がありますか?スウィフトへのObjective-Cの翻訳

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

。 – Koen

+0

at print( "obj:\(obj)")コンソールにすべてのデータを取得します。また、tableViewコンセントが – Alex

+0

に接続されていますか? 'MainCell'アウトレット(' textField'と 'imageView')を確実に接続しましたか? –

答えて

1

文字通り常に悪い考えです。

  • まず第一には、テーブルビューの両方datasourcedelegateは、Interface Builderでビューコントローラに接続されていることを確認してください。
  • NSTableCellViewの識別子がMainCell
  • 最も重要な変更であることも確認してください:カスタム構造体を作成し、それは物事は​​そんなに簡単になります。

    struct Asset { 
        var name : String 
        var image : NSImage 
    } 
    
  • 構造体タイプのデータ・ソース・アレイとしてスウィフト配列を宣言する。

    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はOKです。

  • tableView:viewForColumn:Rowは、1つの識別子と1つの列が存在するため、簡略化できます。データとセルがすべて有効であるかどうかを確認するためにいくつかのブレークポイントに入れて

    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

関連する問題