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
- 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'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>.$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