Xamarin.iOS如何通过主页面按钮跳转TabBarController关联的视图控制器
Xamarin.iOS 主页面按钮跳转TabBar指定控制器解决方案
原有方案崩溃原因
- 第一种调用
this.TabBarController.PresentViewController(this.TabBarController.ViewControllers[1], true, null):同一个UIViewController实例不能同时被多个容器控制器管理,也不能同时在视图层级中展示两次,会抛出控制器层级冲突异常直接崩溃 - 第二种设置
TabBarController.SelectedIndex = 1后又调用PerformSegue:重复触发导航动作,若Segue标识符不存在、Segue目标控制器和TabBar子控制器重合、或者导航层级不匹配,都会触发崩溃
正确实现方案
根据你当前按钮所在页面的层级,选择对应方案即可:
场景1:按钮所在主页面属于TabBarController的子控制器(比如是Tab首页的页面)
不需要额外调用Present或Segue,直接切换TabBar的选中下标即可,完整代码如下:
// 主页面图片按钮的点击事件 private void TargetImageBtn_TouchUpInside(object sender, EventArgs e) { // 初始化ActionSheet var actionSheet = UIAlertController.Create("页面简介", "此处填写对应页面的介绍内容", UIAlertControllerStyle.ActionSheet); // 添加「确定」按钮 actionSheet.AddAction(UIAlertAction.Create("确定", UIAlertActionStyle.Default, null)); // 添加「查看页面」按钮 actionSheet.AddAction(UIAlertAction.Create("查看页面", UIAlertActionStyle.Default, clickAction => { // 直接切换到下标为1的Tab即可 this.TabBarController.SelectedIndex = 1; })); // 弹出ActionSheet PresentViewController(actionSheet, true, null); }
场景2:按钮所在主页面是独立启动页/引导页,不属于TabBarController的层级
需要先把TabBarController设置为App根视图控制器,再切换对应下标,核心逻辑如下:
// 「查看页面」按钮点击回调内的逻辑 actionSheet.AddAction(UIAlertAction.Create("查看页面", UIAlertActionStyle.Default, clickAction => { var keyWindow = UIApplication.SharedApplication.KeyWindow; // 若已存在TabBarController作为根控制器,直接切Tab if (keyWindow.RootViewController is UITabBarController existTabBar) { existTabBar.SelectedIndex = 1; } // 若不存在,初始化TabBarController替换根视图 else { var yourTabBar = new YourCustomTabBarController(); // 替换为你自己的TabBarController类 yourTabBar.SelectedIndex = 1; keyWindow.RootViewController = yourTabBar; } }));
注意事项
- 确保TabBarController的
ViewControllers数组长度大于你要设置的SelectedIndex数值,避免数组越界崩溃 - 如果目标Tab嵌套了UINavigationController,直接将
SelectedIndex设置为对应NavigationController的下标即可,不需要额外处理内部导航 - 不要对已经加入
TabBarController.ViewControllers的控制器调用PresentViewController或者重复Push操作,会触发层级冲突异常
内容的提问来源于stack exchange,提问作者I.Weix
相关产品推荐
相关产品推荐

