1

xamarin チュートリアルと xamarin の UITableView に関するさまざまな投稿を検索しましたが、静的セルを含む UITableView については何も見つかりませんでした。

私が達成しようとしているのは、twitterific アプリのような単純な詳細画面ですが、Nib やストーリーボードはありません (mvvmcross を使用すると、ストーリーボードは利用できず、Nib ファイルは静的 UITableView の使用を妨げます。少なくとも、方法が見つかりませんでした)それ)

さらに、さまざまなソリューションを試した後、次のような結果になりました。

UITableViewController

public override int NumberOfSections(UITableView tableView)
{
    return 1;
}

public override int RowsInSection(UITableView tableview, int section)
{
    return 1;
}

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{

    UITableViewCell cell = tableView.DequeueReusableCell("test");

    if (cell == null)
    {
        cell = new SejourInfoViewPatientCell();
        //cell = new UITableViewCell(UITableViewCellStyle.Subtitle, "test");
    }

    //cell.TextLabel.Text = "test";

    return cell;
}

しかし、現在 mvvmcross バインディングは機能しません。まったく同じバインディングを取得して非静的 UITableViewController で使用すると、すべて正常に動作します

誰かが私を方向に向けることができれば、私はうれしいです

さえずり

4

2 に答える 2

1

私は同じ問題に苦労してきました。ビューを次のように継承させることで、バインディングの問題を回避できましMvxViewControllerViewDidLoad

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

    UITableView テーブル = 新しい UITableView();

    Action<UITableViewCell> 初期化子 = 新しい Action<UITableViewCell>[] {
          (セル) => {
              this.CreateBinding(cell.TextLabel)
                  .For(c => c.Text)
                  .To(x => x.FirstName)
                  。申し込み();
          }、
          (セル) => {
              this.CreateBinding(cell.TextLabel)
                  .For(c => c.Text)
                  .To(x => x.LastName)
                  。申し込み();
          }
    };

    StubDataSource source = new StubDataSource(テーブル、初期化子);

    table.Source = ソース;

}

StubDataSourceはMvxStandardTableViewSourceから継承します (ただし、必要に応じて、おそらく UITableViewSourceを継承することをお勧めします(代わりにオーバーライドしますGetCell)。

パブリック クラス StubDataSource : MvxStandardTableViewSource
{
    プライベート読み取り専用 Action<UITablleViewCell>[] _inits;

    public StubDataSource(
                UITableView テーブルビュー、
                Action<UITableViewCell>[] inits)
            :ベース(テーブルビュー)
    {
          _inits = 初期化;          
    }

    public override int NumberOfSections(UITableView tableView)
    {
         1 を返します。
    }

    public override int RowsInSection(UITableView tableview, int section)
    {
         2 を返します。
    }

    protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
    {
        var reuse = base.CreateDefaultBindableCell(tableView, indexPath, item);

        switch(indexPath.Row)
        {
             ケース 0:
                _inits[0](再利用);
             ケース 1:
                _inits[1](再利用);
        }

        再利用を返します。
    }

}

2つの注意点、

  1. これはちょっとしたハック (Closures に感謝) ですが、ios で静的テーブルにバインドする唯一の方法だと思います。うまくいけば、誰かがより良い方法を提案します。
  2. 2 つ目は、サブビュー (UITextFields など) を持つカスタム セルを作成する場合、カスタム セル タイプを作成し、それらのサブビューをクラス変数として持つ必要があります。そうしないと、GC がそれらを収集し、SIGSEGV例外が発生します。
于 2013-11-06T19:19:01.030 に答える
0

staticTableView や Cell が何であるかはわかりませんが、スクロール時の MvxTableViewSource DequeueReusableCell の問題への回答として、 https://github.com/slodge/ListAppに「カスタム セル」を使用した完全なサンプルを投稿しました。

重要な部分は次のとおりです。

  • カスタムセルにIntPtrコンストラクターが含まれていることを確認してください
  • RegisterClassForCellReuseカスタムセルタイプで使用
  • GetOrCreateCellForテーブルソースでオーバーライドしDequeueReusableCell、セルの作成に使用します

高さが可変のセルの場合はGetHeightForRow、テーブル ソース内でオーバーライドする必要もあります。

于 2013-10-31T13:10:51.303 に答える