了解addChildViewController的使用

2024-02-24

我正在处理一些需要重构的代码。视图控制器充当其他两个视图控制器的容器,并将在它们之间交换,如下面的代码所示。

这可能不是最好的设计。可能不需要以这种方式交换视图控制器。我明白那个。但是,当我使用此代码时,我想进一步了解 addChildViewController 调用会发生什么。我无法在苹果的文档或相关问题中找到答案,在这里(可能表明设计需要改变)。

具体来说 - 容器视图控制器如何处理被要求添加已经添加的子视图控制器的情况?它是否认识到它已经添加了该视图控制器对象?

例如。如果下面的代码位于一个方法内 - 并且该方法被调用两次......

[self addChildViewController:viewControllerB];
[self.view addSubview:viewControllerB.view];
[viewControllerB didMoveToParentViewController:self];

[viewControllerA willMoveToParentViewController:nil];
[viewControllerA.view removeFromSuperview];
[viewControllerA removeFromParentViewController];

谢谢, 加文


一般来说,他们的视图控制器“遏制”指南 http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/AboutViewControllers/AboutViewControllers.html,当其中一个包含另一个时,应遵循以确定是否需要实施遏制。

特别是,担心两次添加相同的子视图控制器就像担心两次呈现相同的视图控制器一样。如果你真的考虑清楚了,你就不需要面对这个问题。你的预感是正确的。

我同意苹果的文档应该更预先地说明奇怪的参数或乱序调用时会发生什么,但这也可能是不想将自己与纠错设计联系起来,这会在路上造成麻烦。当你设计出一个永远不会以错误的方式调用这些方法的设计时,你就正确地解决了问题,并使自己独立于它们可能有或没有的任何错误纠正——如果你考虑到这一点,那就更重要了,因为它不是据记录,错误纠正将来可能会以不同的方式工作,从而破坏您的应用程序。

更进一步,您会注意到 Apple 的容器视图控制器无法进入无效状态(至少使用公共 API 不容易)。与一个UITabViewController,从一个视图控制器切换到另一个视图控制器是一项原子操作,并且选项卡视图控制器在任何时间点都准确地知道发生了什么。它最多要做的就是删除活动的并显示新的。唯一一次它把所有东西都从水中吹出来的时候是当你告诉它“你应该把所有东西从水中吹出来并开始使用这些视图控制器”时。

为其他任何事情编写代码,例如删除all意见或all视图控制器,无论在某些情况下看起来是否方便或强大,但事实恰恰相反,因为实际上代码的一端不信任代码的另一端来保留其交易的一部分。在任何真正对您有帮助的情况下,这意味着您让人们随意添加视图控制器,而没有您应该想要的控制,在这种情况下,that's你应该解决的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解addChildViewController的使用 的相关文章

  • 如何让iOS 7下的UISwitch不采用其后面视图的背景颜色?

    关闭时看起来像这样 虽然我更喜欢灰色背景 我真的必须使用 UIImageView 吗 以下是我更改 iOS7 UISwitch 的填充颜色的方法 首先您需要导入 QuartzCore import
  • 在 Objective-C 中选择性加载类

    我有模块 但没有来自两个不同的人的源代码 它们都包含相同的类 有没有办法有选择地从模块中加载类 以便重复的类不会发生冲突 是的 我知道这个替代解决方案建议加载和卸载 并且宁愿通过有选择地加载类并完成它来完成 解决 Objective C 命
  • 在 iOS 框架中嵌入框架

    我有一个包含另一个目标 框架 的项目 它是主项目的依赖项 该框架需要它自己的框架 因此我使用 carthage 添加了它们 该项目在模拟器上编译并运行良好 但是在物理设备上运行时出现以下错误 dyld Library not loaded
  • 轻量级核心数据迁移后,如何为现有实体的新属性设置默认值?

    我已经成功完成了核心数据模型的轻量级迁移 我的自定义实体 Vehicle 收到了一个新属性 tirePressure 它是 double 类型的可选属性 默认值为 0 00 当从商店中获取 旧 车辆 在迁移发生之前创建的车辆 时 其 tir
  • iOS:无法让蓝牙管理器工作

    警告 我知道私有框架不会在 App Store 中流行 我尝试使用 BluetoothManager 框架来让我 1 检查设备上是否启用了蓝牙 2 如果未启用 则将其打开 我可以按照找到的说明成功加载蓝牙管理器here https stac
  • 通过 iOS 应用程序在 Twitter 上分享视频

    是否可以使用 SLRequest 分享视频 我可以使用相同的方式共享图像 SLRequest postRequest SLRequest requestForServiceType SLServiceTypeTwitter requestM
  • 如何获取UIImage的大小(KB)

    我从以下位置获取图像didFinishPickingMediaWithInfo UIImage originalImage UIImage info valueForKey UIImagePickerControllerOriginalIm
  • ios ScheduledTimerWithTimeInterval 的时间量

    我想使用 ScheduledTimerWithTimeInterval 来执行一定时间的定期任务 比如说一小时 但我如何在我的代码上实现 这是我的代码 timer NSTimer scheduledTimerWithTimeInterval
  • iOS:如何创建并绘制(并保存)大于屏幕的图像?

    我们正在创建一个 iOS 照片应用程序 为此 我们必须创建动态大小的图像 最大约为 2500x1600 像素 创建此图像后 我们希望以相当快的速度在大图像之上绘制较小的图像 正如我们所看到的 问题在于不可能获得大于屏幕分辨率的上下文 该调用
  • 在 Objective C 中获取第一响应者

    我无法弄清楚哪个UITextField是当前的第一响应者 我想做的是 如果用户单击特定的内容 则设置一个布尔值UITextField 因此 要做到这一点 我需要能够判断这个特定的文本字段是否已成为第一响应者 我知道如何设置第一响应者 但只是
  • 本地通知替代周重复

    我有两个通知 我想隔周重复一次 例如 在第一周的星期一设置一个通知 并应在第三周的星期一重复 第二次通知设置在第二周的星期二 并且应在第四周的星期二重复 为此我该怎么办 获取周数 并根据周数做出决定
  • Firebase 的 Xcode 编译错误

    我刚刚将 Firebase 框架安装到 Xcode 由于存在其他无法解决的问题 没有使用 CocoaPods 我按照 Firebase 替代设置说明进行操作here https www firebase com docs ios alter
  • 如何在 iOS 6 中访问 iPhone 的联系人

    我想在我的应用程序中显示联系人和联系人详细信息 联系人列表以及选择该联系人的任何联系人详细信息后将使用地址簿显示在下一页上 我正在 iOS 6 上工作 提前致谢 以下代码用于检索联系方式详细信息 void viewDidLoad super
  • 如何使用 swift 隐藏导航控制器中的后栏按钮

    在故事板 Xcode 6 iOS 8 和 swift 中 我在导航控制器中嵌入了 TableViewController 从对象库中 我拖放一个栏按钮项目作为后退按钮 它显示一个图标图像 当我单击该按钮时 我显示一个设置视图 我怎样才能隐藏
  • 为什么 Swift UITableViewController 模板在 tableView cellForRowAtIndexPath 方法中使用可选参数?

    如果您创建新的 UITableViewController 类 您将看到重写的注释方法 override func tableView tableView UITableView cellForRowAtIndexPath indexPat
  • 将设备 3D 方向与太阳位置进行比较

    我正在开发一款应用程序 要求用户将 iPhone 对准太阳才能触发特殊事件 我可以基于陀螺仪和 CoreMotion 框架检索设备 3D 方向四元数 从中我可以获得偏航角 滚动角和俯仰角 我还可以根据当前日期和时间 GMT 以及纬度和经度计
  • 适用于 VPN 的 iOS 专用 API

    我正在寻找一些私有 API 来启动在 设置 应用程序中配置的 VPN 连接 有人有什么建议我可以在哪里找到它们吗 我唯一发现的是 ManagedConfiguration framework 这是正确的起点吗 没有任何文档 这有点困难 附
  • 另一个 - “无法识别的选择器发送到实例”问题

    我查看了有关该主题的每个已发布问题 但没有一个给我解决方案 我的项目在很大程度上复制了开发库中的 AVPlayer 演示应用程序 减去清理功能 我有一个复制和粘贴AVPlayerDemoPlaybackView类 重命名为YOPlaybac
  • iOS 中的设备兼容性问题

    我们上传了一个应用程序 在第一个版本中 我们添加了设备功能 电话 以限制信息 plist 中的 iPhone 设备 在第二个版本中 我们忘记添加 电话 并提交给了应用商店 我们计划上传第三个版本 其中设备功能为 电话 但在提交到 App S
  • iOS 所需的设备功能自动对焦相机

    我有一个 iOS 应用程序 我在其中设置Required Device Capabilities配置设置需要两者still camera and auto focus camera因为它需要在具有更好的自动对焦相机传感器的新一代设备上运行

随机推荐

  • Spark 跨接收器的结构化流一致性

    我想在以下情况下更好地理解 Spark 2 2 结构化流的一致性模型 一个来源 Kinesis 从此源向 2 个不同接收器进行 2 次查询 一个用于存档目的的文件接收器 S3 另一个用于处理数据的接收器 数据库或文件 尚未决定 我想了解跨接
  • 覆盖 django 的模型相关管理器

    我如何才能超越关系经理 例如 user entry set django db models fields related RelatedManager 但我需要自己的经理 我尝试这段代码 但这不起作用 class EntryManager
  • 为什么 QObject ::findChildren 返回具有公共基类的子级?

    我使用 QObject 作为复合模式的基类 假设我有一个父类 File 在一个人为的示例中 我向其中添加不同类型的子类 HeaderSection 和 PageSection File HeaderSection 和 PageSection
  • 简单表达式缺少参数类型

    遵循播放 websocket 示例 http www playframework com documentation 2 3 x ScalaWebSockets我遇到了一个奇怪的问题 文档中的以下示例正在运行 Future successf
  • 弹出并刷新视图控制器

    我有三个视图控制器 当我到达第三个视图控制器时 我使用 poptorootviewcontroller 弹出到我的第一个视图控制器 但是当我在第三个视图控制器中使用 popviewcontroller 我想返回到我的第二个视图控制器 时 它
  • 为什么 PowerShell 无法识别带引号的参数?

    当您直接调用脚本 在 PowerShell 控制台或 ISE 中 或通过另一个 PowerShell 实例调用脚本时 为什么 PowerShell 对带引号的参数的处理方式有所不同 这是脚本 TestQuotes ps1 param str
  • scala 中的非最终单例对象有什么意义?

    我一直以为objectScala 中的声明将被编译为final类 因为它们是由有效的匿名类实现的 自从final与非最终类相比 类更容易被 JVM 优化 我认为最终性有好处并且没有成本 所以所有object实施将是最终的 但我一定错过了一些
  • PySpark 使用临时 AWS 令牌进行 s3 身份验证的问题

    我已经设置了本地 PySpark 但是每次我尝试使用 s3a 协议读取文件 s3 时 它都会返回 403 AccessDenied 错误 我尝试连接的账户仅支持 AWS ShouldRole 它为我提供了临时 Access key Secr
  • 如何在不使用 LoadBalancer 类型的情况下发布 Kubernetes 服务(在 GCP 上)

    我想避免使用type LoadBalancer 对于某个 Kubernetes Service 但仍然能够将其发布到互联网上 我正在使用 Google Cloud Platform GCP 来运行当前在单个节点上运行的 Kubernetes
  • android中的fontFamily和typeFace有什么区别?

    android 中的 fontFamily 和 typeFace 有什么区别 当然 我阅读了android开发者网站中的所有描述 但我还不清楚 根据两个词的一般含义 应该是相同的意思 但在android xml属性 textview 中 它
  • 全局覆盖 Emacs 中的键绑定

    如何设置全局覆盖并优先于该键的所有其他绑定的键绑定 我想覆盖所有主要 次要模式映射并确保我的绑定始终有效 这当然行不通 global set key C i some function 它适用于text mode 但是当我使用lisp mo
  • 从 WCF 客户端使用非 wcf SOAP 错误(定义了 SOAP 错误)

    我有一个从 WCF 客户端调用的非 WCF 服务器 我需要访问已注册的肥皂故障 以防服务器抛出它 它包含我需要用户的反馈 我使用了来自的例子如何从 WCF 客户端访问 SOAP 1 1 错误详细信息 无错误契约 https stackove
  • 使用 Java 进行 MongoDB ISODate 字段搜索

    我在使用 Java 搜索 mongodb 中的 ISODate 字段时遇到问题 我想找到完全匹配的日期 以下是我查询第一个集合并获取 ISODate 字段 Timestamp 的方法 一旦我得到这个日期 我想搜索具有相同 时间戳 值的另一个
  • FxCop 和代码分析规则

    我最近开始在 Visual Studio 中的项目中使用代码分析 我创建了一个自定义规则集 用于我的所有项目 其中包括两个 Microsoft 定义的规则集 我一直致力于将 FxCop 集成到 CI 构建过程中 以使未通过所有规则的构建失败
  • 我如何使用 Rugged 来创建和提交文件,就像从命令行一样?

    我正在尝试使用坚固的东西来做一些非常简单的事情 创建并提交一个文件 使存储库处于与执行相同的状态 git init echo blah blah blah gt blah txt git add blah txt git commit m
  • 围绕三角形画布旋转圆

    我想使用画布围绕三角形旋转一个圆 前面有这段代码 但这是中间的圆 还有一个旋转的矩形 我希望圆旋转并在中间有一个三角形 有人可以帮忙吗 这是我的JS代码 var canvas document getElementById canvas v
  • 如何正确使用run_in_executor?

    我尝试使用run in executor并有一些问题 这是代码 基本上是从文档复制粘贴 import asyncio import concurrent futures def cpu bound val CPU bound operati
  • Yii 将数据从一个模型复制到另一个模型

    我是 yii 的新手 我使用扩展的模型从表单中收集数据CFormModel在控制器内部我想将这些数据复制到一个扩展自的模型CActiveRecord为了保存到数据库 是否有一种方法或方式将数据从数据收集模型复制到数据保存模型 而不是通过属性
  • pythonw.exe 还是 python.exe?

    长话短说 pythonw exe什么也没做 python exe不接受任何内容 我应该使用哪一个 test py print a 命令窗口 C path gt pythonw exe test py
  • 了解addChildViewController的使用

    我正在处理一些需要重构的代码 视图控制器充当其他两个视图控制器的容器 并将在它们之间交换 如下面的代码所示 这可能不是最好的设计 可能不需要以这种方式交换视图控制器 我明白那个 但是 当我使用此代码时 我想进一步了解 addChildVie