Obtener "PushAsync no es compatible globalmente en iOS …" mientras usa NavigationPage

Todo, sigo recibiendo lo siguiente:

System.InvalidOperationException con "PushAsync no es compatible de forma global en iOS, utilice una página de navigation".

A pesar de que estoy usando un NavigationPage y lo estoy utilizando adecuadamente de lo que puedo decir. Mis habilidades F # no son increíbles, así que definitivamente estoy pensando que estoy haciendo algo mal aquí, pero, sorprendentemente, encontrar ejemplos de preformar un Navigation.PushAsync es difícil de encontrar en F #. Encontré este código y lo busqué para ver un ejemplo de cómo se ve el derecho.

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

En el ejemplo veo este código envuelto en un async{}

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

así que no creo que esté demasiado lejos aquí. Dicho esto, ¿qué estoy haciendo mal?

AssemblyVersions

  • Xamarin.Forms Versión 2.3.5.256-pre6
  • FSharp.Core versión 4.0.0.1

Código

 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 

actualización de código

 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 

También probé este bit y recibí el mismo error. Sospeché que mi problema era con la parte asincrónica pero parece arrojar la misma exception sin asíncrono también.

Actualización de código 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() 

Estoy empezando a tener la sensación de que se trata de un error. He verificado que la página y la página de navigation se instancian en pasos individuales antes de llamar a Navigation.PushAsync y todavía estoy recibiendo la misma exception.

Error

"PushAsync no es compatible a nivel mundial en iOS, utiliza una página de navigation". "

StackTrace

 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>.$MenuPage.xaml+Handle_Tapped@17.Invoke (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 

Respuesta de la gente de Xamarin.

En el código que mostraste, estás envolviendo la nueva página que deseas insert en un NavigationPage. Sin embargo, es la página que está presionando desde que debe estar en una página de navigation.

La forma más fácil de hacerlo es envolver su página inicial en un NavigationPage y luego configurarlo como MainPage. Luego simplemente presiona las páginas nuevas directamente sin envolverlas en otra página de navigation porque hacerlo causará otros problemas. Echale un vistazo:

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

¡Espero que esto ayude!

Lo hizo ~