Как заполнить NSTableView? - PullRequest
       5

Как заполнить NSTableView?

4 голосов
/ 02 февраля 2012

В настоящее время я заполняю NSTableView через контроллер (шаблон проектирования MVC), где я инициализирую одну запись NSMutableArray в методе init контроллера.

Как бы я:

  1. Заполните мой NSMutableArray, который является массивом объектов Person
  2. Должен ли я вместо этого заполнить NSMutableArray в моем методе mainViewDidLoad моего базового класса?Я не нашел никаких примеров или ресурсов для этого.

Модель (Person.m)

#import "Person.h"


@implementation Person

@synthesize name;
@synthesize gender;

- (id)init
{
    self = [super init];
    if (self) {
        name = @"Bob";
        gender = @"Unknown";
    }

    return self;
}

- (void)dealloc
{
    self.name = nil;
    self.gender = nil;

    [super dealloc];
}

@end

Controller (PersonController.m)

#import "PersonController.h"
#import "Person.h"


@implementation PersonController

- (id)init
{
    self = [super init];
    if (self) {
        PersonList = [[NSMutableArray alloc] init];
//        [personList addObject:[[Person alloc] init]];
//        
//        [personTable reloadData];
    }

    return self;
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return [personList count];
}

- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    Person *person = [personList objectAtIndex:row];
    NSString *identifier = [tableColumn identifier];

    return [person valueForKey:identifier];
}

- (void)dealloc
{
    [super dealloc];
}

@end

Базовый файл (Main.h):

#import "Main.h"

@implementation Main

- (void)mainViewDidLoad
{

}

@end

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Как бы мне:

  • Заполнить мой NSMutableArray, который является массивом объектов Person

Шаг 1: Создать объекты Person.

Шаг 2: Добавьте их в массив.

Ваш закомментированный код делает именно это, хотя вам, вероятно, следует создать Person отдельно в случае, если вы хотите его настроить (например, установите его имя).

Должен ли я вместо этого заполнить NSMutableArray в моем методе mainViewDidLoad моего базового класса?

На самом деле не имеет значения, как далекодо того, как пользователь увидит вашу модель, вы создадите ее, но концептуально она мне как-то пахнет.Он не имеет никакого отношения к представлению, поэтому я говорю, что он принадлежит к init.

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

1 голос
/ 02 февраля 2012

Необязательно, ваш закомментированный код в PersonController выглядит правильно. Я предполагаю, что NSTableRow имеет правильный идентификатор. Единственная проблема в том, что ваш объект person пуст, поэтому нет строк для отображения. Могу поспорить, что произошло то, что ваша строка пыталась отобразить ноль в первой строке и вместо этого отображала пустые строки. Работает ли создание объекта person, установка полей имени и пола, а затем помещение его в NSMutableArray и вызов reloadData (в основном, что делает ваш закомментированный код, за исключением того, что теперь вы предоставляете некоторые реальные данные для отображения)?

0 голосов
/ 02 февраля 2012

Хорошо, я предполагаю, что ваш контроллер имеет свойство IBOutlet NSTableView * personTable, которое связано в конструкторе интерфейса?

Кроме того, в интерфейсе контроллера должен быть объявлен протокол, но опять же, посколькуРеализация контроллера имеет соответствующие методы, я предполагаю, что вы также правильно настроили это.

Еще одна деталь, правильно ли были установлены идентификаторы столбцов таблицы в конструкторе интерфейса?Из этого примера мне не ясно, как идентификаторы столбца связаны со свойствами человека (имя и пол).Не должен ли массив personList содержать объекты словаря, где объектом словаря является персона, а ключ словаря соответствует идентификатору столбца, который вы задали в конструкторе интерфейса?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...