大家好,我不断收到以下信息:

带有System.InvalidOperationException“iOS上不全局支持PushAsync,请使用NavigationPage。”

即使我使用了NavigationPage并根据我的判断正确使用了它。我的F#技能并不出色,因此我肯定认为我在这里做错了,但是,出人意料地发现在F#中很难找到执行Navigation.PushAsync的示例。我确实找到了这段代码,并一直在寻找一个正确的例子。

https://github.com/fsprojects/Tamarin/blob/master/samples/Todo/TodoListMvc.fs

在示例中,我看到此代码包装在async{}

 do! this.Navigation.PushAsync(page = downcast view.Root) |> Async.AwaitIAsyncResult |> Async.Ignore

所以我认为我离这里不太远。这么说,我在做什么错?

AssemblyVersions
  • Xamarin.Forms版本2.3.5.256-pre6
  • FSharp.Core版本4.0.0.1


  • namespace Eclipsefest
    
    open System
    open Xamarin.Forms
    open Xamarin.Forms.Xaml
    
    type MenuItem =
    { Title : string
      TargetType : System.Type }
    
    type MenuPage() =
    inherit ContentPage()
    let _ = base.LoadFromXaml(typeof<MenuPage>)
    member this.Handle_Tapped(sender : Object, arg : EventArgs) =
        let navItem = sender :?> TextCell
        async {
            match navItem.Text with
            | "Information" ->
                do! this.Navigation.PushAsync(page = new NavigationPage(new InfoPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "Events" ->
                do! this.Navigation.PushAsync(new NavigationPage(new EventsPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "BusRoute" ->
                do! this.Navigation.PushAsync(new NavigationPage(new BusRoutePage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "Glasses" ->
                do! this.Navigation.PushAsync(new NavigationPage(new GlassesPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "Merch" ->
                do! this.Navigation.PushAsync(new NavigationPage(new MerchPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "Day" ->
                do! this.Navigation.PushAsync(new NavigationPage(new DayPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | "About" ->
                do! this.Navigation.PushAsync(new NavigationPage(new AboutPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
            | _ ->
                do! this.Navigation.PushAsync(new NavigationPage(new EclipsefestPage()))
                    |> Async.AwaitIAsyncResult
                    |> Async.Ignore
        }
        |> Async.RunSynchronously
    

    代码更新
    open System
    open Xamarin.Forms
    open Xamarin.Forms.Xaml
    
    type MenuItem =
        { Title : string
          TargetType : System.Type }
    
    type MenuPage() =
        inherit ContentPage()
        let _ = base.LoadFromXaml(typeof<MenuPage>)
        member this.Handle_Tapped(sender : Object, arg : EventArgs) =
            this.Navigation.PushAsync(new NavigationPage(new EclipsefestPage())) |> ignore
    

    我也尝试了这一点,并收到了相同的错误。我怀疑我的问题与异步部分有关,但似乎在没有异步的情况下也会抛出相同的异常。

    代码更新2
    open System
    open Xamarin.Forms
    open Xamarin.Forms.Xaml
    
    type MenuItem =
        { Title : string
          TargetType : System.Type }
    
    type MenuPage() =
        inherit ContentPage()
        let _ = base.LoadFromXaml(typeof<MenuPage>)
        member this.Handle_Tapped(sender : Object, arg : EventArgs) =
            let page = new EclipsefestPage()
            let navpage = new NavigationPage(page)
            let result = this.Navigation.PushAsync(navpage)
            result.RunSynchronously()
    

    我开始感觉到这是一个错误。我已经验证了该页面和导航页面在调用Navigation.PushAsync之前是在各个步骤中实例化的,并且仍然会遇到相同的异常。

    错误

    “iOS上不全局支持PushAsync,请使用NavigationPage。”

    堆栈跟踪
    System.InvalidOperationException: PushAsync is not supported globally on iOS, please use a NavigationPage.
      at Xamarin.Forms.Platform.iOS.Platform.Xamarin.Forms.INavigation.PushAsync (Xamarin.Forms.Page root, System.Boolean animated) [0x00000] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Platform.cs:154
      at Xamarin.Forms.NavigationProxy.OnPushAsync (Xamarin.Forms.Page page, System.Boolean animated) [0x00022] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:190
      at Xamarin.Forms.NavigationProxy.PushAsync (Xamarin.Forms.Page root, System.Boolean animated) [0x00013] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:109
      at Xamarin.Forms.NavigationProxy.OnPushAsync (Xamarin.Forms.Page page, System.Boolean animated) [0x00022] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:190
      at Xamarin.Forms.NavigationProxy.PushAsync (Xamarin.Forms.Page root, System.Boolean animated) [0x00013] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:109
      at Xamarin.Forms.NavigationProxy.OnPushAsync (Xamarin.Forms.Page page, System.Boolean animated) [0x00022] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:190
      at Xamarin.Forms.NavigationProxy.PushAsync (Xamarin.Forms.Page root, System.Boolean animated) [0x00013] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:109
      at Xamarin.Forms.NavigationProxy.PushAsync (Xamarin.Forms.Page root) [0x00000] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\NavigationProxy.cs:102
      at <StartupCode$Eclipsefest>[email protected] (Microsoft.FSharp.Core.Unit unitVar) [0x00090] in /Users/terrancesmith/Projects/Eclipsefest/Eclipsefest/MenuPage.xaml.fs:19
      at Microsoft.FSharp.Control.AsyncBuilderImpl+callA@851[b,a].Invoke (Microsoft.FSharp.Control.AsyncParams`1[T] args) [0x00047] in <5584acdb904cf4daa7450383dbac8455>:0
      at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/10.10.0.36/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151
      at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a] (Microsoft.FSharp.Control.AsyncBuilderImpl+Result`1[T] res) [0x00030] in <5584acdb904cf4daa7450383dbac8455>:0
      at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a] (System.Threading.CancellationToken token, Microsoft.FSharp.Control.FSharpAsync`1[T] computation, Microsoft.FSharp.Core.FSharpOption`1[T] timeout) [0x000a3] in <5584acdb904cf4daa7450383dbac8455>:0
      at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T] (Microsoft.FSharp.Control.FSharpAsync`1[T] computation, Microsoft.FSharp.Core.FSharpOption`1[T] timeout, Microsoft.FSharp.Core.FSharpOption`1[T] cancellationToken) [0x00071] in <5584acdb904cf4daa7450383dbac8455>:0
      at Eclipsefest.MenuPage.Handle_Tapped (System.Object sender, System.EventArgs arg) [0x00008] in /Users/terrancesmith/Projects/Eclipsefest/Eclipsefest/MenuPage.xaml.fs:16
      at Xamarin.Forms.Cell.OnTapped () [0x00008] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Cells\Cell.cs:106
      at Xamarin.Forms.TextCell.OnTapped () [0x00000] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\Cells\TextCell.cs:82
      at Xamarin.Forms.TableView+TableSectionModel.OnRowSelected (System.Object item) [0x00007] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\TableView.cs:214
      at Xamarin.Forms.TableModel.RowSelected (System.Object item) [0x0001a] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\TableModel.cs:65
      at Xamarin.Forms.TableModel.RowSelected (System.Int32 section, System.Int32 row) [0x00000] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Core\TableModel.cs:57
      at Xamarin.Forms.Platform.iOS.TableViewModelRenderer.RowSelected (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath) [0x00000] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Renderers\TableViewModelRenderer.cs:85
      at at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
      at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/4691/d2270eec/source/xamarin-macios/src/UIKit/UIApplication.cs:79
      at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/4691/d2270eec/source/xamarin-macios/src/UIKit/UIApplication.cs:63
      at Eclipsefest.iOS.Main.main (System.String[] args) [0x00001] in <59853c0a6da8a60ca74503830a3c8559>:0
    

    最佳答案

    回答来自Xamarin的人们。

    在显示的代码中,您正在包装要推送的新页面
    在NavigationPage中。但是这是您从中推送的页面
    需要在导航页面中。

    最简单的方法是将初始页面包装在
    然后将NavigationPage设置为MainPage。然后,您只需推动新
    直接浏览页面而无需将其包装在另一个NavigationPage中,因为
    这样做会导致其他问题。看看这个:

    https://gist.github.com/jimmgarrido/d0b702c1282faa5bb91d0ed14e2d7e1b

    namespace FForms
    
    open System
    open Xamarin.Forms
    
    type TestPage() as this =
        inherit ContentPage()
    
        let nextBtn = Button(Text = "Next Page")
        let layout = StackLayout()
    
        let handler = EventHandler(fun sender args ->
            let newPage = ContentPage(BackgroundColor = Color.Red)
            do this.Navigation.PushAsync(newPage))
    
        do nextBtn.Clicked.AddHandler handler
        do layout.Children.Add nextBtn
        do base.Content <- layout
    
    type App() =
        inherit Application(MainPage = NavigationPage(TestPage()))
    

    希望这可以帮助!

    做到了〜

    10-08 03:08