7

Próbuję skonfigurować NSCollectionView (robiłem to z powodzeniem w przeszłości, ale z jakiegoś powodu nie udało się tym razem).NSCollectionView niczego nie rysuje

Mam klasę modelu o nazwie "TestModel" i ma ona właściwość NSString, która właśnie zwraca ciąg znaków (tylko do celów testowych w tej chwili). Następnie mam deklarację właściwości NSMutableArray w mojej głównej klasie delegatów aplikacji i do tej tablicy dodajemy instancje obiektu TestModel.

Mam wtedy kontroler macierzy, który ma układ zawartości związany z delegatem aplikacji NSMutableArray. Mogę potwierdzić, że wszystko do tej pory działa dobrze; NSLogging:

[[[arrayController arrangedObjects] objectAtIndex:0] teststring] 

działało.

Mam wtedy wszystkie odpowiednie powiązania dla skonfigurowanego widoku kolekcji (itemPrototype i content) oraz dla elementu View kolekcji (view). Następnie mam pole tekstowe w widoku elementu kolekcji, które jest powiązane z widokiem kolekcji Item.representedObject.teststring. Jednak nic nie wyświetla się w widoku kolekcji po uruchomieniu aplikacji, tylko pusty biały ekran. czego mi brakuje?

UPDATE: Oto kod używam (wniosek wil Shipley):

// 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 

A potem jak powiedziałem zawartość tablicy kontroler macierzy jest związany z tym „objectArray”, a Zawartość NSCollectionView jest powiązana z Array Controller.arrangedObjects. Mogę sprawdzić, czy kontroler macierzy ma w nim obiekty, NSLogging [arrayController arranObjects], i zwraca poprawny obiekt. To po prostu nic nie wyświetla w NSCollectionView.

UPDATE 2: Jeżeli Loguję [treść CollectionView] mam nic:

2009-10-21 08:02:42.385 CollViewTest[743:a0f] (
) 

Problemem jest prawdopodobnie tam.

UPDATE 3: Zgodnie z życzeniem tutaj jest projekt Xcode:

http://www.mediafire.com/?mjgdzgjjfzw

Jest to aplikacja paska menu, więc nie ma okna. Kiedy tworzysz i uruchamiasz aplikację, zobaczysz pasek menu z napisem "test", otwiera widok zawierający NSCollectionView.

Dzięki

+0

Jak zmodyfikować zmienny tablicę w delegata? Czy możesz napisać kod? –

+0

Edytowałem wpis i dodałem kod, którego używam. – indragie

+0

Kod, który wysłałeś, nie mówi nam nic o tym, czy twoje powiązania są poprawnie połączone. Musisz opublikować projekt gdzieś. – NSResponder

Odpowiedz

4

Problem polega na tym, że nieprawidłowo używasz KVC. Są dwie rzeczy, które możesz zrobić.

Metoda 1: Proste, ale nie tak eleganckie

  1. użyć następującego kodu, aby dodać obiekt do tablicy

[[self mutableArrayValueForKey: @ "objectArray"] addObject: test];

To nie jest takie eleganckie, ponieważ musisz podać zmienną za pomocą wartości ciągu, więc nie otrzymasz ostrzeżeń kompilatora, gdy pisownia jest niepoprawna.

Metoda 2: Wygeneruj metody KVO potrzebne dla tablicy "objectArray".

  1. Wybierz nieruchomości w swoim oświadczeniu interfejsu
  2. Wybierz Scripts (ikonę skryptu w pasku menu)> kod> Umieść dostępowe decls na Schowka
  3. Wklej deklaracji w odpowiednim miejscu w pliku interfejsu
  4. Wybierz Skrypty> Kod> Place dostępowe defs w schowku
  5. Wklej definicje w odpowiednim miejscu w pliku implementacji

Następnie można użyć metody, która wygląda jak

[self insertObject:test inObjectArrayAtIndex:0]; 
+1

Jeśli martwisz się o przekazywanie wartości łańcuchowych (tak, jak powinno być), możesz utworzyć statyczne NSString w swojej klasie: 'static NSString * objectArrayKey = @" objectArray ";' a następnie możesz wywołać '[[self mutableArrayValueForKey: objectArrayKey] addObject: test];' który zapewnia wsparcie dla kompilatora i autouzupełnianie. – Abizern