Таблица не обновляется в соответствии с привязками - PullRequest
0 голосов
/ 26 августа 2009

Это очень новый вопрос, и я уже много раз делал это раньше, но в этот раз мне чего-то не хватает.

В моем файле AppDelegate.h я объявляю NSArray и устанавливаю его как свойство:

@interface AppDelegate : NSObject {
NSArray *lines;

}

@property(readwrite, retain) NSArray *lines;
@end

А затем в файле AppDelegate.m в методе awakeFromNib я выделяю его:

lines = [[NSArray alloc] init];

Тогда у меня есть метод, который устанавливает массив строк:

NSString *fileContents = [NSString stringWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/sometextfile.txt"] encoding:NSUTF8StringEncoding error:NULL];
lines = [fileContents componentsSeparatedByString:@"\n"];

У меня есть контроллер массива, привязанный к AppDelegate.self.lines, затем столбец таблицы привязан к Array Controller.arrangedObjects. Я могу подтвердить, что массив обновляется (тестируется с использованием NSLog), однако содержимое таблицы не обновляется (оно остается пустым).

Есть ли что-то очевидное, что я здесь упускаю?

Ответы [ 3 ]

4 голосов
/ 27 августа 2009

Вам не нужен источник данных, если вы используете привязки. Один или другой.

У меня есть контроллер массива, связанный с "AppDelegate.self.lines" ...

Почему self?

@ свойство (перезаписать, сохранить) NSArray * lines;

Нет, используйте copy здесь. В противном случае вы обнаружите, что сохраняете чей-либо изменяемый массив, который затем будет мутировать. Тогда «ваш» массив изменится без вашего ведома.

Тогда у меня есть метод, который устанавливает массив строк:

lines = [fileContents componentsSeparatedByString:@"\n"];

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

Хуже того, вы теряете старый массив (поскольку вы просто присваиваете ему, не освобождая его) и недостаточно сохраняете этот новый массив. Поскольку вы не сохраняете новый массив, эта переменная экземпляра вскоре будет содержать мертвый объект. Автоматическое сохранение выполняется методом setLines:, который вызывается только при его вызове.

Вам необходимо пройти через свойство:

self.lines = [fileContents componentsSeparatedByString:@"\n"];

Доступ к свойству - это неявное сообщение доступа, поэтому оно сохраняет массив (или копирует его, как только вы исправите @property, как я предлагал выше), и отправляет уведомления KVO.

2 голосов
/ 26 августа 2009

Когда вы говорите, что к столбцу привязаны упорядоченные объекты, значит, вы установили источник данных tablview? Если нет, вы должны установить источник данных tableview в массив строк

0 голосов
/ 26 августа 2009

Возможно, вы захотите прочитать это , у него есть несколько хороших диаграмм и объяснений. То, что говорит ennuikiller, правильно, я думаю, это проблема с вашим источником данных. Это делается по телефону

[aTable setDelegate:aDelegate];
...