2013-09-23 40 views
9

我有一個相當基本的MainWindow.xib與源列表式邊欄。我通過將源列表模板拖到已經包含兩個NSTableCellView s:HeaderCellDataCell的窗口中來創建它。NSTableCellViews應該如何佈局?

後者由一個圖標(使用NSImageView)和一個標籤(NSTextField)組成。相反,我需要標籤和另一個較小的標籤。在IB,這看起來如下:

Source list according to IB

如果我只專注於DataCell,其相應的亮點:

DataCell highlighted

事情是,實際運行的程序,它看起來一點也不像模板:

Second item in live DataCell selected

請注意這兩個NSTextField只是一起被粉碎成一個。我的理解是,基於視圖的NSOutlineView(和基於視圖的NSTableView s)應該被設計爲IB內的模板。相反,模板中的維度似乎大部分被忽略。

下面是從數據源中設置視圖的價值觀代碼:

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; 
     } 
    } 
} 

我試圖重寫GetRowHeight,但是這似乎並沒有解決問題(它使更多的空間,但不會讓意見自行分配),也不是必要的。

我也嘗試玩各種Autosizing,Autoresizes Subviews等在IB中切換,但這似乎不會產生直觀的結果,並且似乎並不需要 - IB中呈現的視圖正是我想要的,只是在實踐中使用稍長的標籤。

我還沒有試過將其轉換爲AutoLayout呢。

我錯過了什麼明顯的步驟?

更多信息可能沒有什麼區別:這是一個Xamarin.Mac/MonoMac項目,包含Xcode 5.0,MacOSX10.8.sdk,Xamarin Studio 4.0.12,Xamarin.Mac 4.0.12和Mono 3.2.3(針對Mono/.NET 4.0)。我還啓用了App Sandboxing。

回答

1

界面構建器中重要的是視圖層次結構。那個單元格是什麼樣的視圖?這些標籤是否真的細胞視圖的子視圖?層次結構應該是這個樣子:

example NSOutlineView cell hiearchy

有一件事腥,我看到正在訪問dataView.Subviews[0][1]。如果要將子視圖添加到單元格中,則應該創建自己的NSTableViewCell子類,並將每個視圖連接到子類的IBOutlet屬性。該子類在其實現中不需要任何代碼,只需聲明@interface中的屬性(如titleFielddescriptionField)以及自動合成它們的空即可。

然後makeViewWithIdentifier(或apprently膠MakeView在Xamarin)通過權當標識符應該創建NSTableViewCell的子類,並在運行時可以驗證在調試器使用po dataView。然後,使用NSTableViewCell子類的接口的屬性訪問子視圖,而不是使用dataView.titleFielddataView.descriptionField來假定哪個視圖位於子視圖陣列的哪個位置。

如果你的觀點有一個文本字段,那麼你可以使用NSTableViewCell沒有子,但連接起來textField出口(其默認連接,只要你不刪除&重建細胞視圖的標籤視圖),所以你可以通過屬性訪問它,而不必深入子視圖數組。

所有這一切說,它不是很清楚你爲什麼看到你是什麼。看起來這些不是你期望的子視圖,甚至可能看起來像錯誤的字體以及錯誤的位置。使用NSTableViewCell的自定義子類並在運行時驗證它的類是確保它創建您期望的視圖的好方法,但您也可以使用po [dataView _subtreeDescription]轉儲調試器中的子視圖。