2013-09-23 8 views
9

私はソースリストスタイルのサイドバーを持つかなり基本的なMainWindow.xibを持っています。 ソースリストテンプレートをウィンドウにドラッグして作成しました。このウィンドウにはすでにNSTableCellViewの2つが含まれています:HeaderCellDataCellです。NSTableCellViewsはどのようにレイアウトされていますか?

後者はアイコン(NSImageViewを使用)とラベル(NSTextField)で構成されています。代わりに、私はラベルともう1つ、小さいラベルを下にしたい。次のようにIBでは、これは見た目:

Source list according to IB

を私はちょうどDataCellに焦点を当てる場合は、それに応じて強調表示します:

DataCell highlighted

事が実際にプログラムを実行している、である、それはのように何も見えませんテンプレート:

Second item in live DataCell selected

2つのNSTextFieldがちょうど1つにまとまっていることに注目してください。私の理解では、ビューベースのNSOutlineView(ビューベースのNSTableView)は、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に変換しようとしていません。

明らかなステップは何ですか?

おそらく違いはありません:これはXcode 5.0、MacOSX10.8.sdk、Xamarin Studio 4.0.12、Xamarin.Mac 4.0.12、およびMonoのXamarin.Mac/MonoMacプロジェクトです3.2.3(Mono/.NET 4.0を対象とする)私はApp Sandboxingも有効にしました。

答えて

1

インタフェースビルダーで重要なことは、ビュー階層です。その細胞はどのような見方ですか?それらのラベルは実際にセルビューのサブビューですか?階層は次のようになります。私は見ている魚です

example NSOutlineView cell hiearchy

ことの一つは、dataView.Subviews[0][1]にアクセスしています。あなたのセルにサブビューを追加する場合は、独自のNSTableViewCellサブクラスを作成する必要があります。各ビューはサブクラス 'IBOutletプロパティに接続します。サブクラスでは、その実装では、titleFieldおよびdescriptionFieldなどのプロパティの宣言と、自動合成する空の@implementationというコードを実装する必要はありません。渡されたときに

makeViewWithIdentifier(またはapprently Xamarinで糊MakeView)右の識別子は、あなたのNSTableViewCellサブクラスを作成する必要があり、実行時にデバッガでpo dataViewを使用していることを確認することができます。次に、dataView.titleFielddataView.descriptionFieldを使用して、どのビューがサブビュー配列のどの位置にあるかを仮定するのではなく、NSTableViewCellサブクラスのインターフェイスのプロパティを使用してサブビューにアクセスします。あなたの細胞ビューは、1つのテキストフィールドを持つ場合

あなたはサブクラス化せずにNSTableViewCellを使用できますが、textFieldコンセントを接続してください(そのあなたが細胞ビューのラベルビュー再作成&を削除しない限り、デフォルトで接続されている)のでサブビュー配列に潜んでいるのではなく、プロパティを介してアクセスすることができます。

すべてのことは、あなたがあなたが何であるかを見ている理由は明らかではありません。それらはあなたが期待しているサブビューではなく、間違った位置にあるだけでなく間違ったフォントのように見えるかもしれません。 NSTableViewCellのカスタムサブクラスを使用し、実行時にそのクラスを検証することは、期待通りのビューを作成する良い方法ですが、po [dataView _subtreeDescription]を使用してデバッガ内のサブビューをダンプすることもできます。

関連する問題