NSCollectionView ничего не рисует
Вопрос
Я пытаюсь настроить NSCollectionView
(Раньше я успешно это делал, но на этот раз по какой-то причине это не удалось).
У меня есть класс модели под названием «TestModel», и у него есть NSString
свойство, которое просто возвращает строку (сейчас только в целях тестирования).тогда у меня есть NSMutableArray
объявление свойства в моем основном классе делегата приложения, и в этот массив я добавляю экземпляры TestModel
объект.
Затем у меня есть контроллер массива, массив содержимого которого привязан к делегату приложения. NSMutableArray
.Я могу подтвердить, что до сих пор все работает нормально;НСлогигинг:
[[[arrayController arrangedObjects] objectAtIndex:0] teststring]
работал нормально.
Затем у меня есть все соответствующие привязки для настройки представления коллекции (itemPrototype и содержимое) и для элемента представления коллекции (представления).Затем у меня есть текстовое поле в представлении элемента коллекции, привязанное к представлению коллекции. Item.representedObject.teststring
.Однако, когда я запускаю приложение, НИЧЕГО не отображается в представлении коллекции, просто пустой белый экран.Что мне не хватает?
ОБНОВЛЯТЬ:Вот код, который я использую (по запросу Уилла Шипли):
// App delegate class
@interface AppController : NSObject {
NSMutableArray *objectArray;
}
@property (readwrite, retain) NSMutableArray *objectArray;
@end
@implementation AppController
@synthesize objectArray;
- (id)init
{
if (self = [super init]) {
objectArray = [[NSMutableArray alloc] init];
}
return self;
}
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
TestModel *test = [[[TestModel alloc] initWithString:@"somerandomstring"] autorelease];
if (test) [objectArray addObject:test];
}
@end
// The model class (TestModel)
@interface TestModel : NSObject {
NSString *teststring;
}
@property (readwrite, retain) NSString *teststring;
- (id)initWithString:(NSString*)customString;
@end
@implementation TestModel
@synthesize teststring;
- (id)initWithString:(NSString*)customString
{
[self setTeststring:customString];
}
- (void)dealloc
{
[teststring release];
}
@end
И затем, как я уже сказал, массив содержимого контроллера массива привязан к этому «objectArray», а содержимое NSCollectionView привязано к Array Controller.arrangedObjects.Я могу проверить, что в контроллере массива есть объекты, с помощью NSLogging [arrayController ArrangeObjects], и он возвращает правильный объект.Просто в NSCollectionView ничего не отображается.
ОБНОВЛЕНИЕ 2:Если я зарегистрирую [содержимое коллекцииView], я ничего не получу:
2009-10-21 08:02:42.385 CollViewTest[743:a0f] (
)
Проблема, вероятно, там.
ОБНОВЛЕНИЕ 3:По запросу здесь представлен проект Xcode:
http://www.mediafire.com/?mjgdzgjjfzw
Это приложение в виде меню, поэтому у него нет окон.Когда вы создадите и запустите приложение, вы увидите пункт меню с надписью «тест». Это открывает представление, содержащее NSCollectionView.
Спасибо
Решение
Проблема в том, что вы неправильно используете KVC.Есть две вещи, которые вы можете сделать.
Метод 1:Просто, но не так элегантно
- Используйте следующий код, чтобы добавить объект в массив
[[self mutableArrayValueForKey:@"objectArray"] addObject:test];
Это не так элегантно, поскольку вам придется указывать переменную, используя строковое значение, поэтому вы не получите предупреждений компилятора при неправильном написании.
Метод 2:Создайте методы KVO, необходимые для массива objectArray.
- Выберите свойство в объявлении интерфейса.
- Выберите Scripts (значок скрипта в Menubar)> Code> Поместите Decsester Decsest в буфере обмена
- Вставьте объявления в соответствующее место в файл интерфейса
- Выберите Scripts> Code> Поместите аксессуар Defs в буфер обмена
- Вставьте определения в соответствующее место в файл реализации
Затем вы можете использовать метод, который выглядит как
[self insertObject:test inObjectArrayAtIndex:0];