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) 以导航到下一个视图。