2010-08-03 9 views
7

Próbowałem tego od dwóch dni i ciągle wpadałem w ślepy zaułek.Zapełnianie widoku NSTable z tablicy zmiennych

Przeszedłem przez programowanie Cocoa Aarona Hillegassa dla MAC OS X i wykonałem wszystkie odpowiednie ćwiczenia dotyczące NSTableview i zmiennych tablic, a ja próbowałem je zmodyfikować, aby odpowiadały moim potrzebom.

Jednak żadna z nich nie wydaje się używać tablicy z obiektami jako źródłem danych, wydaje się używać widoku table jako źródła danych.

Próbuję wdrożyć "przeróbkę Jonasa Jongejana" z mojego kodu here, z przednim kakao, aby wyświetlić wyniki.

Wszelkie wskazówki i sugestie, które znam, powinny być proste, ale zgubiłem się tutaj na pustyni.

mogę wypełnić tabelę, ustawiając tablicę

Odpowiedz

14

Jest to dość prosty naprawdę, gdy się go zrozumieć (oczywiście!). Nie możesz użyć NSArray bezpośrednio jako źródła tabeli. Musisz utworzyć niestandardowy obiekt, który implementuje protokół NSTableViewDataSource lub zaimplementować ten protokół w istniejącej klasie - zazwyczaj kontroler. Jeśli użyjesz Xcode do stworzenia standardowej aplikacji opartej na dokumencie, klasa kontrolera dokumentu - (będzie się nazywać MyDocument) jest dobrą klasą do użycia.

Trzeba wdrożyć przynajmniej te dwie metody:

– numberOfRowsInTableView: 
– tableView:objectValueForTableColumn:row: 

Jeśli masz zmienny tablicę, której wartości chcesz użyć w widoku tabeli z jednej kolumny, coś jak następujące powinien zrobić jak start:

– numberOfRowsInTableView: (NSTableView*) aTableView 
{ 
    return [myMutableArray count]; 
} 

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    return [myMutableArray objectAtIndex: rowIndex]; 
} 

To właśnie przyszło mi do głowy, że można dodać powyższe dwie metody jako kategoria do NSArray zastępując myMutableArray z self a następnie można użyć tablicę jako źródła danych.


W każdym razie, z zmienny tablicy, ważne jest, że za każdym razem gdy go zmienić, trzeba pozwolić widok tabeli wiedzieć, że został zmieniony, więc trzeba wysłać widok tabeli -reloadData.


Jeśli widok tabeli ma więcej niż jedną kolumnę i chcesz, aby wypełnić go z właściwości obiektów w tablicy, istnieje trik można zrobić, aby ułatwić sobie.Powiedzmy obiektów w tablicy są instancjami klasy o nazwie Person z dwóch metod określonych:

-(NSString*) givenName; 
-(NSString*) familyName; 

i chcesz, aby Twój widok tabeli mieć kolumnę dla każdego z nich, można ustawić właściwość każdej kolumny identifier do nazwy obiektu osobiście, że wyświetla kolumny i użyć coś jak poniżej:

– tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex 
{ 
    Person* item = [myMutableArray objectAtIndex: rowIndex]; 
    return [item valueForKey: [tableColumn identifier]]; 
} 

Jeśli zastąpić valueForKey: z valueForKeyPath: i klasa Osoba ma również następujące metody:

-(Person*) mother; 
-(Person*) father; 
-(NSString*) fullName; // concatenation of given name and family name 

można dodać kolumny tabeli z identyfikatorami takimi jak: father.fullName lub mother.familyName, a wartości zostaną automatycznie wypełnione.

1

Na iPhone (wiem, że mówisz o komputerze Mac, ale może to może pomóc) musisz użyć delegacji do ładowania tableView. Prosi o komórkę i używasz tablicy do wypełniania danych w razie potrzeby. Nie jestem pewien, czy to działa na Macu, ale warto się nim zajrzeć.

Może ustawić źródła danych do siebie i stosować te same metody delegatem na dostęp do tablicy na podstawie wiersza i kolumny #

+0

@ Odpowiedź: willcodejavaforfood jest dla iPhone'a, ale możesz śledzić ten link, aby zobaczyć co mam na myśli – RSully

+0

Ups, mam iPhone'y na moim mózgu :) – willcodejavaforfood

3

Możesz pójść trasą danych i samodzielnie wykonać wszystkie ciężkie prace, lub możesz pozwolić, aby wiązania zrobiły dla ciebie cały ciężar. Dodaj NSArrayController do pliku nib, który zawiera widok tabeli. Upewnij się, że właściciel pliku stalówki jest ustawiony na tę samą klasę, która zawiera tablicę zmiennych. Przypisz contentArray kontrolera tablic do File's Owner.myMutableArray. Dla każdej kolumny należy powiązać Value z kontrolerem macierzy arrangedObjects i dodać odpowiednią ścieżkę klucza. Umożliwi to darmowe sortowanie użytkowników, jeśli kiedykolwiek będziesz tego potrzebować.

Powiązane problemy