UIViewController诞生的过程是怎样的(哪个方法遵循哪个)?

2023-12-01

有很多方法可以覆盖,例如initWithNibname:, awakeFromNib, loadView, viewDidLoad, viewDidAppear:, layoutSubviews,我只是无法决定调用这些方法的顺序。

我只是“用心”重写其中一个。

有详细解释吗?


幕后发生了很多事情Cocoa视图和viewController管理.

1.viewController对象

从最基本的角度来说,viewController 是一个通用的控制器对象。当它第一次分配并初始化时,它没有与之关联的视图对象。仅当需要时才会实例化视图。因此,在不考虑视图的情况下,viewController 的生命周期与任何其他对象相同:

UIViewController * myVC = [[UIViewController alloc] initWith...];
...
[myVC release];

viewControllers 的指定初始值设定项是-initWithNibname:bundle:。如果您指定一个笔尖,viewController 可以自动从该笔尖加载其视图并连接您已定义的任何 IBOutlet(有关更多详细信息,请参阅下文)。

2. 加载和卸载视图

viewController 将根据需要加载其视图。这通常发生在-view方法是第一次调用,并且可能在程序中的任何时间发生,具体取决于您初始化 UI 的方式。在程序的生命周期中,视图也可能被销毁并重新加载多次,具体取决于您管理 UI 的方式。当 viewController 识别出它的视图是必需的但尚未加载时,-loadView方法将被调用。基本的消息流是这样的:

view
  loadView
  viewDidLoad

请注意,如果您覆盖-view方法,-loadView and viewDidLoad不会被自动调用。如果你覆盖-loadView, you must设置viewController的view财产。否则,下次调用-view将再次触发加载过程。

视图也可以在程序生命周期内的任何时候被卸载,只需设置view财产给nil。默认实现-didReceiveMemoryWarning只要视图没有超级视图(即,如果它当前不是活动视图层次结构的一部分),就会自动执行此操作。消息流程如下:

view = nil
   viewDidUnload

2a.以编程方式加载视图

如果您选择覆盖-loadView,您可以以任何您喜欢的方式创建视图、子视图、其他视图控制器以及这些对象之间的任何连接。当然,这意味着您还负责您创建的对象的内存管理。如果你的子类重写了-loadView,它应该使用初始化nil对彼此而言nibName and bundle.

2b.从笔尖加载视图

如果使用 nib 文件,则默认实现-loadView将自动打开该 nib 文件,实例化其对象,添加它们之间的任何连接,并为您处理内存管理。

对于 nib 文件,事情会变得更加棘手,因为幕后发生了很多事情。这-awakeFromNib方法被调用每个物体它在加载 nib 文件时实例化,并且不能保证调用时 nib 文件中的其他对象已完全加载。

3. 显示视图

-viewWillAppear:, -viewDidAppear:, -viewWillDisappear: and -viewDidDisappear:仅当视图在屏幕上显示或隐藏时才会调用,尤其是在从一个视图到另一视图的动画转换期间。当视图在导航方案中换入换出时,这些方法可能会在程序的生命周期内被多次调用。

4.视图布局

The -layoutSubviews方法是not部分UIViewController。呼吁UIView当对象的边界发生改变时。如果您使用自定义UIView如果您在程序中创建了子类,则此方法可用于执行自定义子视图布局,而不是依赖 Cocoa 默认的自动调整大小方法。

5. 将所有内容放在一起

由于其复杂性,此过程有多种不同的方式发生,但正常的时间线可能如下所示:

-[viewController initWithNibname:Bundle:]
-[viewController awakeFromNib]
-[viewController loadView]
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear]  // user navigated away
-[viewController viewDidDisappear]
...
-[viewController viewWillAppear]     // user navigated back
-[viewController viewDidAppear]
...
-[viewController viewWillDisappear]  // user navigated away
-[viewController viewDidDisappear]
...
-[viewController setView:nil]        // memory warning, perhaps
-[viewController viewDidUnload]
...
-[viewController loadView]           // user navigated back
-[view awakeFromNib]
-[viewController viewDidLoad]
-[viewController viewWillAppear]
-[viewController viewDidAppear]
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIViewController诞生的过程是怎样的(哪个方法遵循哪个)? 的相关文章

  • iOS 6 中捕捉全景的库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在iOS中有很多方法和库来显示全景图片 虽然内置相机中有全景功能 但无法在应用程序中使用它 有没有可以用来捕获全景图像的库 Thanks
  • 志愿者匹配 API Objective C

    我正在使用 AFNetworking 对 VolunteerMatch API 执行 Web 请求 当我执行请求时 我收到 200 代码 但没有收到响应 典型的 VolunteerMatch 请求如下所示 GET api call acti
  • 如何创建凸起的标签栏项目,就像 Instagram 中的那样?

    如何在 UITabBar 中创建凸起项目 例如 Instagram 有这样的 我如何在我的应用程序中实现类似的目标 iDevRecipes 最近发布了有关如何重新创建这一内容的文章 尽管它不是由 Instagram 的开发人员编写的 查看这
  • Three20 和 iOS 6 不工作

    我刚刚尝试了我的一个项目 其中包含 Three20 但它似乎无法编译 给我构建错误 似乎是因为一些 UITouch 界面发生了变化 想知道是否有快速修复方法可以做到这一点 看来问题是在这里 UITouch ivars 已从 iOS 6 SD
  • 如何在 UIView 中获取父导航控制器

    我创建了一个UITabBarController在我的应用程序委托中 其中每个选项卡栏项目都有不同的UINavigationController加载自定义的UIViewController带NIB 使用 pushViewController
  • 最好使用的游戏/物理引擎?

    寻找用于移动游戏开发的游戏 物理引擎 iPhone 有Cocos2D http www cocos2d iphone org 我找到的安卓系统RokonAndroid http rokonandroid com 只是想知道是否还有其他人知道
  • “找不到开发者磁盘映像”

    最近我收到错误 找不到开发人员磁盘映像 我认为自从我将 iPhone 上的 iOS 更新到 9 1 后就会发生这种情况 如何解决该问题并使 Xcode 支持 iOS 9 1 设 备 Xcode 7 0 1 和 iOS 9 1 不兼容 您需要
  • iPhone 地址栏阻止了 HTML 页面标题按钮?

    我有一个带有两个标题按钮的移动网站 在 iPhone 上的纵向模式下 效果很好 我可以按按钮 问题是这样的 当我切换到纵向模式并尝试点击按钮时 本机 iPhone 地址栏就会显示 它位于标题上方 因此我无法按按钮 图片显示了问题 按一个按钮
  • Firebase 查询 - 查找包含字符串的子项

    我在使用 Firebase 查询时遇到了一些问题 我想查询对象 其中对象子值包含特定字符串 到目前为止 我有一些看起来像这样的东西 Firebase ref Firebase alloc initWithUrl https dinosaur
  • UITextField 验证视觉反馈

    我有一个 uiTextField 我正在验证输入 当我输入无效时 有哪些适当的方法可以显示输入无效 是否有任何内置机制可以显示无效的输入状态 将 警告 图像添加到 UITextField 的左侧以指示该字段需要一个值非常容易 尝试这个 UI
  • iPhone 应用程序在 iPhone 4 尺寸下运行,更新后出现黑条

    此前 该应用程序支持 iPhone 5s SE 屏幕和 iPhone 6 8 屏幕 不包括加大尺寸 这是使用启动图像完成的 因此 在 Plus 尺寸设备和 iPhone X 设备上 它会在应用程序上方和下方显示黑条 然后我们发布了一个更新
  • 如何从我的 appDelegate 访问我的 viewController? iOS系统

    我有一个在 xCode 中创建为 基于视图的应用程序 的 iOS 应用程序 我只有一个 viewController 但它会自动显示 而且我没有看到任何将它与我的 appDelegate 关联的代码 我需要将数据从 appDelegate
  • 我现在可以使用新的 Xcode 4.2 开发者预览版来发布常规应用程序吗?

    长话短说 如果我在 Mac 上下载并安装新的 Xcode 4 2 开发者预览版并开始开发新的 iOS 5 应用程序 我仍然可以使用它来开发和发布 iOS 4 x 应用程序吗 我现在无法安装该平台的两个不同版本 可能你们当中有人已经尝试过并且
  • iPhone/Xcode:UIImage 和 UIImageView 无法使用该程序

    从 iPhone 照片库中选取图像后 我尝试在 iPhone 文档目录中保存和加载 UIImage 它可以这样做 但由于某种原因 当我加载图像时 它会逆时针旋转 90 度 这是我的 saveImage 和 loadImage 方法 保存图片
  • 更改自定义 UITableViewCell iphone 中的文本颜色

    我有一个自定义单元格 当用户选择该单元格时 我希望两个 UILabels 中的文本更改为浅灰色 检查表Cell h import
  • 读取静态库中的.pch文件

    我正在创建一个静态库并添加我想要向其他项目公开的所有项目文件 现在 我有一个 pch 文件 其中包含将在整个应用程序中使用的大部分 import 语句 编译此静态库时 由于缺少导入语句 我收到错误 我尝试在 复制标头 和 复制源 中复制 p
  • 如何将此脚本安装到 PhoneGap for iOS 中

    我不了解任何 Objective C 这就是我使用 PhoneGap 来创建 iOS 应用程序的原因 iOS 版 PhoneGap 存在一个很大的缺陷 键盘上经常有表单助手 下一个 上一个 和 完成 按钮 网上关于如何摆脱这个的信息很少 所
  • 如何创建一个具有两个视图的 UIViewController,根据单击的按钮显示一个或另一个视图

    我对 iOS 开发还很陌生 但我陷入了困境 目前 我正在使用一个选项卡控制器在两个视图控制器 列表和地图视图 之间切换 这使得使用情节提要来配置两个视图的外观变得更加容易 现在需求已经改变 应用程序需要有一个带有分段控件的视图控制器 单击该
  • 在本地 UIWebView 中使用 Retina 图像

    由于某种原因 我无法让 UIWebView 与我的新 Retina 图像 很好地配合 问题 一步一步 我正在从捆绑包中加载一系列 HTML 帮助文件 如果是 iPhone 4 我的代码会加载不同的 HTML 文件 LWERetinaUtil
  • iPhone 和服务器上的 3DES 加密不同

    我有以下代码用于加密发送到服务器的请求 服务器上的解码由 NET 完成 在 iPhone 上 我使用带有以下代码的安全框架 NSString doCipher NSString plainText CCOperation encryptOr

随机推荐

  • 多选表视图单元格且无选择样式

    我有一个基本的 UITableView 我想启用Mail app样式复选标记 但没有选择样式 我有以下片段 define UITableViewCellEditingStyleMultiSelect 3 UITableViewCellEdi
  • Opencv重复性结果没有意义?

    我正在尝试通过重复性标准评估 SIFT 和 SURF 检测器 我发现下面的方法可以找到重复性 SIFT和SURF的对应关系 cv evaluateFeatureDetector img 1c img 2c h12 key points 1
  • 如何检测打印机是否连接?

    如何检测我的电脑中是否安装了打印机以及打印机连接是否处于活动状态 此类将列出所有已安装的打印机并为您提供打印机的状态 using System using System Management public class MyClass sta
  • 我在运行我的 React-native 应用程序时遇到以下问题

    无法使用 adb反向 连接到开发服务器 spawnSync home sumit Android platform tools adb ENOENT 我也尝试过使用 adb reverse tcp 8081 tcp 8081 但没有运气 现
  • YAML 多行数组

    In YAML 您可以轻松创建多行字符串 但是 我希望能够使用以下命令创建多行数组 主要是为了配置文件中的可读性 特点 A YAML array可以表示为 key1 key2 key3 A YAML sequence使用破折号 后跟空格 然
  • 无需模型检查即可实现符号执行

    我该如何实施symbolic execution for particular language不使用model checking and Finite State Machine FSM 例如not例如Java Path Finder 我
  • 如何提高 Watson Speech to Text 的准确性?

    据我了解 Watson Speech To Text 在某种程度上针对口语对话和 1 或 2 个发言者进行了校准 我还知道它可以比 WAV 和 OGG 更好地处理 FLAC 我想知道如何从声学角度提高算法识别能力 我的意思是 增加音量有帮助
  • 无法从程序集错误加载类型

    我编写了以下简单的测试来尝试学习温莎城堡的流畅界面 using NUnit Framework using Castle Windsor using System Collections using Castle MicroKernel R
  • jquery模拟按键“ctrl和+”

    我知道使用 CSS 移位来缩放页面的技术 I want to make a button for emulate the user that press CTRL and in same time In firefox if I press
  • 从 Twitter 获取用户的电子邮件地址 (Android)

    如何通过 Twitter API 获取用户的电子邮件地址 我正在使用 Twitter4j 通过 twitter 登录 我希望这能成功 请在您的请求回调结果中使用以下代码 TwitterloginButton setCallback new
  • 运行用户提供的 Java 代码时应该防范哪些安全风险?

    是否有关于在服务器上运行用户提供的 Java 代码的安全问题的完整列表 我已经 使用 10 秒的超时 在可用内存有限的单独进程中运行代码 使用 SecurityMangager 防止文件和网络 IO 在文件系统权限极其有限的帐户下运行代码
  • 无法运行Android应用程序,在eclipse中找不到.apk问题[重复]

    这个问题在这里已经有答案了 可能的重复 Android Eclipse 找不到 apk 最近我将 eclipse 的 ADT 插件更新到了最新版本 但之后我遇到了一个不寻常的问题 当我尝试在模拟器或设备上运行我的 Android 项目时 我
  • 如果存在多行,则排除列包含值的行

    表有 User Value john 284 john 200 john 5 sally 245 sally 180 sally 10 bill 90 bill 1000 bill 284 greg 10 greg 90 greg 2000
  • 逻辑及其在 Collections.Generic 和继承中的应用

    一切都继承自对象 这是继承的基础 一切都可以隐式地构建继承树 即 object me new Person 因此 遵循这一逻辑结论 一群人也将是一组对象 List
  • Windows 上的本机 Docker

    最近我读到一些新闻文章 说微软正在与 Docker 合作 让 docker 在 Windows Server 上原生运行 我想问的是 这是否允许 Windows 应用程序在 docker 容器内运行 或者这只是运行已经可用的 docker
  • 为什么 SQL Server 2005 动态管理视图报告缺少索引,而事实并非如此?

    我正在使用 SQL Server 2005 和动态管理视图sys dm db missing index details 它继续告诉我 Table1 确实需要 Column 和 Column 上的索引 但该索引已经存在 我什至多次删除并重新
  • 如何可视化 chrome DevTool 协议消息日志?

    我使用 Selenium 和 Chrome 驱动程序 还启用了性能日志记录 以便更好地了解测试期间的问题 性能日志似乎是一个 json 数组 其中包含 chrome 的 DevTool 协议消息 是否有任何工具可以让我像 Chrome 的开
  • Swift 中的单例用法

    我仍然对使用 Swift 感到有点困惑 希望有人能帮助澄清我何时以及为何使用它们 根据我对 Singleton 的理解 它们是单类实体 这意味着如果我有 A 类 并且在 B 类中创建 A 类的共享实例 那么它只是 B 中对 A 类的引用 所
  • 如何根据日期值将列表的元素插入另一个列表?

    我有一份房屋清单 list1 home1 home2 home3 home4 我还有另一份具体房屋清单 list2 home6 home7 home8 home10 每个家都有一块田地date 我想插入List2 into list1根据h
  • UIViewController诞生的过程是怎样的(哪个方法遵循哪个)?

    有很多方法可以覆盖 例如initWithNibname awakeFromNib loadView viewDidLoad viewDidAppear layoutSubviews 我只是无法决定调用这些方法的顺序 我只是 用心 重写其中一