2011-08-17 13 views
16

Próbuję zaimplementować nowy widok OutlineView oparty na widoku jako listę źródeł w mojej aplikacji Mac. Nie mogę jednak wyświetlić wartości do wyświetlenia, dlatego stworzyłem małą aplikację testową z szablonu aplikacji Core Data i nie mogę jej również uruchomić.Powiązanie opartego na widoku NSOutlineView do danych podstawowych

Zdefiniowałem dwie proste klasy w moim modelu danych; nazwijmy je "rodzicem" i "dzieckiem". Rodzic ma pojedynczy atrybut "imię i nazwisko" oraz pojedynczy związek "dzieci". nazwa to opcjonalny ciąg znaków, a dla dzieci jest opcją do wielu dla użytkownika Dziecko. Dziecko ma taki sam atrybut "nazwa" i relację "rodzica" jeden do jednego, który jest odwrotnością dzieci. Wygenerowałem niestandardowe klasy dla obu tych i napisałem stub w Dziecko dla dzieci, który zwraca nil.

Przeciągnąłem listę źródeł z biblioteki obiektów do mojego XIB i upuszczono w drzewie kontrolera. Domyślna ścieżka klucza kontrolera drzewa jest ustawiona na "dzieci", jest w trybie nazwy jednostki, z "nadrzędnym" jako nazwą jednostki, przygotowuje sprawdzoną treść i kontekstem zarządzanego obiektu do kontekstu delegata aplikacji. Kontroler drzewa jest źródłem danych widoku konspektu, a widok tekstowy komórki danych ograniczam do widoku komórki tabeli za pomocą ścieżki klucza "objectValue.name".

w -applicationDidFinishLaunching: tworzę dwa Parent przypadki, jeden z dziecka i przypisać nazwa właściwości każdego obiektu.

rzeczywisty problem

No text

Teraz, dzięki tej konfiguracji z drogi, mam wiersze znalazły się na liście źródeł, ale pola tekstowe są puste, mimo że są one granica. Nie sądzę, że powinienem robić cokolwiek innego, ponieważ używam wiązań i jestem w pełni pewien, że powiązanie z właściwością objectValue jest słuszne. Co idzie źle?

Mogę podać więcej szczegółów w razie potrzeby, ale jestem prawie pewien, że obejmuje wszystko, co zrobiłem.

+0

Dostałeś to zadziałało? Miałem ten sam problem, więc próbowałem zduplikować twój projekt. Ale używam aplikacji opartej na dokumencie. Moje metody delegatów nigdy nie są wywoływane i nie otrzymuję żadnych wartości tekstowych w komórkach. Jednak zawierają poprawne dane. Czy masz działający kod wszędzie, gdzie mogę się przyjrzeć? Bardzo to doceniam! Mogę przesłać mój projekt testowy do github. – Mikael

+1

Czy oznaczałeś kontroler widoku jako delegata? Jeśli metody delegatów nie zostaną w ogóle wywołane, okablowanie jest prawdopodobnie niepoprawne. Jeśli to nie rozwiąże problemu, powinieneś zamieścić własne pytanie. – Dov

+0

Nie mogę uwierzyć, że to przegapiłem. Wielkie dzięki! – Mikael

Odpowiedz

23

Wow, to jak ja sprzed dwóch tygodni zadaje to pytanie.

W każdym razie, jeśli masz coś takiego jak ja, problemem jest to, że na widok
oparte NSOutlineViews, trzeba zaimplementować metodę delegata

- (NSView *)outlineView:(NSOutlineView *)outlineView 
    viewForTableColumn:(NSTableColumn *)tableColumn 
        item:(id)item; 

i powrót NSTableCellView skonfigurowaniu,
albo po prostu dadzą ci pustą linię. Najprostszym sposobem, aby to zrobić, to po prostu zadzwoń

[outlineView makeViewWithIdentifier:@"MyCell" owner:self] 

zastępując MyCell ze cokolwiek wpisane jako „User Interface Element Identifier”
w Identity Inspector dla NSTableCellView.

+0

Twoja odpowiedź, chociaż wydaje się poprawna, nie używa powiązań. – Richard

+6

Musisz zaimplementować to oprócz używania powiązań. Wiązania nadal mogą obsługiwać ustawianie wartości obiektu obiektu widzenia i wiązać widoki podrzędne komórki z tą wartością obiektu. Ale ta metoda jest nadal wymagana, aby poinformować widok konspektu, który widok komórki będzie używany dla określonego wiersza/kolumny. –

+6

Jest to konieczne, ponieważ Lista Źródłowa używa domyślnie dwóch różnych komórek w tej samej kolumnie, HeaderCell i DataCell, i nie może wybrać dla ciebie jednej, tak jak gdyby mogła mieć tylko jedną komórkę i ustawić jej identyfikator na Automatyczny . – Dov

5

Jak zauważył Boaz powyżej, należy zastosować metodę Delegata, aby zwrócić widok. Całkiem tajemnica, biorąc pod uwagę, że nie mogłem znaleźć tej metody w Dokumentach. Jeśli chodzi o typ parametru elementu (id), jest to NSTreeControllerTreeNode, który jest nieudokumentowaną podklasą NSTreeNode. Jeśli ją rzucisz, możesz pobrać obiekt komórki i zwrócić inny widok na podstawie rodzaju obiektu lub dowolne atrybuty tego obiektu określające typ widoku komórki. np.

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 
NSTableCellView *view = nil; 

NSTreeNode *node = item; 

if ([node.representedObject isKindOfClass:[Group class]]) { 
    view = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
} else { 
    view = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
} 
return view; 
} 
4

To wydawało się być zmianą dla Xcode 4 lub w tym miejscu. Konstruktor interfejsów dodaje dwa obiekty NSTableCellView w widoku NSOutlineView. Jeśli usuniesz NSTableCellView obiektów wrócisz do Saner (albo przynajmniej udokumentowaną) świat, w którym trzeba będzie wdrożyć outlineView: dataCellForTableColumn: przedmiot i outlineView: willDisplayCell: forTableColumn: przedmiot

... albo przynajmniej zrobić, jeśli chcesz wygląd listy źródłowej. W każdym razie tak właśnie wygląda konfiguracja SourceView i dlatego przy próbie odtworzenia próbki SourceView można uzyskać taki bałagan.

Alternatywnie, jeśli chcesz nadal korzystać z obiektów NSTableCellView (które są bardzo przydatne), a następnie można:

  • Powiąż NSOutlineView „Content” do TreeController.arrangedObjects

  • Powiąż NSTextField (i/lub NSImageView) pod NSTableCellView do 'Table Cell View' ze ścieżką klucza modelu obiektuValue. < klucz>

0

Stworzyłem mały przykładowy projekt, który popuplates również popuplates się NSOutlineView, nie z CoreData ale kluczowym czynnikiem jest to, jak @ Boaz-stuller stwierdził, że prawidłowa komórka jest zaznaczona (podobnie jak w jaki sposób uchwyt UITableViewCell sw iOS

więc my case I wprowadziły metodę tak:..

- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item { 

    if ([self isHeader:item]) { 
     return [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 
    } else { 
     return [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 
    } 
} 

Wyjazd besi/mac-quickies na github Większość rzeczy jest albo zrobić w IB lub można znaleźć w AppDelegate

screenshot

Powiązane problemy