2013-09-23 15 views
9

Mam dość podstawowe MainWindow.xib z paska bocznego stylu listy źródłowej. Stworzyłem go, przeciągając szablon Źródło do szablonu w oknie, które już zawiera dwa NSTableCellView s: HeaderCell s: HeaderCell i .W jaki sposób należy rozmieścić NSTableCellViews?

Ten ostatni składa się z ikony (za pomocą NSImageView) i etykiety (NSTextField). Zamiast tego chcę pod etykietą i inną, mniejszą etykietą. W IB, to wygląda następująco:

Source list according to IB

Jeśli skupię się tylko na DataCell, to podkreśla odpowiednio:

DataCell highlighted

Thing jest uruchomiony program, to wygląda to jak szablon:

Second item in live DataCell selected

Zauważ, jak dwa NSTextField są po prostu rozbite w jeden. Rozumiem, że oparte na widoku NSOutlineView s (i oparte na widoku NSTableView s) mają być zaprojektowane jako szablon z wnętrza IB. Zamiast tego wymiary z szablonu wydają się być w większości ignorowane.

Oto kod, który ustawia wartości widoku jest ze źródła danych:

public class TourSourceListDelegate : NSOutlineViewDelegate 
{ 
    public override bool IsGroupItem(NSOutlineView outlineView, MonoMac.Foundation.NSObject item) 
    { 
     return (item as TourSourceListDataSource.Item).IsHeader; 
    } 

    public override NSView GetView(NSOutlineView outlineView, NSTableColumn tableColumn, MonoMac.Foundation.NSObject item) 
    { 
     if (IsGroupItem(outlineView, item)) 
     { 
      return outlineView.MakeView("HeaderCell", this); 
     } 
     else 
     { 
      var data = item as TourSourceListDataSource.Item; 
      var dataView = outlineView.MakeView("DataCell", this); 

      (dataView.Subviews[0] as NSTextField).StringValue = data.Name; 
      (dataView.Subviews[1] as NSTextField).StringValue = data.Date_start.ToShortDateString(); 

      return dataView; 
     } 
    } 
} 

Próbowałem nadrzędnymi GetRowHeight, ale to nie wydaje się, aby rozwiązać ten problem (to sprawia, że ​​więcej miejsca, ale nadal nie pozwala na prawidłowe rozpowszechnianie widoków), ani nie wydaje się konieczne.

Próbowałem także grać z różnymi Autosizing, Autoresizes Subviews itp. Przełącza się w IB, ale to nie wydaje się powodować intuicyjne wyniki, i znowu, nie wydaje się konieczne - widok przedstawiony w IB dokładnie to, czego chcę, tylko z nieco dłuższymi etykietami w praktyce.

Jeszcze nie próbowałem przekonwertować tego do AutoLayout.

Co oczywistego kroku mi brakuje?

Niektóre więcej informacji, które prawdopodobnie nie robi różnicy: jest to projekt Xamarin.Mac/Monoman z Xcode 5.0, MacOSX10.8.sdk, Xamarin Studio 4.0.12, 4.0.12 i Xamarin.Mac Mono 3.2.3 (targetowanie Mono/.NET 4.0). Włączyłem też funkcję Piaskownicy aplikacji.

Odpowiedz

1

Najważniejsze w budowaniu interfejsu jest hierarchia widoków. Jaki widok to ta komórka? Czy te etykiety są naprawdę subviewsami z widoku komórki, czy nie? Hierarchia powinna wyglądać mniej więcej tak:

example NSOutlineView cell hiearchy

Jedno, co widzę, że podejrzany korzysta dataView.Subviews[0] i [1]. Jeśli dodajesz subviews do komórek, to powinieneś tworzyć własne podklasy NSTableViewCell, przy czym każdy widok łączy się z właściwościami podklasy 'IBOutlet.Podklasa nie wymaga żadnego kodu w swojej implementacji, tylko deklarację jej właściwości w @interface, taką jak titleField i descriptionField, oraz pustą @implementation, która je automatycznie syntetyzuje.

Następnie makeViewWithIdentifier (lub apprently kleju MakeView w Xamarin), gdy przeszedł prawo identyfikator powinien stworzyć swój NSTableViewCell podklasy oraz w czasie wykonywania można sprawdzić, korzystając po dataView w debuggera. Następnie uzyskujesz dostęp do subskrybentów za pomocą właściwości interfejsu podklasy NSTableViewCell, zamiast zakładać, który widok jest w danej pozycji z tablicą podglądu, używając dataView.titleField i dataView.descriptionField.

Jeśli widok komórka ma jedno pole tekstowe można użyć NSTableViewCell bez podklasy, ale połączyć się wylot z textField (jest podłączona domyślnie tak długo, jak nie usuwać & odtworzyć widoku komórkowego w etykieta widok), więc może uzyskać do niego dostęp za pośrednictwem właściwości, ponownie zamiast przechodzić do tablicy subviews.

Wszystko to powiedziawszy, nie jest jasne, dlaczego widzisz, kim jesteś. Wygląda na to, że nie są to subviews, których oczekujesz, a nawet mogą wyglądać na złe czcionki, a także na niewłaściwych pozycjach. Używanie niestandardowej podklasy NSTableViewCell i sprawdzanie jej klasy w środowisku wykonawczym jest dobrym sposobem upewnienia się, że tworzy ona oczekiwany widok, ale można także zrzucić widok podrzędny w debugerze przy użyciu po [dataView _subtreeDescription].

Powiązane problemy