Reputation: 11872
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?
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
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.
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.
"PushAsync is not supported globally on iOS, please use a 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
Upvotes: 4
Views: 1108
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