0

私は xamarin フォーム プロジェクトを使用していますが、xamarin iOS プロジェクトにバグがあります。現在、マスター/詳細ページの機能を実装し、アクション バーにボタン項目を追加しました。問題は、 MainPage からアプリケーションを実行しているときに、ハンバーガー メニューから別のページに移動してから、再度 MainPage に戻ることです。すべて問題ないようです。しかし、MainPage カルーセルを別のオブジェクトにスクロールして ActionBar 項目をクリックすると、次のようなエラーが発生します。

System.ObjectDisposedException: 破棄されたオブジェクトにアクセスできません。

オブジェクト名: 'CustomNavigationRenderer'.

これは私の iOS CustomNavigationRenderer クラスです:

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationRenderer))]
public class CustomNavigationRenderer : NavigationRenderer
{
    private string pName;
    private int pCCount;
    private string pCName;

    private App MainApp { get; set; }
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
    }
    private void CIndexChanged(int pCCount, string pName)
    {    
        UIBarButtonItem providerBtn = TopViewController.NavigationItem.RightBarButtonItems[0];
    }

デバッグ TopViewController で、次のような行が表示されました。

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'CustomNavigationRenderer'.

しかし、現在のオブジェクトから別のカルーセル ビュー オブジェクトにスクロールするまで、TopViewController にはデバッグ モードで次のような行があります。

Xamarin_Forms_Platform_iOS_NavigationRenderer_ParentingViewController

オブジェクトがアクション バーの項目に到達しない主な理由は何ですか?

4

1 に答える 1

1

新しいナビゲーション ページを常に作成するのではなく、既存のナビゲーション ページを再利用することで、この問題を解決しました。これは、既存のリストから項目を取得するナビゲーション項目メソッドです。メインページを再利用しました:

private void ListView_ItemSelect(object sender, SelectedItemChangedEventArgs e)
        {
            var selectedItem = (MasterMenuItem)((ListView)sender).SelectedItem;

            MainPage mainPage = (App.Current.MainPage as MainPage);
            switch (selectedItem.KeyIndexName)
            {
                case "MainPage":
                    mainPage.Detail = mainPage.MainPageDetail;
                    break;
                case "AAA":
                    if(aaa==null)
                        aaa = new NavigationPage(new AaaPage());
                    mainPage.Detail = aaa;
                    break;
                case "BBB":
                    if (bbb== null)
                        bbb = new NavigationPage(new BbbPage());
                    mainPage.Detail = bbb;
                    break;
                case "CCC":
                    if (ccc == null)
                        ccc = new NavigationPage(new CccPage());
                    mainPage.Detail = ccc;
                    break;
            };
            mainPage.IsPresented = false;
        }
于 2016-08-26T14:31:01.247 に答える