2017-07-12 13 views
0

私はカスタムUITableViewセクションヘッダーとフッターが必要です。これについては、私はバインディングとロジックで動作するカスタムコントロールを作成したいと思います。そのためにMvvmCrossとXIBを使用したカスタムUITableViewHeaderFooterView?

私はXIBを作成し、次のようなバッキングクラスを追加しました:

public partial class HeaderFooterView : MvxTableViewHeaderFooterView 
{ 
    public static readonly NSString Key = new NSString("HeaderFooterView"); 
    public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle); 

    public HeaderFooterView(IntPtr handle) : base(handle) 
    { 
    } 

    public override void AwakeFromNib() 
    { 
     base.AwakeFromNib(); 

     //var binding = this.CreateBindingSet<HeaderFooterView, TableViewSection>(); 


     //binding.Apply(); 
    } 
} 

MvxTableViewHeaderFooterViewIMvxBindableで株式UITableViewHeaderFooterViewを組み合わせ、実際にはかなり単純なクラスです。何もない。私はきちんとTableViewSourceコンストラクタ内に登録にもかかわらず、何らかの理由しかし

、:

tableView.RegisterNibForHeaderFooterViewReuse(HeaderFooterView.Nib, HeaderFooterView.Key); 

そしてのみヘッダー自体を返すの適切な方法を実行します。

public override UIView GetViewForHeader(UITableView tableView, nint section) 
    { 
     return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key); 
    } 

アプリがで死にます次のエラー:

2017-07-12 16:56:40.517 MyAppiOS[3833:58706] *** Assertion failure in -[UITableView _dequeueReusableViewOfType:withIdentifier:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3600.7.47/UITableView.m:6696 
2017-07-12 16:56:40.528 MyAppiOS[3833:58706] WARNING: GoogleAnalytics 3.17 void GAIUncaughtExceptionHandler(NSException *) (GAIUncaughtExceptionHandler.m:48): Uncaught exception: invalid nib registered for identifier (HeaderFooterView) - nib must contain exactly one top level object which must be a UITableViewHeaderFooterView instance 

私のNIBには実際には1つのrooが含まれていますtオブジェクトであるHeaderFooterViewクラス(これはから順に派生したMvxTableViewHeaderFooterViewに由来します)に設定されているルートビュー自体です。それでもUITableViewHeaderFooterViewインスタンスはないと主張しています。

なぜそれが正常に動作していないのですか?

+0

私はフッター/ヘッダーに対して推定された高さを割り当てなければならないと信じています。 – Digitalsa1nt

+0

私の問題はレンダリングではなく、 'DequeueReusableHeaderFooterView'を呼び出そうとアプリがクラッシュすることです。 – fonix232

答えて

0

return tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key);は、再利用するHeaderFooterViewがない場合はnullを返すことができるからです。あなたがあなた自身を作成する必要があり、その場合には:

var view = tableView.DequeueReusableHeaderFooterView(HeaderFooterView.Key); 
if (view == null){ 
    //instantiate the nib here and set view 
} 

return view; 
+0

上記のエラーを除く( 'キャッチされていない例外:識別子(HeaderFooterView)に登録されたnibが無効です--NIBはUITableViewHeaderFooterViewインスタンスでなければならない最上位レベルのオブジェクトを含む必要があります)')が 'DequeueReusableHeaderFooterView'呼び出し中に発生します。ビューがヌルであるかどうかを確認するまでには至りません。アプリがその行でクラッシュするためです。 – fonix232

0

私は次のようにバッキングクラスを構築することをお勧め:

自体によって静的コンストラクタを追加
public partial class HeaderFooterView : MvxTableViewHeaderFooterView 
{ 
    public static readonly NSString Key = new NSString("HeaderFooterView"); 
    public static readonly UINib Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle); 

    static HeaderFooterView() 
    { 
     //Adding this alone should allow your tableview to properly instantiate the view. 
     Nib = UINib.FromName("HeaderFooterView", NSBundle.MainBundle); 
    } 

    public static HeaderFooterView Create() 
    { 
     // However you can add this static method and create and return the view yourself. 
     var arr = NSBundle.MainBundle.LoadNib(nameof(HeaderFooterView), null, null); 
     var v = Runtime.GetNSObject<HeaderFooterView >(arr.ValueAt(0)); 
     return v; 
    } 

    public HeaderFooterView(IntPtr handle) : base(handle) 
    { 
     // Note: this .ctor should not contain any initialization logic. 
    } 

    public override void AwakeFromNib() 
    { 
     base.AwakeFromNib(); 
    } 
} 

あなたのテーブルビューが適切にできるようにするために十分なはずですNibをインスタンス化します。しかし、あなたはまだように自分でペン先をインスタンス化するために、「作成」あなたは、静的メソッドを使用できることなどの問題を抱えて終わる場合:

public override UIView GetViewForHeader(UITableView tableView, nint section) 
{ 
    HeaderFooterView theView = HeaderFooterView.Create() 
    return theView; 
} 

は、一方または両方があなたのために働く必要があり、これらの提案を試してみてください。

+0

Nibフィールドは既に静的に初期化されているため、静的コンストラクターは必要ありません。また、私はあなたのCreate()メソッドは、別の型を返すので、動作しないと信じています。私はこの方法を試してみます。 – fonix232

+0

@ fonix232申し訳ありません、それはコピー&ペーストエラーでした。私は答えの戻り値の型を変更しました。 – Digitalsa1nt

0

問題が見つかりました。

私の初期のXIBは正しいものの、何らかの理由でルートオブジェクトのタイプが消去され、Interface Builderが私の受け入れを拒否しました。

Mac用のVS2017を使用すると、適切なルートビュークラスを設定できましたが、すべて正常に動作します。

関連する問題