Terrance
Terrance

Reputation: 11872

Getting "PushAsync is not supported globally on iOS..." while USING NavigationPage

Ello all, I keep getting the following:

System.InvalidOperationException with "PushAsync is not supported globally on iOS, please use a NavigationPage."

Even though I am using a NavigationPage and am using it properly from what I can tell. My F# skills aren't amazing so I'm definitely thinking I'm doing something wrong here but, surprisingly finding examples of preforming a Navigation.PushAsync are hard to come by in F#. I did find this bit of code and have been looking to it for an example of what right looks like.

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

In the example I see this code wrapped in an async{}

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

so I don't think I'm too far off here. With that said, what am I doing wrong?

AssemblyVersions

Code

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

code update

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

I've also tried just this bit and received the same error. I suspected that my issue was with the async portion but it appears to throw the same exception without async as well.

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

I'm starting to get the feeling that this is a bug. I've verified that the page and the navigation page are instantiated in individual steps prior to calling Navigation.PushAsync and am still getting the same exception.

Error

"PushAsync is not supported globally on iOS, please use a NavigationPage.""

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>[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

Upvotes: 4

Views: 1108

Answers (1)

Terrance
Terrance

Reputation: 11872

Answer From the folks at Xamarin.

In the code you showed, you are wrapping the new page you want to push in a NavigationPage. However it's the page you are pushing from that needs to be in a navigation page.

The easiest way to do this is to wrap your initial page in a NavigationPage then set it as the MainPage. Then you just push the new pages directly without wrapping them in another NavigationPage because doing so will cause other issues. Check it out:

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

Hope this helps!

It Did~

Upvotes: 1

Related Questions