Xamarin iOS无法访问已处置的对象,对象名称:''

时间:2016-08-25 09:48:21

标签: c# xamarin.ios xamarin.forms dispose custom-renderer

我正在使用xamarin表单项目,我在xamarin iOS项目上有一个错误。目前我实现了Master-Detail Page的功能,并且我还在操作栏上添加了按钮项。问题是,当我从我的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

可能主要原因是,该对象未到达该操作栏项目?

1 个答案:

答案 0 :(得分: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;
        }