Заполнение NSTableview от изменяемого массива

Я делал попытку этого в течение двух дней и постоянно сталкивался с тупиками.

Я был посредством Программирования Какао Aaron Hillegass для Mac OS X и сделал все соответствующие упражнения, имеющие дело с NSTableview и изменяемыми массивами, и я пытался изменить их для удовлетворения моим потребностям.

Однако ни один из них, кажется, не использует массив с объектами как источник данных, это, кажется, использует tableview в качестве источника данных.

Я пытаюсь реализовать "переделку" Jonas Jongejan своего кода здесь с фронтэндом Какао для отображения результатов.

Любые указатели или предложения, я знаю это, должны быть простыми, но я потерян в дикой местности здесь.

Я могу заполнить таблицу путем установки массива

7
задан Community 23 May 2017 в 12:13
поделиться

4 ответа

Это действительно довольно просто, если вы это поймете (конечно!). Вы не можете использовать NSArray напрямую в качестве источника таблицы. Вам нужно либо создать собственный объект, реализующий NSTableViewDataSource , либо реализовать этот протокол в каком-то существующем классе - обычно в контроллере. Если вы используете Xcode для создания стандартного приложения на основе документа, класс контроллера документа - (он будет называться MyDocument) - хороший класс для использования.

Вам необходимо реализовать, по крайней мере, эти два метода:

– numberOfRowsInTableView:
– tableView:objectValueForTableColumn:row:

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

– numberOfRowsInTableView: (NSTableView*) aTableView
{
    return [myMutableArray count];
}

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
    return [myMutableArray objectAtIndex: rowIndex];
}

Мне только что пришло в голову, что вы можете добавить два вышеуказанных метода в качестве категории в NSArray, заменив myMutableArray на self , а затем вы можете использовать массив в качестве источника данных.


В любом случае, с изменяемым массивом важно, чтобы каждый раз, когда вы его изменяли, вам нужно было сообщать табличному представлению, что оно было изменено, поэтому вам нужно отправить табличное представление -reloadData .


Если ваше табличное представление имеет более одного столбца, и вы хотите заполнить его свойствами объектов в вашем массиве, вы можете сделать уловку, чтобы упростить себе задачу.Скажем, объекты в вашем массиве являются экземплярами класса под названием Person с двумя определенными методами:

-(NSString*) givenName;
-(NSString*) familyName;

и вы хотите, чтобы в вашем табличном представлении был столбец для каждого из них, вы можете установить свойство идентификатор для в каждом столбце имя свойства в Person, которое отображается в этом столбце, и используйте что-то вроде следующего:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
{
    Person* item = [myMutableArray objectAtIndex: rowIndex];
    return [item valueForKey: [tableColumn identifier]];
}

Если вы замените valueForKey: на valueForKeyPath: и ваш класс Person также будет следующие методы:

-(Person*) mother;
-(Person*) father;
-(NSString*) fullName;  // concatenation of given name and family name

вы можете добавить столбцы таблицы с такими идентификаторами, как: имя-отца или имя-матери.family , и значения будут заполнены автоматически.

14
ответ дан 6 December 2019 в 09:57
поделиться

Вы можете пойти по маршруту источника данных и сделать всю тяжелую работу самостоятельно, или вы можете позволить привязкам делать всю тяжелую работу за вас. Добавьте NSArrayController в файл пера, в котором есть табличное представление. Убедитесь, что Владелец файла пера установлен в тот же класс, что и изменяемый массив в нем. Свяжите contentArray контроллера массива с объектом Owner.myMutableArray файла . Для каждого столбца привяжите Value к контроллеру массива sizesObjects и добавьте соответствующий путь ключа. Это позволит вам получить такие вещи, как сортировка пользователей, бесплатно, если она вам когда-либо понадобится.

3
ответ дан 6 December 2019 в 09:57
поделиться

У Apple есть полное руководство по программированию табличного представления, поэтому я предлагаю вам начать с раздела Использование источника данных таблицы этого руководства.

1
ответ дан 6 December 2019 в 09:57
поделиться

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

Возможно, установите dataSource на себя и используйте эти методы делегата для доступа к вашему массиву на основе строки и столбца #

1
ответ дан 6 December 2019 в 09:57
поделиться