iOS 全球不支持 PushAsync,请使用 NavigationPage

Posted

技术标签:

【中文标题】iOS 全球不支持 PushAsync,请使用 NavigationPage【英文标题】:PushAsync is not supported globally on iOS, please use a NavigationPage 【发布时间】:2017-12-19 23:05:30 【问题描述】:

当我处理 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 中? 欢迎来到 Stack Overflow!我更改了一些格式以帮助更好地阅读问题。 我有一个标签页,其中的内容是一个列表视图,我想在标签页列表项点击事件上打开一个新的导航页?? 【参考方案1】:

仅在 iOS 中运行时会出现此错误。

在 App.cs Rootpage(Start page) 中给出如下所示

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

现在,我们可以在 Globally 中使用 PushAsyn()

【讨论】:

即使在 android 中也不使用导航页面也会发生同样的错误 还有 UWP。 'PushAsync is not supported globally on Windows, please use a NavigationPage.' 这个答案也是正确的答案,因此删除“仅在 iOS 中运行”可能是安全的。【参考方案2】:

您的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 更改为 TabbedPageTabbedPage 不是这样工作的。您可能应该首先阅读 TabbedPage 的实际工作原理。

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/navigation/tabbed-page/

在您的情况下,您可能应该创建一个具有这样 XAML 的新页面:

<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();

【讨论】:

我有一个标签页,其中的内容是一个列表视图,我想在标签页列表项点击事件上打开一个新的导航页??【参考方案3】:

您应该将 TabbedPage 子页面放入 NavigationPage。以下是 Xamarin 文档中的代码 sn-ps。

在 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);
    

【讨论】:

【参考方案4】:

在此错误中,它会找到根页面,如果我们使用的是主详细信息页面,那么我们必须仅为详细信息页面设置导航。因此,以下将是解决此问题的最佳解决方案。

((RootPage)Application.Current.MainPage).Detail.Navigation.PushAsync(new SearchPage());

【讨论】:

以上是关于iOS 全球不支持 PushAsync,请使用 NavigationPage的主要内容,如果未能解决你的问题,请参考以下文章

Android 全球不支持 PushAsync,请使用 NavigationPage

Xamarin.Forms - Android 全球不支持 PushAsync,请使用 NavigationPage

System.InvalidOperationException:PushAsync 在 Android 上不受全球支持

xamarin 表单中全局不支持 pushasync 的解决方案是啥?

不支持 Xamarin PushAsync 方法

Android 全球不支持推送异步,请使用 NavigationPage