Xamarin iOS:替换当前选项卡栏项中的视图控制器
Xamarin iOS: Replace View Controller within the current Tab Bar item
我刚刚开始 Xamarin iOS(本机)开发,所以请耐心等待我解释我们正在尝试做的事情。
我有一个故事板 Main.storyboard,我在其中设计并构建了一个 Tab Bar 控制器和几个自定义 View Controller,其中一些链接为选项卡。在第一个选项卡上,如果他们未登录,我有一个登录屏幕。但是,如果他们已登录,我想显示在同一故事板中存在的不同视图控制器(帐户)中定义的视图。
在 LoginController 的 ViewDidLoad() 覆盖中,我有以下我认为会显示 "logged in" 帐户视图控制器的代码:
this.PresentViewController(new AccountController(), true, null);
这行代码执行没有错误,但是仍然显示登录视图。 AccountController 中的 ViewDidLoad() 覆盖不会触发。
问题 1:为了用另一个视图控制器替换当前的视图控制器,调用此方法是否正确?
现在,如果我将这一行完全相同的代码放在异步按钮处理程序方法中(特别是 Facebook SDK 登录按钮的 Completed 事件),它实际上会触发 AccountController 中的 ViewDidLoad() 覆盖,但我收到仅引用 storyboard/view 中定义的按钮的行出现 NullReferenceException。
问题 2:为什么来自事件处理程序的完全相同的调用会有如此不同的行为?
最后,如果我将 AccountController 设置为选项卡栏选项卡,则引用该按钮的 ViewDidLoad() 中的代码将按预期工作。
到目前为止,我所有不同视图的加载和卸载都是由 UITabBarController 自动处理的,但现在我正在尝试进行一些手动转换,我很难找到合适的文档没有过时并适用于我的特定设置。
一般,我们可以在Navigation Controller中使用PresentViewController
导航到另一个页面,这应该是一种安全简单的方法。
推送 :
流行音乐:
然而,PresentModalViewController
是一个模型ViewController,虽然看起来和[=一样12=]。它不需要在 Navigation Controller 的堆栈中,并且总是在单个视图中使用需要临时显示,很快就会关闭它。
如果场景需要在运行时重置RootViewController
,这可以认为是第三种导航方式。
var storyboard = UIStoryboard.FromName("Main", null);
var anotherController = storyboard.InstantiateViewController("AnotherViewController") as AnotherViewController;
UIWindow window = UIApplication.SharedApplication.KeyWindow;
if(window != null)
{
window.RootViewController = anotherController;
}
另外,这将是不安全的使用方式,最好在当前的ViewController
dismiss方法中使用它们:
DismissViewController(true, () => {
// Set Root View Controller
});
虽然 Junior 的回答为我指明了正确的方向,但最终的解决方案是将第一个选项卡调整为新的 NavigationController,并使用(手动)Segues 在视图之间导航。
转场已添加到情节提要中,视图控制器最终调用 PerformSegue('namedSegue', this)
以导航到下一个视图。
我刚刚开始 Xamarin iOS(本机)开发,所以请耐心等待我解释我们正在尝试做的事情。
我有一个故事板 Main.storyboard,我在其中设计并构建了一个 Tab Bar 控制器和几个自定义 View Controller,其中一些链接为选项卡。在第一个选项卡上,如果他们未登录,我有一个登录屏幕。但是,如果他们已登录,我想显示在同一故事板中存在的不同视图控制器(帐户)中定义的视图。
在 LoginController 的 ViewDidLoad() 覆盖中,我有以下我认为会显示 "logged in" 帐户视图控制器的代码:
this.PresentViewController(new AccountController(), true, null);
这行代码执行没有错误,但是仍然显示登录视图。 AccountController 中的 ViewDidLoad() 覆盖不会触发。
问题 1:为了用另一个视图控制器替换当前的视图控制器,调用此方法是否正确?
现在,如果我将这一行完全相同的代码放在异步按钮处理程序方法中(特别是 Facebook SDK 登录按钮的 Completed 事件),它实际上会触发 AccountController 中的 ViewDidLoad() 覆盖,但我收到仅引用 storyboard/view 中定义的按钮的行出现 NullReferenceException。
问题 2:为什么来自事件处理程序的完全相同的调用会有如此不同的行为?
最后,如果我将 AccountController 设置为选项卡栏选项卡,则引用该按钮的 ViewDidLoad() 中的代码将按预期工作。
到目前为止,我所有不同视图的加载和卸载都是由 UITabBarController 自动处理的,但现在我正在尝试进行一些手动转换,我很难找到合适的文档没有过时并适用于我的特定设置。
一般,我们可以在Navigation Controller中使用PresentViewController
导航到另一个页面,这应该是一种安全简单的方法。
推送 :
流行音乐:
然而,PresentModalViewController
是一个模型ViewController,虽然看起来和[=一样12=]。它不需要在 Navigation Controller 的堆栈中,并且总是在单个视图中使用需要临时显示,很快就会关闭它。
如果场景需要在运行时重置RootViewController
,这可以认为是第三种导航方式。
var storyboard = UIStoryboard.FromName("Main", null);
var anotherController = storyboard.InstantiateViewController("AnotherViewController") as AnotherViewController;
UIWindow window = UIApplication.SharedApplication.KeyWindow;
if(window != null)
{
window.RootViewController = anotherController;
}
另外,这将是不安全的使用方式,最好在当前的ViewController
dismiss方法中使用它们:
DismissViewController(true, () => {
// Set Root View Controller
});
虽然 Junior 的回答为我指明了正确的方向,但最终的解决方案是将第一个选项卡调整为新的 NavigationController,并使用(手动)Segues 在视图之间导航。
转场已添加到情节提要中,视图控制器最终调用 PerformSegue('namedSegue', this)
以导航到下一个视图。