Xamarin iOS:替换当前标签栏项目中的视图控制器

Posted

技术标签:

【中文标题】Xamarin iOS:替换当前标签栏项目中的视图控制器【英文标题】:Xamarin iOS: Replace View Controller within the current Tab Bar item 【发布时间】:2020-09-29 05:06:04 【问题描述】:

我刚刚开始进行 Xamarin ios(本机)开发,所以请耐心等待我尝试解释我们正在尝试做的事情。

我有一个故事板 Main.storyboard,我在其中设计并构建了一个选项卡栏控制器,以及几个自定义视图控制器,其中一些链接为选项卡。在第一个选项卡上,如果他们未登录,我会有一个登录屏幕。但是,如果他们已登录,我想显示在同一故事板中存在的不同视图控制器(帐户)中定义的视图。

在 LoginController 的 ViewDidLoad() 覆盖中,我有以下代码,我认为这些代码会显示“已登录”帐户视图控制器:

this.PresentViewController(new AccountController(), true, null);

这行代码执行没有错误,但是登录视图仍然显示。 AccountController 中的 ViewDidLoad() 覆盖不会触发。

问题 1:为了用另一个视图控制器替换当前视图控制器,调用此方法是否正确?

现在,如果我将完全相同的代码行放在异步按钮处理程序方法中(特别是 Facebook SDK 登录按钮的 Completed 事件),它实际上会触发 AccountController 中的 ViewDidLoad() 覆盖,但我会收到 NullReferenceException仅引用在情节提要/视图中定义的按钮的行。

问题 2:为什么来自事件处理程序的完全相同的调用会有如此不同的行为?

最后,如果我将 AccountController 设置为选项卡栏选项卡,则 ViewDidLoad() 中引用该按钮的代码将按预期工作。

到目前为止,我对不同视图的所有加载和卸载都由 UITabBarController 自动处理,但现在我正在尝试进行一些手动转换,我很难找到合适的文档t 已过时并适用于我的特定设置。

【问题讨论】:

嗨,如果需要导航到登录页面,稍后需要处理。您可以使用 this.PresentModalViewController(loginPage, true) 进行导航,稍后使用 loginPage.DismissModalViewController(true) 来消除 loginPage 。这种方式可以保持 Tab Bar 控制器显示不同的视图取决于登录的状态。 PresentModalViewController 的行为与上述场景中的PresentViewController 完全相同 一般来说,有一个需要在视图之间切换的选项卡的推荐方法是什么? 【参考方案1】:

一般情况,我们可以在 Navigation Controller 中使用PresentViewController 导航到另一个页面,这应该是一种安全且简单的方法。

推送

流行音乐

然而PresentModalViewController 是一个模型 ViewController,虽然它看起来与 PresentViewController 相同。它不需要在导航控制器的堆栈中,总是在单个视图中使用需要暂时显示,很快就会关闭它。

如果场景需要在运行时重置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
);

【讨论】:

【参考方案2】:

虽然 Junior 的回答为我指明了正确的方向,但最终的解决方案是将第一个选项卡调整为新的 NavigationController,并使用(手动)Segues 在视图之间导航。

转场被添加到情节提要中,视图控制器最终调用PerformSegue('namedSegue', this) 以导航到下一个视图。

【讨论】:

以上是关于Xamarin iOS:替换当前标签栏项目中的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

带有 MVVM Light 的标签栏控制器导航 Xamarin

IOS从标签栏项目执行segue

Xamarin 表单 - 侧边菜单左侧栏、片段和列表视图

Xamarin iOS 自定义视图

如何知道我之前在 iOS 中的标签栏视图控制器是哪个?

C# Monotouch/Xamarin.iOS - 可滚动的 UIView