2016-09-23 1 views
0

У меня есть tableView с изображением и текстовым полем, но они не отображают данные. Что может быть пропало?NStableView не показывает мои данные

У меня есть идентификатор столбца, установленный как MainCell ... Я преобразовал obj-c из here в быстрый.

Любые предложения?

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

Put в некоторых контрольных точках, чтобы проверить данные и клетка корректные. – Koen

+0

at print ("obj: \ (obj)") Я получаю все данные в консоли. Также подключена розетка tableView. – Alex

+0

Вы не забыли подключить свои выходы 'MainCell' (' textField' и 'imageView')? –

ответ

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 
    } 
    
+0

очень тщательный. Спасибо! – Alex

 Смежные вопросы

  • Нет связанных вопросов^_^