重新初始化MasterPage在IOS中抛出空例外 - Xamarin表单

时间:2017-07-20 13:28:30

标签: xamarin

我有一个MDPage,它是一个MasterDetailPage,它将旁边的菜单项列表页面称为Master。详细信息将添加主页的新NavigationPage。

我的代码是

public MDPage(){
Master = new SideMenuPage();
InitializeComponent();
masterPage.ListView.ItemSelected += OnItemSelected;

Detail = new NavigationPage(new HomePage())
{
    BarBackgroundColor = Color.Black,
    BarTextColor = Color.White,
};}

我有一个要求,其中NavigationPage包含一个底部菜单,以便在单击底部菜单时,需要重新初始化MDPage以设置不同页面的新NavigationPage(例如AboutUs页面)。所以我为MDPage添加了一个参数化构造函数,并在单击底层菜单项时调用App.Current.MainPage = new MDPage("AboutUs")。下面是参数化构造函数。

  public MDPage(string bottomMenuItem)
 {
Master = new SideMenuPage();
InitializeComponent();
masterPage.ListView.ItemSelected += OnItemSelected;

if("AboutUs" == bottomMenuItem)
{
   Detail = new NavigationPage(new AboutUs())
   {
      BarBackgroundColor = Color.Black,
      BarTextColor = Color.White,
   };
}}

这里打开应用程序时最初调用MDPage构造函数。然后从侧面菜单中我可以选择打开添加为详细信息的HomePage。请注意,此HomePage包含一个底部子菜单,它只是一个图像。在点击它时,它应该再次重新初始化MDPage。这在Andorid工作得很好。但在iOS中,它会抛出null异常。它不允许我设置Master = new SideMenuPage();我通过反复试验找到了根本原因,因为这段代码不会抛出异常并且它会抛出iOS Main.cs文件。请帮帮我。

MainPage - XAML

<?xml version="1.0" encoding="utf-8" ?>
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                  xmlns:local="clr-namespace:ClubApp.Views;assembly=ClubApp"
             x:Class="ClubApp.Views.MainPage">

  <MasterDetailPage.Master>
    <local:MasterPage x:Name="masterPage" />
  </MasterDetailPage.Master>
  <MasterDetailPage.Detail>
    <NavigationPage>
      <x:Arguments>

      </x:Arguments>
    </NavigationPage>
  </MasterDetailPage.Detail>
</MasterDetailPage>

MainPage.xaml.cs中

using System.Linq;using System.Text;using System.Threading.Tasks;using Xamarin.Forms;namespace Test.Views{
public partial class MainPage : MasterDetailPage
{
    public MainPage()
    {

        Master = new MasterPage();
        InitializeComponent();
        masterPage.ListView.ItemSelected += OnItemSelected;

        Detail = new NavigationPage(new Views.HomePage())
        {
            BarBackgroundColor = Color.Black,
            BarTextColor = Color.White,
        };
    }

    public MainPage(string bottomMenu)
    {

        Master = new MasterPage();
        InitializeComponent();
        masterPage.ListView.ItemSelected += OnItemSelected;

        if ("News" == bottomMenu)
        {
            Detail = new NavigationPage(new Views.HomePage())
            {
                BarBackgroundColor = Color.Black,
                BarTextColor = Color.White,
            };
        }
        else if ("Profile" == bottomMenu)
        {

            Detail = new NavigationPage(new Views.Profile())
            {
                BarBackgroundColor = Color.Black,
                BarTextColor = Color.White,
            };
        }
    }

    async void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
    {
        try
        {
            var item = e.SelectedItem as MasterPageItem;
            if (item != null)
            {
                if (item.Title == "News")
                {
                    Detail = new NavigationPage(new Views.NewsPage())
                    {
                        BarBackgroundColor = Color.Black,
                        BarTextColor = Color.White,
                    };
                }

                if (item.Title == "Home")
                {

                    Detail = new NavigationPage(new Views.HomePage())
                    {
                        BarBackgroundColor = Color.Black,
                        BarTextColor = Color.White,
                    };
                }
                if (item.Title == "Profile")
                {

                    Detail = new NavigationPage(new Views.Profile())
                    {
                        BarBackgroundColor = Color.Black,
                        BarTextColor = Color.White,
                    };
                }

                masterPage.ListView.SelectedItem = null;
                IsPresented = false;
            }
        }
        catch (Exception ex)
        {

        }

    }
}}

MasterPage.xaml

<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"             x:Class="Test.Views.MasterPage">  <ContentPage.Content>
<StackLayout   VerticalOptions="FillAndExpand" BackgroundColor="#10000c" Padding = "0,50,0,0" >
  <StackLayout  x:Name="slUserProfile" Orientation="Vertical" Spacing = "0" 
                VerticalOptions="FillAndExpand">
    <Image Source="{Binding member_image}" x:Name="imgSideImage"
             HorizontalOptions="CenterAndExpand" Aspect="AspectFill" HeightRequest="100" 
             WidthRequest="100" />

    <Label Text="{Binding name}" TextColor="#efa747" 
                          FontSize ="17"
                          HorizontalOptions="CenterAndExpand"/>
  </StackLayout >

  <ListView x:Name="lvSideMenu" VerticalOptions="FillAndExpand" SeparatorVisibility="None" 
            BackgroundColor="Black">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ViewCell>
          <StackLayout Padding="15,5,0,0" Orientation="Horizontal">
            <Image Source="{Binding IconSource}"/>
            <StackLayout Padding = "10,0,0,0">
              <local:CustomLabel Text="{Binding Title}" VerticalOptions="CenterAndExpand"
                   TextColor="#dac6ac" FontSize ="14"/>
            </StackLayout>
          </StackLayout>
        </ViewCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</StackLayout></ContentPage.Content></ContentPage>

MasterPage.xaml.cs

using Xamarin.Forms;namespace Test.Views{
public partial class MasterPage : ContentPage
{
    public ListView ListView { get { return lvSideMenu; } }
    public Page Detail { get; set; }
    public MasterPage()
    {
        InitializeComponent();
        var masterPageItems = new List<MasterPageItem>();  
        //Fills side menu items.
        masterPageItems.Add(new MasterPageItem
        {
            Title = "Profile",
            IconSource = "profile_sidemenu.png"
        });
        masterPageItems.Add(new MasterPageItem
        {
            Title = "Home",
            IconSource = "home_smenu.png"
        });
        masterPageItems.Add(new MasterPageItem
        {
            Title = "News",
            IconSource = "news_smenu.png"
        });
        lvSideMenu.ItemsSource = masterPageItems;
        Icon = "menu.png";
        Title = "Menu";   
    }
}
public class MenuItems
{
    public string MenuTitle { get; set; }
}
public class MasterPageItem
{
    public string Title { get; set; }
    public string IconSource { get; set; }
}}

HomePage.xaml

<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"           x:Class="Test.Views.HomePage" Title="Home"><ContentPage.Content><StackLayout>   <Label Text="This is Home page"/></StackLayout></ContentPage.Content></ContentPage>

Profile.xaml

<?xml version="1.0" encoding="utf-8" ?><ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         x:Class="Test.Views.Profile" Title="Profile"><ContentPage.Content>   <StackLayout>
    <StackLayout>
      <Label Text="This is Profile page" />
    </StackLayout>
    <StackLayout HeightRequest="80">
      <Grid RowSpacing="0" ColumnSpacing="0" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*"/>
          <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <StackLayout x:Name="tProfile" BackgroundColor="Red" Grid.Column="0" Spacing="0" Padding="0,10,0,10">
          <Image Source="bprofileSel.png" HorizontalOptions="Center" VerticalOptions="End"/>
          <Label Text="Profile" FontSize="10" TextColor="White" HorizontalOptions="CenterAndExpand" VerticalTextAlignment="Center"/>
        </StackLayout>
        <StackLayout x:Name="tNews" BackgroundColor="Black" Grid.Column="1" Spacing="0" Padding="0,10,0,10">
          <Image Source="bNewsUnsel.png" HorizontalOptions="Center" VerticalOptions="End"/>
          <local:CustomLabel Text="News" FontSize="10" TextColor="White" HorizontalOptions="CenterAndExpand" VerticalTextAlignment="Center"/>
        </StackLayout>
      </Grid>
    </StackLayout>
 </StackLayout></ContentPage.Content></ContentPage>

Profile.xaml.cs

Using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Xamarin.Forms;namespace Test.Views{
public partial class Profile : ContentPage
{

    public Profile()
    {

        InitializeComponent();
        try
        {
            tProfile.GestureRecognizers.Add(new TapGestureRecognizer
            {
                Command = new Command(() => ProfileClicked()),
            });

            tNews.GestureRecognizers.Add(new TapGestureRecognizer
            {
                Command = new Command(() => NewsClicked()),
            });
        }
        catch (Exception ex)
        {
        }
    }

    private void ProfileClicked()
    {
        App.Current.MainPage = new MainPage("Profile");
    }

    private void NewsClicked()
    {
        App.Current.MainPage = new MainPage("News");
    }
}}

新闻页面可以设置为与个人资料页面类似。在app.cs中调用MainPage = new MainPage()

此处启动应用程序时,它将显示带有侧边菜单的主页。现在,当我点击一个菜单(从侧面菜单中说出配置文件)时,它会将我带到配置文件页面,根据设计,可以在那里看到底部子菜单。单击它将导致iOS代码中出现空异常。这在android中运行良好。我的假设是根本原因是由于MasterPage重新初始化为Master。但我需要像这样飞行这个要求。请帮帮我。

这是iOS Main.cs中的错误 iOS Error

0 个答案:

没有答案