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:替换当前标签栏项目中的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章