2017-01-31 3 views
1

Я пытаюсь заполнить свой NSTable информацией из массива объектов, но ориентирован на столбцы. Ориентация по умолчанию по умолчанию. Таким образом, каждый информационный объект представлен ряд:Столбец-ориентированные данные объекта в NSTable

row oriented object data in NSTableView

Но мне нужно представить информацию об объекте по столбцам:

column oriented object data in NSTableView

Я не понимаю, как этого добиться. Что делать, если количество столбцов является переменной во время выполнения и как показать столбец данных объекта, ориентированный? Стандартный NSDataSourceProtocol с повторным использованием клеток/взгляды не является полезным в моем случае:

func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { 

    var text: String = "" 
    var cellIdentifier: String = "" 

    guard let item = modelObjectArray?[row] else { 
    return nil 
    } 

    if tableColumn == tableView.tableColumns[0] { 
    let text = item.name 
    cellIdentifier = "someIdentifier" 
    } else if ...{ 
     ... 
    } 

    if let cell = tableView.make(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView { 
    cell.textField?.stringValue = text 
    return cell 
    } 
return nil 
} 

Любые идеи?

Спасибо!

+2

Так что я думаю, что есть два ответа здесь: 1) Построить сложный реляционный источник данных, способный заполнить вашу таблицу, и я не думаю, что вы получите ответ, и 2) используйте UICollectionView, у которого есть строки и столбцы, и, вероятно, вы хотите. Я знаю, что это немного сногсшибательно, но вы, кажется, делаете старую круглую привязку/квадратную дыру, вещь. – dylanthelion

+0

@dylanthelion, спасибо за вашу честную обратную связь (не snarky). Я как-то ожидал такого ответа, но вы знаете: надежда - это последняя смерть. Во всяком случае, я обязательно посмотрю подход CollectionView. Никогда не думал об этом. Большое спасибо. – JFS

ответ

1

Я согласен с комментариями, говорящими, что вам лучше пойти на другую архитектуру (UICollectionView может быть лучшим выбором), но просто для удовольствия попробуем реализовать ваш первоначальный запрос.

Я сделал много предположений, чтобы упростить код (как и все функции - это строки), поэтому, если вы хотите пойти на это, вы должны адаптироваться к деталям реализации.

Итак, пусть сначала создать правильную модель для вашего стола (где-то в вашем методе viewDidLoad или аналогичный):

var feat1s = [String]() 
var feat2s = [String]() 
var feat3s = [String]() 

for modelObject in modelObjects { 
    feat1s.append(modelObject.feat1) 
    feat2s.append(modelObject.feat2) 
    feat3s.append(modelObject.feat3)  
} 

Затем убедитесь, что вы вернуть правильный объект для каждой комбинации строк/столбцов:

func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { 

    let colIndex = tableView.tableColumns.index(of: tableColumn!)! 
    switch row { 
     case 0: return feat1s[colIndex] 
     case 1: return feat2s[colIndex] 
     case 2: return feat3s[colIndex] 
     default: return nil 
    } 
} 

Обратите внимание, что наш метод источника данных возвращает объекты String, а не NSTableCellView. Легче использовать привязки в Interface Builder, чтобы «связать» возвращенный объект с полем в вашем шаблоне просмотра ячейки.

Если вы абсолютно хотите, чтобы вернуть полностью отформатирован NSTableCellView я предпочел бы использовать другой метод источника данных:

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? 

Теперь, это работает, если у вас есть определенное количество объектов модели (таким образом фиксированное число столбцов) , Если вы не знаете заранее, вы можете использовать словарь массивов вместо feat1s, feat2s и т.д., и динамически добавлять новые столбцы с чем-то вроде

tableView.addTableColumn(tableColumn: NSTableColumn) 
Смежные вопросы