Я делал попытку этого в течение двух дней и постоянно сталкивался с тупиками.
Я был посредством Программирования Какао Aaron Hillegass для Mac OS X и сделал все соответствующие упражнения, имеющие дело с NSTableview и изменяемыми массивами, и я пытался изменить их для удовлетворения моим потребностям.
Однако ни один из них, кажется, не использует массив с объектами как источник данных, это, кажется, использует tableview в качестве источника данных.
Я пытаюсь реализовать "переделку" Jonas Jongejan своего кода здесь с фронтэндом Какао для отображения результатов.
Любые указатели или предложения, я знаю это, должны быть простыми, но я потерян в дикой местности здесь.
Я могу заполнить таблицу путем установки массива
Это действительно довольно просто, если вы это поймете (конечно!). Вы не можете использовать 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
, и значения будут заполнены автоматически.
Вы можете пойти по маршруту источника данных и сделать всю тяжелую работу самостоятельно, или вы можете позволить привязкам делать всю тяжелую работу за вас. Добавьте NSArrayController
в файл пера, в котором есть табличное представление. Убедитесь, что Владелец файла пера установлен в тот же класс, что и изменяемый массив в нем. Свяжите contentArray
контроллера массива с объектом Owner.myMutableArray файла . Для каждого столбца привяжите
Value
к контроллеру массива sizesObjects
и добавьте соответствующий путь ключа. Это позволит вам получить такие вещи, как сортировка пользователей, бесплатно, если она вам когда-либо понадобится.
У Apple есть полное руководство по программированию табличного представления, поэтому я предлагаю вам начать с раздела Использование источника данных таблицы этого руководства.
На iPhone (я знаю, что вы говорите о Mac, но, возможно, это могло бы помочь) вы должны использовать делегирование для загрузки tableView. Он запрашивает ячейку, и вы используете свой массив для заполнения данных там, где это необходимо. Я не уверен, работает ли это для Mac, но стоит посмотреть.
Возможно, установите dataSource на себя и используйте эти методы делегата для доступа к вашему массиву на основе строки и столбца #