UINavigationController方法pushViewController:参数不能传递UITabBarController原因猜想

UITabBarController和UINavigationController的整合使用 好多项目都同时用到了UITabBarController和UINavigationController,XCode可以直接创建这两个控制器中的其中一个,但是要一起用的话就得稍微麻烦点。层级关系首先得搞清这两个控制器之间的层级关系,我们直接看官网给的图,如下所示:从这张图可以看到:最右边的Assembled views是呈现给用户的界面,它左边的Window是最底层的窗口,重点来了,再往左,是Tab 阅读详情

最近做的一个项目界面如下:

UINavigationController

---->UITabBarController

但是看到pushViewController方法中有这样的描述:

"The view controller to push onto the stack. This object cannot be a tab bar controller. "

感到疑惑,为何UINavigationController could be embedded in UITabBarController,反之则不行呢?

转化一下如下:

  1. UITabBarController -> UINavigationController(YES)
  2. UINavigationController -> UITabBarController(NO)
同样是苹果官方提供的container view controller,为什么会有这个区别呢?

*************************************************************************************************************************

再次声明以下原因仅为个人猜想:

    鉴于使用习惯和API设计考虑
80%-90%的app是以UITabBarController为根控制器,UINavigationController作为其中的tab,故关系1为 YES,api设计上我们看下头文件,tabBarController/navigationController通过扩展为UIViewContoller添加属性,如果关系 2 为 YES,以下头文件可看出,会导致tabBarController不知道指向哪一个。
  1. 我们平时工作中关系1我们一直用,即一般都会为UITabBarController添加几个UINavigationController,那关系1为YES我们可以理解,那这对关系2有什么影响呢,我吃肉也不代表我不吃素啊?
  2. 先看下两个类的头文件

    UITabBarController.h
    @interface UIViewController (UITabBarControllerItem)
    
    @property(nullable, nonatomic, readonly, strong) UITabBarController *tabBarController; // If the view controller has a tab bar controller as its ancestor, return it. Returns nil otherwise.
    
    @end

    UINavigationController.h
    @interface UIViewController (UINavigationControllerItem)
    
    @property(nullable, nonatomic,readonly,strong) UINavigationController *navigationController; // If this view controller has been pushed onto a navigation controller, return it.
    
    @end

    头文件中可看出任何UIViewController都可以直接获取tabBarController或navigationController。假设以上关系 2 为 YES,如果界面结构如下:

    UITabBarController

    ---->UINavigationController

    ---->UITabBarController

    那么属性tabBarController为哪一个UITabBarController?

*************************************************************************************************************************

关于使用container view controller:

  • 自定义的container view controller当不作为根控制器时,最好不要添加系统定义的可整屏切换的container view controller作为子视图,如UITabBarController/UINavigationController,可以添加局部切换的container view controller,如UIPageViewController。
  • 自定义container view controller作为根控制器时,其它container view controller最好不要再添加此container view controller作为子视图。

  1. 自定义的类似UITabBarController的container view controller只允许添加非container view controller的UIViewController,除非作为root view controller。
  2. 自定义的类似UINavigationController的container view controller不允许添加类似UITabBarController的container view controller。
PS:欢迎大家一起讨论,多多指教。


iOS高仿支付宝实战:从架构到UI还原的完整指南 iOS开发中,复杂界面与流畅交互始终是工程实践的核心挑战。以UIStackView为代表的现代布局框架,通过自动处理等分布局与间距,大幅降低了多层级页面的构建成本;而WKWebView的原生与H5混编能力,则为动态运营页面提供了灵活方案。这些技术在高密度信息展示场景中具有显著价值。当我们需要复刻支付宝这类功能复杂、页面跳转频繁的应用时,合理的架构分层与组件化设计便成为关键。通过Router路由解耦模块、采用MVC与MVVM结合的方式瘦身控制器,并结合自动化测试保障稳定性,可以系统性地提升代码质量与开发效率。 阅读详情

相关推荐

页面跳转 UITabBarController+UINavigationController+UIViewController

页面跳转 UITabBarController+UINavigationController+UIViewController

iOS开发进阶(十一):ViewController 控制器详解

iOS 界面开发最重要的首属和View是View的控制器,也就是一般的页面,用来管理页面的生命周期(它相当于安卓里的Activity,两者很像,但又有一些差异)。的特点是它有好几种。一种最基本的。所谓容器,就是它们本身不能单独用来显示,必须在里面放一个或几个。用于导航栏管理页面;用于底部tab管理页面;用于切换器管理页面;容器还可以嵌套,比如把放进里面,这样在tab页面里,可以用启动导航栏样式的二级子页面。

IT全栈 华强工作室 3062

RedHat 9 替换yum源镜像

引言:我们个人通常使用的红帽系统yum源是需要注册付费的,所以在使用yum源安装一些软件时无法正常安装(例如:MySQL),这时我们就需要将yum源替换为CentOS对应的源,以实现在红帽系统中正常安装软件。

YUJIAOZHU666的博客 3738

iOS 因为reason: 'Pushing the same view controller instance more than once is not supported而奔溃(下)...

这个问题是什么意思呢,之前遇到过几次,但程序再次打开时没有问题,也就没有重视,今天又遇到了,无法忍受啊。 控制台报的错误是:“不支持多次推入相同的视图控制器实例“。 什么原因造成的呢? 提示了LoginViewController .在进入这个页面的时候,有多次重复push操作。具体什么原因,在一个控制器里有多次执行push进同一个控制器的操作。 昨天没有时间深究具体...

dijuanmang3059的博客 461

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.youkuaiyun.com/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.youkuaiyun.com/gyxx1998/

gyxx1998的博客 9944

STM32多模式智能小车状态机设计与中断优先级实践

在嵌入式实时系统中,状态机是实现多任务协同与功能切换的核心范式。其本质是通过有限状态集合、明确转移条件和确定性动作,构建可预测、易维护的控制逻辑。基于STM32等资源受限MCU时,需兼顾状态调度效率、中断并发安全与硬件资源约束。关键技术价值体现在:提升系统模块解耦度、支持物理按键与蓝牙双源触发、保障实时响应不丢帧。典型应用场景包括智能小车多模运行(循迹、避障、遥控、定距跟随等)、工业设备工作模式切换及IoT终端低功耗状态管理。本文以STM32F103C8T6平台为例,深入解析全局模式变量设计、双通道状态切换

weixin_42509888的博客 93

从系统UITabbar到自定义UITabbar

自述技术菜鸟第一篇博文,目的是自我总结,自省。一直有写博客的打算,一直未跨出这步,就此作为闭眼摸出的第一步。 到目前为止,我所参加的App项目都是基于UITabbarController上的多层页面展示。之前都是在别人搭建好的框架上实现部分功能,或用系统自带的UITabbarController做简单的应用。这次有幸从0开始,经过摸索做出完整的app,需要总结的地方颇多。自定义Tabbar的基本实

Jader_Y的博客 801

2025美赛E题为农业留出空间(附代码+全保姆教程)Making Room for Agriculture

有机农业的核心在于减少化学投入,促进自然控制和可持续性。变量定义CCC: 作物种群III: 害虫种群PPP: 天然捕食者种群(蝙蝠、鸟类等)BBB: 生物多样性水平(以种类数量表示)SSS: 土壤健康指数(影响植物繁殖与作物生长)EEE: 农业生态系统的整体稳定性。

博客 1495

UINavigationController及界面传值

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; sel

weichentai的博客 598

MIKE水动力笔记1_岸线及水深数据之依靠全球数据库资源提取的方法

通过各种数据库资源来获取全球岸线及水深数据,这种方法获取的岸线及水深数据精度偏低,比较适合大尺度范围的水动力研究。

晏长街的博客 1万+

Open3D 计算FPFH特征【2025最新版】

FPFH特征描述子的python实现,本文最新更新时间为:2025年3月18日。

点云侠的博客 5275

【UI初级--连载六】---------导航控制器(UINavigationController)

内容简介: 1、创建导航控制器  2、push、pop、root、index  3、设置导航栏 导航控制器UINavigationController是用来管理子控制器的切换的大管家 导航控制器是个管理型的控制器,他本身不显示视图内容,而是管理子控制器的视图显示 UINavigationController是UIViewController的子类 一、创建导航控制器 APP

Wing_n的博客 621

【人工智能】OpenClaw网关API速率限制报错全解析 API rate limit reached. Please try again later.

对应HTTP标准状态码为429(请求过多)。该报错集中出现在OpenClaw GATEWAY DASHBOARD的聊天会话界面,核心特征为:用户最初以为是单一模型服务商的问题,先后更换OpenAI、Gemini、Ollama、Moonshot、Mercury-2等多个主流大模型API后,该报错仍稳定触发,尤其在执行复杂任务时高频出现。

奶爸的编程之路,也就一周冷个三天 6459

iOS --- UINavigationController的简单总结

UINavigationController是iOS开发中常用的用于视图切换的控制器. 在对象管理上, UINavigationController采用stack的方式来管理各个view的层级, rootViewController在stack的最底层. 同时, 也提供了诸多方法用于进行view之间的切换及管理等.常见的方法有pushViewController与popViewController等, 需要注意的是UINavigationController对应的segue的属性要设置为push方式.

icetime17的专栏 1969

浅谈innovus Update io latency相关作用

同样我们使用update io latency,工具取launch clock latency负值反标到clock端口上,同时认为capture clock latency与launch clock latency相等,这样可以相互抵消,这样setup time slack = T – Tsetup -Tcomb – Toutput_delay,因此采用update io latency后,reg2out timing path的setup check变得真实些。图3 in2reg示意图。

芯冰乐 475

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[iOS开发]2020.9.6-2020.9.12笔记

用UINavigationController的时候使用pushViewController:animated ----返回之前的视图[[self navigationController] popViewControllerAnimated:YES]; —ps:push以后会在navigation的left bar自动添加back按钮,它的响应方法就是返回。所以一般不需要写返回方法,点back按钮即可。 其他时候用presentModalViewController:animated [self pre.

复杂化的博客 332

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

UIkit基本框架

本文包含了IOS界面开发中的常用控件以及其他相关知识,持续更新中

2301_77900444的博客 405

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

关于极光推送的问题

今天第一次做推送,遇到了很多问题, 记录一下。。。。。。。。。 1.用CocoaPods 下载是最快、最简单的途径 ,只需在 podfile 文件中添加一下代码即可,具体集成,官网文档很清楚,不具体说明了 我遇到的问题是当App接收到通知之后,跳转到指定界面,极光推送有2个接收消息的方法 1.1 当app在运行状态下调用的方法 - (void)jpushNotificationCe

a451852869的博客 996

Coordinator vs MVC:iOS架构模式深度对比及选型指南

在iOS开发中,架构模式的选择直接影响项目的可维护性和扩展性。**Coordinator模式**作为近年来备受关注的新兴架构,与传统的**MVC模式**相比,在导航逻辑解耦和代码组织上展现出显著优势。本文将从原理、优缺点和实战选型三个维度,为你深度解析两种架构的核心差异,助你打造更健壮的iOS应用。 ## 一、MVC模式:经典架构的局限与挑战 ### 1.1 MVC的核心原理 MVC(Mode

gitblog_00102的博客 715

iOS: share项目难点梳理

有一个需要注意的点,就是我们把滚动视图的tableView的第一个cell中, 在调试的过程中, 会发现当我们在滑动tableView的时候, 第一个cell中的定时器会暂停, 然后当停止滑动的时候, 视图会连续翻页,这里涉及到了RootLoop 与 Mode 的知识, 笔者还不太了解, 解决方法就是在创建定时器的时候加上下面这段代码。定义协议, 在列表页要实现协议方法。

for_ever_love__的博客 180

详细讲述iOS自定义转场

转载:http://www.cocoachina.com/ios/20151120/14303.html 本文是iOS自定义视图控制器转场系列的第一篇。本文重点在于创建自定义动画(非交互式)转场。 当使用传统的iOS应用程序时,我们经常在视图间转场。过去,如果你不想用标准的转场动画,全靠你自己,但在iOS 7中苹果提供了一个新的API让我们自定义这些动画。 iOS

u012361288的博客 634

UINavigationController 的 pushViewController不起作用

1.首先你要在AppDelegate.m文件里面以self.view初始化一个UINavigationController:     UINavigationController*nav = [[UINavigationController alloc]initWithRootViewController:self.viewController]; 并以这个nav为window的roo

Damon的专栏 4459

iOS使用UITabbarController跳转(push)界面,如何自动隐藏底部tabbar?

一、首先简单地讲一下UITabbarController的使用方法,直接上代码: //初始化tabbarcontroller - (void)setTabbarController{ NSArray *array = @[contactsNav, businessNav, infoNav, myCoffeeNav]; _tabBarController = [[UITabBarC

iOS开发之路 9347

pushViewController 与 presentViewController 与 TabBarController 之间切换VC

pushViewController 与 presentViewController 与 TabBarController 之间切换VC缘由pushViewController、presentViewController以及TabBarController这3中方法、他们都可以用来切换ViewController。由于在写代码的时候,产生了一些疑惑,切换之前和切换之后的ViewController他

ChSaDiN的专栏 6458

纯代码搭建iOS三级结构(UITabbarController+UINavigationController+UIViewController)

声明:这里所指的三级结构不是网上百度中所经常提及的三级框架或者MVC模式,而是指UITabbarController+UINavigationController+UIViewController。效果图技术要点       三者其实是层层包含的关系,以tabbar为起点(接下来就不写类名全程了,看官们看懂就好),一个tabbar对应多个navigation,每个navigation对应着1个vie

ecjtuacm_yuewei的专栏 2053
上一篇: mac多账户文件共享
下一篇: React Native学习-第一篇
迷失的苍蝇
博客等级 码龄18年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值