Receiving "PushAsync is not supported globally on iOS ..." while USING NavigationPage
Ello all, I keep getting this:
System.InvalidOperationException
since "PushAsync is not globally supported on iOS, please use NavigationPage."
Even if I use NavigationPage
and use it correctly from what I can tell. My F # skills are not surprising, so I definitely think I am doing something wrong here, but surprisingly Navigation.PushAsync
it is hard to find examples of preforms in F #. I found this piece of code and searched for an example of what this looks like.
https://github.com/fsprojects/Tamarin/blob/master/samples/Todo/TodoListMvc.fs
In this example, I see this code wrapped in async{}
do! this.Navigation.PushAsync(page = downcast view.Root) |> Async.AwaitIAsyncResult |> Async.Ignore
so I don't think I'm too far from here. Having said that, what am I doing wrong?
AssemblyVersions
- Xamarin.Forms Version 2.3.5.256-pre6
- FSharp.Core version 4.0.0.1
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 also tried just this bit and got the same error. I suspected my problem was with the async part, but it seems to be throwing the same non-async exception.
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 get the feeling that this is a bug. I have verified that the page and navigation page are created with separate steps prior to the call Navigation.PushAsync
, and I still get the same exception.
Mistake
"PushAsync is not globally supported on iOS, please use 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>.$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
source to share
Answer From people at Xamarin.
In the code you showed, you wrap the new page you want to click in the NavigationPage. However, this is the page you are pushing away from this should be on the navigation page.
The easiest way to do this is to wrap your start page in Then the NavigationPage sets it to MainPage. Then you just push the new pages without wrapping them in another NavigationPage because that will lead to other problems. Check it:
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!
He did ~
source to share