0

私の iPhone 用 Monotouch アプリケーションでは、セグメント化されたコントローラーを UITableViewCell に追加して、各行の値のトグルとして機能させようとしています。すべてが正しく表示され、最初の行をクリックすると最初は正しく機能します。ただし、行が画面から出てリロードされた後、セグメント化されたコントローラーをもう一度クリックすると、例外が発生します。

未処理の例外によるランタイムの終了 [エラー] FATAL UNHANDLED EXCEPTION: System.Exception: GC されたタイプ MonoTouch.UIKit.UIControlEventProxy (0x16D793C0) のマネージド オブジェクトで object-c から呼び出されたセレクター ---> System.MissingMethodException : MonoTouch.UIKit.UIControlEventProxy::.ctor(System.IntPtr) のコンストラクターが見つかりません

Monotouch を使用して表のセルにボタンを配置しようとする同様の問題について聞いたことがあります。一般的な推奨事項は、各テーブル セルをリストに追加してガベージ コレクションを防ぐことですが、これはうまくいきませんでした。

この問題を回避する解決策はありますか?

これは、私の GetCell コードのやや簡略化されたバージョンです。

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

            Hashtable rowData = dataList [indexPath.Row];
            FilterListToggleCell cell;
            cell = (FilterListToggleCell)tableView.DequeueReusableCell ("FilterTogglePlusCell");


            cacheList.Add(cell.Toggle);//cache only the segcontrol
                            //cacheList.Add(cell);//also previously tried caching the whole cell


            cell.Title.Text = (string)rowData["title"];
            if(additionalFields.Contains((string)rowData["key"])){
                cell.Toggle.SelectedSegment = 0;
            } else {
                cell.Toggle.SelectedSegment = 1;

            }



            cell.Toggle.ValueChanged += (sender, e) => {
                UISegmentedControl toggle = (UISegmentedControl)sender;

                if(toggle.SelectedSegment == 0){
                    Console.WriteLine("Toggle YES");
                } else {
                    Console.WriteLine("Toggle NO");
                }

            };



            cell.Toggle.Tag = indexPath.Row;

            return cell;

        }
4

2 に答える 2

0

この質問からの情報に基づいて、追加のキャッシュを必要とせずにこれを機能させることができました:イベントからイベントハンドラーを削除/登録解除するにはどうすればよいですか?

ValueChanged 行は次のように置き換えられました。

cell.Toggle.AddTarget(this, new Selector("ToggleChange"),UIControlEvent.ValueChanged);

別のメソッドが私の UITableViewDataSource に追加されました

[Export ("ToggleChange")]
void OnChange(UISementedControl toggle){
    if(toggle.SelectedSegment == 0){
        Console.WriteLine("Toggle YES");
    } else {
        Console.WriteLine("Toggle NO");
    }
}
于 2013-01-08T15:30:09.703 に答える
0

あなたは基本的な条件について正しいです。この状態は、メソッドから返されるへのマネージ参照がないために発生します。そのため、GC はそれを収集して解放できます (これにより、マネージド インスタンスにコールバックするイベントなどの問題が発生します)。詳細については、この回答を参照してください。UITableViewCellGetCell

このアプローチがうまくいかなかった理由がわかりません。ただし、上記のコードは不完全なようです。

cell = (FilterListToggleCell)tableView.DequeueReusableCell ("FilterTogglePlusCell");

より多くのセルを作成する必要があるときに返すことができnullます (実際、実際に新しいセルを作成する条件はないため、再利用できるものはありません)。

次の行はNullReferenceExceptionwhen cellis null をスローします ( のためcell.Toggle)。

これはクラッシュを説明するものではないことに注意してください - それを機能させる (セルを作成する) コードが欠落しており、それらが正しくキャッシュされない可能性があると思われます。

于 2013-01-07T20:10:15.690 に答える