在iOS上,全局不支持PushAsync操作,请使用NavigationPage。

10

当我处理 ListView 项的 Tap 事件时,一切都正常工作,但是当我在 TabbedPage 中使用它时,会显示异常,请提供解决此问题的方案,谢谢。

异常:在 iOS 上全局不支持 PushAsync,请使用 NavigationPage。

以下是 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" xmlns:local="clr-namespace:NavTest" x:Class="NavTest.NavTestPage" Title="Home">
        <ContentPage.Content>
            <StackLayout Orientation="Vertical" VerticalOptions="Center">
                <Label Text="Welcome to Xamarin Forms!" VerticalOptions="Center" HorizontalOptions="Center" />
                <!--<Button Text="Go to " BackgroundColor="Lime" VerticalOptions="Center" Clicked="Handle_Clicked" >
            </Button>-->
                <ListView x:Name="myListView" ItemSelected="Handle_ItemSelected">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Label Text="{Binding}" VerticalOptions="Center" HorizontalOptions="Center" />
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>

这里是OnClick处理程序:

    async void Handle_Clicked(object sender, System.EventArgs e)
    {
        await  Navigation.PushAsync(new Page1());
    }                    

你的 ContentPage 是否包含在 NavigationPage 中? - Jason
欢迎来到 Stack Overflow!我更改了一些格式以帮助问题更易读。 - Joe Mayo
我有一个选项卡页面,其中内容是一个列表视图,我想在选项卡列表项点击事件上打开一个新的导航页面。 - akshay dilod
4个回答

20

只有在iOS运行时会出现此错误。

在App.cs的Rootpage(启动页面)中像下面这样设置:

 public App()
  {
      MainPage=new NavigationPage(new LoginPage());
  }

现在,我们可以全局使用PushAsync()。


3
即使在Android中,如果您不使用导航页面,也可能会发生相同的错误。 - FreakyAli
在 UWP 上,'PushAsync 在全局上不受支持,请使用 NavigationPage。' 这个答案也是正确的,因此删除“仅在 iOS 上运行”可能是安全的。 - ruffin

4

您可能在App.xaml.cs中有类似以下代码:

public App()
{
    InitializeComponent();

    var tabs = new TabbedPage();    
    tabs.Children.Add(new NavTestPage() { Title = "Tab title" });
    MainPage = tabs;
}

您应该更改为:

public App()
{
    InitializeComponent();

    var tabs = new TabbedPage();
    var page = new NavTestPage() { Title = "Page title" };    
    tabs.Children.Add(new NavigationPage(page) { Title = "Tab title" });

    MainPage = tabs;
}

通过将页面包装在NavigationPage中,您可以选择将页面推入导航堆栈。一个TabbedPage本身就只是带有每个选项卡1个页面的选项卡。这应该给您提供以下结构:

TabbedPage
    NavigationPage
        ContentPage
    NavigationPage
        ContentPage
    NavigationPage
        ContentPage

更新: 我猜你正在做的事情只是在你的XAML中将ContentPage更改为TabbedPage。这不是TabbedPage的工作方式。你应该先阅读一下TabbedPage的实际工作原理。 在你的情况下,你应该创建一个具有以下XAML的新页面:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/navigation/tabbed-page/
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:local="clr-namespace:NavTest"
            x:Class="NavTest.MyTabbedPage">
    <NavigationPage Title="NavTest">
        <x:Arguments>
            <local:NavTestPage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage>

将此设置为App.xaml.cs中的MainPage

public App()
{
    InitializeComponent();
    MainPage = new MyTabbedPage();
}

我有一个选项卡页面,其中内容是一个列表视图,我想在选项卡列表项点击事件上打开一个新的导航页面。 - akshay dilod

1
在这个错误中,它会去寻找根页面,如果我们正在使用主细节页面,则必须仅为详细页面设置导航。因此,以下将是最佳解决方案。
((RootPage)Application.Current.MainPage).Detail.Navigation.PushAsync(new SearchPage());

1
你应该将TabbedPage子页面放入NavigationPage中。以下是来自Xamarin文档的代码片段。
在Xaml中:
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:local="clr-namespace:TabbedPageWithNavigationPage;assembly=TabbedPageWithNavigationPage"
        x:Class="TabbedPageWithNavigationPage.MainPage">
    <local:TodayPage />
    <NavigationPage Title="Schedule" Icon="schedule.png">
        <x:Arguments>
            <local:SchedulePage />
        </x:Arguments>
    </NavigationPage>
</TabbedPage>

或者在代码中:
public class MainPageCS : TabbedPage
{
    public MainPageCS ()
    {
        var navigationPage = new NavigationPage (new SchedulePageCS ());
        navigationPage.Icon = "schedule.png";
        navigationPage.Title = "Schedule";

        Children.Add (new TodayPageCS ());
        Children.Add (navigationPage);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接