2011-08-17 6 views
5

Obecnie próbuję użyć nowego widoku opartego na widoku NSOutlineView w mojej aplikacji Cocoa. Ponieważ nie używam wiązań, więc zaimplementowałem wszystkie wymagane metody delegatów i źródeł danych w moim kontrolerze.Wyświetlane problemy z czcionką nagłówka NSOutlineView

interfejs konstruktora Dodałem NSOutlineView z podświetlaniem ustawionym na SourceList i trybem ustawionym Content Based View. Zatem były dwa widoki komórkowe domyślna tabela przewidziane (jedna komórka nagłówka z HeaderCell zestawu jako identyfikator i jednej komórki danych z Datacell zestawu jako identyfikator)

To jak to wygląda w konstruktora interfejsu, poglądów komórek nagłówka poprawnie wyświetlić szaroniebieski textField natomiast poglądy komórkowe dane mają widok obrazu i textField z poprawnych ustawień kolorów i czcionek

przedstawienie poglądów, używam następujący kod, aby powrócić do DataCell- widok lub widok HeaderCell - zestaw i zestaw textField komórki odpowiednio, w oparciu o odpowiedni identyfikator ustawiony w konstruktorze interfejsów.

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


    NSTableCellView *result = nil; 

    if ([item isKindOfClass:[NSMutableDictionary class]]) { 
     result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self]; 

     id parentObject = [outlineView parentForItem:item] ? [outlineView parentForItem:item] : groupedRoster; 
     [[result textField] setStringValue:[[parentObject allKeys] objectAtIndex:0]]; 


    } else { 
     result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self]; 

     [item nickname] ? [[result textField] setStringValue:[item nickname]] : [[result textField] setStringValue:[[item jid] bare]]; 
    } 
    return result; 
} 

Działa wszystko, co wygląda następująco.

Czy ktoś może mi podpowiedzieć, dlaczego komórka nagłówka nie jest pogrubiona ani prawidłowo zabarwiona, jeśli wybrana?

Odpowiedz

11

Musisz zaimplementować -outlineView: isGroupItem: delegować metodę i zwracać TAK dla wierszy nagłówka. Spowoduje to ujednolicenie czcionki i zastąpienie trójkąta rozwijania po lewej stronie przyciskiem Pokaż/Ukryj po prawej stronie. Aby uzyskać pełny efekt, nadal musisz ręcznie pisać dużymi literami.

Nie jestem pewien, czy powyższa metoda delegowania wiersza grupy sprawia, że ​​styl zaznaczenia wygląda dobrze, czy nie. Jednak zwykle nie chcesz, aby wiersze nagłówka były dostępne do wybrania w ogóle na listach źródłowych, które zwracasz NIE dla elementów nagłówka z metody -ViewlineView: shouldSelectItem: delegate.

+1

wielki, dzięki, to było dokładnie to, czego szukałem. Jeśli ktoś inny napotka problem, użyj setFloatsGroupRows: NO, aby zapobiec przeskakiwaniu * pierwszego i drugiego elementu grupy podczas rozwijania i zwijania zgodnie z [tym wpisem] (http: // stackoverflow.com/questions/6814620/strange-behaviure-using-view-based-nsoutline-sourcelist) – BinaryBucks

+0

Podczas gdy jestem teraz i wszystko poprawnie wyświetlane powyższy kod działa tak naprawdę nie działa płynnie podczas rozwijania/zwijania grupy takiej jak to jest na przykład w przypadku Znalazca. W animacji jest zawsze niewielkie, ale godne uwagi jąkanie i dość duże obciążenie procesora, tak jakby widok był nowo przydzielony. Jeśli po prostu używam makeViewWithIdentifer z pojedynczym identyfikatorem, tak że każda komórka jest komórką nagłówka (lub komórką danych, która nie ma znaczenia), wszystko działa płynnie. Jakąkolwiek wskazówkę dlaczego? – BinaryBucks

+0

Tak, cała właściwość floatsGroupRows jest po prostu uszkodzona dla widoków konspektu. Nie widzisz problemu z wydajnością, który opisujesz. Może regresja rdzenia animacji z superwidoku opartego na warstwach? Dunno. –

2

Stworzyłem mały przykładowy projekt, który zawiera listę źródeł, a także używa metody -outlineView:isGroupItem:, jak zasugerował @ boaz-stuller.

  • wyświetlić listę elementów
  • Edycja pozycje w master-detail mody
  • Usuwanie i dodawanie elementów
  • Wykorzystanie powiązań

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

screenshot