Tag: 软件

开发者工具箱

质量是我们使用工具的结果。 我们对它们越熟悉,结果就会越好(或更快)。 当然,使用最少的工具集可以取得很多成就,但是要提高生产力,我们应该始终努力掌握当前的工具,并找到可以改善工作流程的新工具。 我一直在寻找新工具,所以如果您有我不使用的工具,请告诉我。 事不宜迟,这是我的工具箱: GUI工具 1密码 保存您的密码并保存。 我使用了不同的密码管理器,但是10多年来我一直使用1Password。 短跑 曾经需要查找文档吗? 我在Dash中进行。 如果文档还不存在,我将导入它们。 这样,它们就可以脱机使用,并且所有集成(例如Xcode)都使用法变得更好。 小飞贼 想知道哪些应用程序尝试执行网络请求? 您要控制它们吗? 这是给您的工具。 我已经使用了多年了,它并没有让我失望。 网络链接调节器 作为移动开发人员,我们经常忘记,我们的应用程序未与稳定的互联网连接一起使用。 要在Macbook上复制它,我们可以使用Apples Network Link Conditioner。 只需按照您希望的方式更改网络,您的整个Mac都将具有此连接(因此,如果丢弃所有程序包以查看会发生什么情况,则在等待时无法读取reddit)。 爪子 有很多应用程序可以发送HTTP请求。 我用爪子。 使其比POSTman 更好的主要功能是链接请求。 这样,我不必每次都进行身份验证。 取而代之的是,我只运行一个命令,它执行了我需要的一切。 颤动 到目前为止,这是我最喜欢的笔记工具。 您不仅可以按集合(和子集合)对笔记进行排序,甚至还可以使用不同的单元格,这些单元格中包含代码,降价,文本等。 让它将整个注释呈现为pdf,就可以了。 里德 作为开发人员(尤其是移动开发人员),我们必须与时俱进。 通常,我们可以通过跟踪博客来做到这一点。 我通过使用Reeder来做到这一点。 这是一个汇总RSS feed的不错的小工具。 揭示 曾经有视觉缺陷吗? 是否曾与UX设计师合作? 显示是我的选择。 在一个新的代码库中,我可以启动它,查找带有错误的正确视图,找到类的名称,然后知道从哪里开始。 另一方面,借助UX设计器,我们可以坐下来实时更改属性(包括自动布局)。 真有用! 草图 每当我执行任何UI工作时,我都会在Sketch中进行。 它是如此易于使用,没有理由不这样做。 请注意,它仅是矢量,因此,如果要更改任何图像,则必须使用其他内容。 源树 […]

您准备好使用iOS 12了吗?

对于开发人员来说,这意味着您将能够通过Siri Shortcuts API将应用程序的各种操作构建并集成到Siri中。 通过定义自定义意图,开发人员将能够在Siri能够识别的应用程序中构建特定的动作。 这将使用户更容易与应用程序一起访问Siri。 另外,通过使用Intent App扩展程序,快捷方式可以在后台运行。 图片 苹果发布了可以分割照片中各层的人像分割API。 开发人员将能够构建可轻松分离前景和背景图像的应用程序,从而创建独特的照片效果。 第三方开发人员也将能够在自己的应用程序中使用分离数据。 汽车游戏 除了支持第三方导航应用程序(Waze,Google Maps)外,苹果公司iOS Car Experience团队的Albert Wan还提到了CarPlay改进的四个关键方面:整体性能,更快的启动顺序,更流畅的动画和更好的应用程序通信。 为CarPlay进行构建时,开发人员还应考虑常见情况的变通方法,例如与CarPlay连接的密码锁定的iPhone和变化的网络/服务信号。 CarPlay现在拥有一个框架,该框架允许开发人员使用一系列受用户界面控制但可以自定义程度的模板来构建应用程序。 该版本将转换为用户界面,并且所有CarPlay系统都将支持该应用程序。 最终,新框架将使将出色的应用程序引入CarPlay变得更加容易。 爱科特2.0 ARKit使开发人员能够通过利用环境环境并将其与数字对象融合来为iPhone和iPad创建增强现实应用程序。 现在,借助ARKit 2.0,开发人员可以使用此类应用程序做更多的事情。 ARKit 2.0增加并改进了功能-人脸跟踪,对象渲染,3D对象检测,并且开发人员现在可以创建持久的体验。 苹果还使用Pixar创建了一种新文件格式:USDZ。 新的3D文件格式经过优化,可以共享和保留3D图形保真度和动画。 此外,原生USDZ支持将集成到Adobe的Creative Cloud中,从而可以相对轻松地创建AR体验和应用程序。 共享的AR体验也许是ARKit 2.0最酷的新功能之一。 借助ARWorldMap,开发人员可以通过将存档的对象发送到附近的iOS设备来创建共享的参考系。 假设他们正在跟踪同一张世界地图,则多个用户可以通过使用USDZ格式进行构建来共享和体验相同的3D内容。 有关创建多用户AR体验的更多信息,请查阅Apple的开发人员文档。 session.getCurrentWorldMap {worldMap,错误 守卫let worldMap = worldMap else { showAlert(错误) 返回 } } let configuration = ARWorldTrackingConfiguration()configuration.initialWorldMap = worldMap session.run(配置) […]

如何使UIViewController包含更加容易

希望你们中的大多数人熟悉Container View Controller的概念。 这是一个非常有用的Cocoa功能,我发现自己最近越来越多地使用它。 不过,由于您可以在Apple的文档中找到它,因此我将不介绍其实现细节。 让我们深入研究一些我认为超级有用的场景。 嵌入UITableViewController 。 每个人都去过那里。 您有一张桌子,周围还有一些其他内容。 大多数人只是将UITableView添加到其UIViewController子类中。 但是通过这种方式,您将放弃通过UITableViewController免费获得的许多功能,例如: 自动滚动到聚焦的UITextField和UITextView以便它们不会隐藏在键盘后面 默认的UITableViewDatasource和UITableViewDelegate实现 完美无瑕的提拉精神 仅举几例。 如果将UITableViewController放入容器中,您将获得两全其美的UIViewController –您自己的UIViewController子类的灵活性,用于装饰内容和UITableViewController内置功能 2.共享的屏幕部分-出现在应用程序不同部分的屏幕部分。 如果使用CleanSwift体系结构,这将特别有用。 您可以轻松重用完整的场景,并且已经设置了他们的所有助手(交互器,路由器,工作程序)。 3.显示错误和场景的空状态。 4.将其用于控制​​器动画,因为与使用View Controller Transitions的UIViewController相比,使用UIViewPropertyAnimator和UIGestureRecognizer UIView动画更容易。 像使用其他视图一样,使用嵌入式控制器创建容器视图并对其进行动画处理。 您可以在DisplayInDrawer lib中看到这种方法。 在许多其他情况下, UIViewController包含可以简化程序员的生活。 但是–有一个警告。 假设您有一个嵌入式UITableViewController 。 您刚得到数据,因此创建了一个控制器,注入了数据,将其嵌入并显示。 到目前为止,一切都很好。 新数据到来。 在许多项目上,我多次看到使用相同的例程。 “因此您创建了一个控制器 ,注入了数据,……”。 错了 。 尽管已经有一个控制器,但您无需实例化它。 除非这样做可能很昂贵( viewDidLoad往往很忙,对吗?),否则您可能会引入疯狂的错误,例如注册重复的观察者,完成处理程序等。如果您的控制器分配不正确,这会变得更糟。 尽管我确定您的控制器确实会释放 👮,但由于您进行了仔细检查,不是吗? 解决方案是每次检查控制器是否已经存在,以及是否存在,只需注入数据即可。 不要创建新实例。 但这会变得很乏味,您很容易忘记进行此检查。 输入UIViewController-DisplayChild扩展名,该扩展名通过嵌入(显示) 类型而不是instance来缓解此问题。 您为它提供控制器的类型 ,配置闭包和容器视图。 该扩展程序决定是否需要实例化控制器,如果需要,则创建一个实例,在其上运行配置闭包,并将其嵌入到指定的容器视图中。

DO iOS University ’18的3个重点

几周前,我参加了由CocoaHeadsNL主办的今年在阿姆斯特丹举行的DO iOS会议的第一天。 这也被称为“大学时代”,这是丹尼尔·斯坦伯格(Dim Sum Thought)的作者,培训师和开发人员丹尼尔·斯坦伯格(Daniel Steinberg)在函数编程方面进行的实验性研讨会,在剧透警告时,他是一位出色的演讲者。 Daniel在iOS方面具有深厚的背景,并且对函数式编程非常熟悉。 (很酷的事实:在成为开发人员之前,他曾经是数学教授。) 粗略地说,会议包括一些很简单的东西,一些是中间的东西,有些是某种魔术。 在此博客中,我将分享精彩集锦,以及当天的一些最佳提示,技巧和提示。 *要阅读我们在DO iOS系列文章的第2部分,请单击此处。 首先:函数编程的一些很酷的功能,例如将函数链接到先前函数的结果。 信不信由你,下图是一个包含多次执行“ F”的闭合结构的结构。 之所以有效,是因为每个函数都返回该结构本身的实例。 真好! 该变量称为“ f”,它是名为Picture的结构的一个实例,其中包含一个作为属性的闭包(闭包绘制一个“ F”)。 实际上,只需调用f即可创建第一张图片,如下所示: F 相反,第二个是通过调用: f.quad(空白,f.rotate(),f).quadFlip().quadRotate().quadRotate() 这里的关键是每个函数( rotate() , quadFlip()和quadRotate()返回Picture的实例,从而允许您以功能性方式运行更多转换。 接下来,我们讨论了Swift中几个比较基本的功能编程函数,例如.sorted() .split()或.map() 。 一些创建Swift的开发人员具有此类编程的背景,因此这是今天值得欢迎的补充。 小组中的几乎每个人以前都曾经听说过这些功能,或者曾经使用过这些功能-但是即使如此,Daniel仍可以向我们展示如何使用它们的原始方法。 例如:为了弄清楚句子“ 我看见的是猫吗? ”是回文(向后读取与向后读取相同),您可以编写一个循环以将第一句话的第一个字母与第二句话的最后一个字母进行比较(在小写并删除标点符号之后)。 如果您可以正常工作,则可以执行以下操作: zip(string,string.reversed()).map(==).reduce(true){(累加器&&元素中的(累加器,元素)} 我们还手动实现了一个map函数,以查看引擎盖下发生的事情,这既简单又酷。 在对其进行抽象之后,Daniel遵循了以下建议: “编写抽象时,应从具体到抽象。” 咖啡-还是茶歇! (我是每个办公室都有一个茶人)。 让我们提高水平! 休息后,我们练习实现自定义集。 但是,此集只存储一个包含闭包的变量,而不是存储值。 它看起来像这样: struct MySet {让包含:(T)-> Bool} 要点: 为变量选择一个好名字 。 Daniel甚至开玩笑说MySet有多糟糕,他说:“您应该与团队进行命名讨论。” […]

来自DO iOS Conference ’18的4项经验教训

2018年11月2日,该是DO iOS第二部分的时候了:由CocoaHeadsNL在阿姆斯特丹*主办的会议。 大约有12场讲座(均与iOS开发和Swift相关)以及免费的咖啡和食物,对于渴望继续学习和改进游戏的开发人员来说,这里是个好地方。 我有机会参加了这次活动,并将在这里与您分享一些最令人兴奋的亮点。 让我们潜入吧! *如果您错过了本系列活动的第1部分,请点击此处。 引起我注意的第一个话题是荷兰银行(ABN AMRO)。 舞台上有五位不同的演讲者,每位演讲者都针对不同的主题,分享了宝贵的知识并解释了他们的工作方式。 有两点引起了我的兴趣: 1-源代码管理分支模型。 该团队使用中继而不是标准git-flow进行开发。 他们努力建立一个始终稳定且随时可释放的分支。 他们通常不执行拉取请求(或仅对短暂的功能分支执行请求),而是选择结对编程来解决技术上复杂的问题,并进行提交后审查。 好处: 这种方法消除了解决合并冲突的烦恼 ,它审查了巨大的拉取请求,这些请求通常最终会说“看起来不错,正在合并!” 它迫使您在测试新引入的代码的地方进行小的提交 。 它鼓励您重构代码并保持代码库整洁 (在功能分支中进行重构使审核变得困难,并且可能会导致可怕的合并冲突)。 2-牢不可破的交付管道。 为了使此方法顺利运行,您需要付出巨大的努力来测试代码并建立可靠的交付管道。 以下是交付新产品版本之前需要执行的每个步骤的概述: 就像这张幻灯片所示,团队在测试,代码质量和持续集成/交付上花费了时间。 令我惊讶的是,使用此管道,由于提交前将其提交到远程之前有许多安全点,因此根本不可能中断中继。 团队使用的一些外部工具: SauceLabs在大型仓库中存储的真实设备上运行UI测试。 SonarQube在每次提交后分析代码质量,告诉您代码重复的数量和代码覆盖率。 他们展示的示例覆盖了88%的代码,仅覆盖了3%的代码重复。 挺棒的! 连结以在开发人员之间共享档案。 对我而言,这次演讲表明了为什么以及为什么要不断进行集成/交付是绝对值得的。 换句话说, 在构建高质量产品时 , 不选择不测试代码是不可行的。 我们也可能会在不远的将来尝试使用树干进行开发,它为像我们这样的小型团队带来了很多好处。 另外,我喜欢结对编程的思想,用两个人而不是一个人来解决复杂的问题,从而产生了更加一致和清晰的代码库。 而且上面提到的外部工具值得一看。 另一个有趣的话题是ANWB的David Broza。 David讨论了ANWB的编程方式,如何使用不同的应用程序架构维护干净的代码库以及如何测试代码。 与ABN AMRO一样,ANWB投入了大量精力来测试其代码并使用众所周知的体系结构。 David展示了他们如何注入依赖项以使代码可测试。 ANWB使用自定义汇编程序,这与我们在Mobile Company使用的Swift依赖注入框架Swinject非常相似。 对于单元测试,他们创建了自己的Swift模拟框架-类似于我们使用的Cuckoo框架。 显然,必须编写经过良好测试和架构良好的代码,通过教我们的开发人员为什么以及如何编写可测试的代码,再次确认我们在生产维护良好的代码库中处于正确的轨道。 亚历山大大帝 Griekspoor是一位经验丰富的应用程序开发人员,长期以来一直在开发成功的产品,他分享了有关如何创建Agenda应用程序的故事。 我喜欢听到有灵感的开发人员的故事,但我并不感到失望。 议程—关于Notes的优雅新见解。 议程是一个以日期为中心的笔记应用程序,可用于计划和记录项目。 […]

安全快捷地处理快速日志并进行测试

如果您开始使用Swift开发iOS或OS X应用程序,也许DDLog这个词不会引起您的注意,但是您不必担心,如果您不使用DDLog可以代替NSLog(除其他外)希望您的日志在版本中可读。 出于多种原因,实际上不建议发布带有日志的应用程序,例如: NSLog由于其同步性而减慢了应用程序的速度 通常会记录网络请求,并且您可能不希望其他人知道您的后端如何工作 您肯定会注意到的另一件事是, 您不需要每次都拥有所有日志 ,实际上调试过程通常是这样构造的: 构建应用 降落在您需要测试的视图(或其他任何视图)上 清除日志控制台 做测试并查看日志 一种简单的解决方案是使用彩色原木,但是一旦使用了已知的7或8种颜色,就必须对不同的原木重新使用相同的颜色。 如果您是一个知道超过8种颜色的女孩,则可以这样做(也许是因为这样,女人在编码方面比男人要好?:D),但至少我需要找出一种更好的方法。 所以让我们回顾一下到目前为止 我们仅在必要时才需要日志 我们不希望发布日志 我们如何才能有效地解决这个问题? 当然有枚举。 问题 让我们想象一下,我们有一个从后端检索并希望在TableView中显示的小猫的列表。 我们要登录 网络请求和响应 关于视图的操作(显示一个新的单元格,点击一个单元格,等等) 并且我们不希望手动导航我们的应用程序,直到包含TableView的视图控制器为止(是的,我们很懒惰)。 解 这是代码 基本上,每种类型的日志都有一个大小写,因此我们可以使用isEnabled和#if DEBUG阻止释放中启用任何大小写的功能来分别打开和关闭它们。 您可能已经注意到,枚举名称是Test而不是Log 。 那是因为: 我发现阅读诸如Test.kittensNetworkService.stuff()之类的内容更容易理解 此解决方案不仅限于日志:请记住,在小猫VC之前我们不手动导航? 用法 我们要记录所选单元格的indexPath吗? 我们要导航到KittensVC吗? 如果我们需要在任何情况下执行某项操作,则可以使用performBlockFor方法 PS: 要使用#if DEBUG宏,我们必须在目标/ Swift编译器-自定义标志/其他swift标志的Build阶段中添加值-D DEBUG。 感谢您的阅读,直到这里,我希望您像我一样喜欢这种解决方案🙂

模型视图控制器的起源

MVC(模型视图控制器)是一种用于在电子设备上实现用户界面的软件模式。 根据其架构师Trygve Reenskaug的说法,“ MVC的创建是为了解决使用户可以从多个角度查看其信息的一般问题的解决方案。” Trygve在施乐Palo Alto研究实验室担任客座科学家时就想到了MVC。 PARC),在1978年夏季至1979年之间。在PARC期间,他专注于支持LRG(学习研究小组),该小组正在开发DynaBook。 DynaBook是对现在称为平板电脑的早期概念。 它的创建者设想了一种通用工具,可以弥合用户和与她相关的信息之间的鸿沟。 早期的概念是考虑到儿童的,因此DynaBook可以用作所有年龄段儿童的学习计算机。 因此,它必须易于使用,并且必须直观。 正如创作者所描述的:“ 用户就是沙皇; LRG所做的一切都是为了支持他。” 在这种背景下,创建了MVC,将其作为一种新型个人计算机的支持软件体系结构。 一台将可用性放在首位而不影响功能的计算机。 这种想法在MVC的原始理论化中显而易见。 正如Trygve所说的那样, “ MVC的基本目的是弥合人类用户的心理模型与计算机中存在的数字模型之间的鸿沟。 理想的MVC解决方案支持用户直接查看和操作域信息的错觉。 如果用户需要在不同的上下文中和/或从不同的角度同时看到相同的模型元素,则该结构很有用。” MVC的第一个实现是由LRG集团以一种称为Smalltalk的语言完成的。 smalltalk是第一种真正的面向对象语言。 如今,MVC已成为桌面GUI,Web应用程序甚至移动应用程序的首选架构模式。 它也已成为Web最受欢迎的Web框架的选择模式。

什么是越狱iOS 11?

苹果公司于一周多前发布了iOS 11。 用户现在可以尝试与iDevices兼容的第一个beta版本。 新更新包括一系列功能,其中包括一些技巧,这些技巧将使您的iDevice看起来比以前的任何更新都更类似于计算机。 但是,其中一些功能以前曾在越狱的iOS设备上可用,或者在Apple提出之前在Android方式上可用。 尽管iOS 11 Beta版本已在不久前推出,但已经被越狱者破解。 安全研究人员最近在2017年中国移动安全大会(MOSEC)上公开了iOS 11 beta 2越狱事件。 越狱显然是梁靓(腾讯热衷安全实验室)工作的结果。 腾讯基恩安全实验室是一个以安全为导向的小组,致力于与应用程序,云计算技术,台式机或移动OS等相关的前沿安全研究。 只要Keen Security Lab在安全领域开展业务,他们不太可能很快就将iOS 11的越狱事件发布给公众。 但是,他们有可能与苹果公司共享它。 与苹果公司共享iOS 11的越狱行为,意味着可以在发布iOS 11之前了解到有关iOS 11潜在安全漏洞的意识。 苹果公司一直在与越狱社区玩猫捉老鼠的游戏。 即使在几次情况下,苹果公司也公开谈论过越狱者,他们修复了可用的iOS版本中的漏洞。 但是,腾讯基恩安全实验室能够入侵iOS 11无疑证明了可以毫无疑问地越狱iOS 11。 腾讯基恩安全实验室使用的实用程序使用户不仅可以越狱iOS 11,还可以通过Apple Company在不同的移动类型上使用iOS 10.3.2。 但是,黑客没有提及出于机密原因而利用的漏洞。 越狱iOS 11视频指南

NS for iOS Devs —应用程序生命周期

在Swift Post上以更好的格式阅读此文章。 每个iOS开发人员都需要了解iOS应用程序的可能状态。 知道该应用何时终止或处于不活动状态,使我们知道在幕后能做什么,哪些可能行不通。 应用程序在某些情况下(例如处理切换,应用程序间通信等)需要额外的工作。 为什么我们需要知道? 首先,我们应该对应用程序的启动做出适当的响应。 某些第三方库需要在应用程序的不同状态下进行设置。 另外,我们应该准备该应用程序以使其在前台工作。 我们可能需要提供不同的用户体验。 例如,我们的应用程序在进入前台时都可能要求输入密码。 另一方面,我们的应用程序可以像Dropbox一样在后台运行时上传图像。 甚至我们可能想在应用终止后从用户离开的地方重新打开。 因此,每个功能在不同的应用程序状态下需要不同的实现。 因此,在提供不同且更好的用户体验的同时了解状态和转换可能至关重要。 我们需要知道些什么? 事不宜迟,以下是状态的简要说明: 未运行 :应用未由系统启动或终止。 后台 :应用程序在后台运行,仍然能够运行代码。 但是此状态的持续时间由OS确定,并且代码执行可以随时中断。 如果开发人员要求额外的时间来执行一些代码,则时间可能会更长。 在某些情况下,可以直接在后台模式下启动应用程序。 例如,如果在收到远程推送通知时开始下载某些内容,则该应用程序可以在后台模式下启动。 非活动状态 :通常是启动应用程序的活动状态和背景状态之间的过渡状态。 例如,如果我们在应用程序处于前台状态时收到电话,它将进入非活动状态。 活动 :当应用程序处于前台并且可以接收事件时,它处于活动状态。 已挂起 :当应用程序处于后台状态时,系统将其挂起,并且该应用程序无法执行任何代码。 没有任何有关暂停事件的通知。 系统会自动挂起该应用程序。 我们如何知道何时进行状态转换? UIApplication是代表我们的应用程序的对象。 它会设置所有内容并启动应用程序运行。 UIApplication对象通过UIApplicationDelegate通知我们。 当UIApplication对象控制系统与应用程序对象之间的通信并管理事件循环时,我们在UIApplicationDelegate对象中编写我们的自定义代码,以处理应用程序的启动以及状态之间的转换以及更多其他事情。 因此,让我们看一下UIApplicationDelegate中调用了哪些方法,以及何时需要在每个方法中添加代码。 application(_ application:willFinishLaunchingWithOptions:) 调用willFinishLaunchingWithOptions ,我们知道我们的应用程序的启动过程已启动,主故事板或nib文件已加载,但该应用程序仍处于非活动状态。 如果我们的应用是由于特定原因启动的,例如远程推送通知或主屏幕快捷方式,则此信息将在options 。 这里要了解的重要一点是,在这些情况下,系统可能会调用其他UIApplicationDelegate方法。 例如,如果调用该应用程序以打开URL,则系统将调用application(_:open:options:)方法。 options为我们提供了必要的信息,以便我们对这些事件做出正确的反应。 另一个很好的例子是Twitter feed。 我们可以看到,无论何时终止Twitter iOS应用并再次打开,它都会从我们离开的位置恢复。 它不会一直滚动到顶部。 如果我们要实现相同的状态恢复功能,则所需的步骤之一是在willFinishLaunchingWithOptions调用UIWindow的makeKeyAndVisible()方法,而不是在application(_ […]

NS for iOS Devs —查看生命周期

在 Swift Post 上以更好的格式阅读此文章 。 在学习了应用程序生命周期之后,视图生命周期在每个iOS开发人员的生命中都占有重要地位。 每个视图都是使用情节提要,XIB或编程方式创建的。 与方法无关,真正了解创建,加载,出现或销毁视图的时间有助于我们在开发屏幕设计,动画甚至业务逻辑时深刻理解我们的方法。 好的,但是为什么我们需要知道? 当我们考虑应用程序的生命周期时,我们很容易看到,随着应用程序进入后台,挂起等状态,某些事情正在发生。每当用户与应用程序进行交互时,就会发生某些特定的操作,并且应用程序的状态可能会发生变化。 但是,视图的状态可能会随着用户交互或应用程序数据的任何变化而改变。 另一方面,当视图中存在某种状态转换时,我们可能需要操纵用户界面。 例如,如果我们要使用自定义视图并将其设置为UIViewController的视图,则必须在loadView方法中进行操作。 或者,如果我们的设计要求我们在横向和纵向模式之间有微小的差异,那么我们需要知道何时可以在代码中进行此更改。 因此,了解所有生命周期方法不仅可以帮助我们编写代码,还可以使我们更具创造力并实现高级用户界面。 我们需要知道些什么? 为了在适当的位置使用视图,我们需要知道何时创建,加载,显示,更改,消失和终止视图。 UIViewController子类负责管理视图(又称UIView )。 视图控制器具有一个根视图,它是一个UIView实例。 这里重要的是它们如何一起工作。 UIViewController处理UIView背后的所有魔力,而UIView只是向用户显示屏幕和某些内容。 UIViewController告诉根UIView对象何时进入屏幕。 首先,视图控制器创建其根视图并加载它。 加载后,它告诉视图出现在屏幕上,并在必要时消失。 此外,一个视图控制器可能是另一个视图控制器的子代。 因此,视图控制器的生命周期不仅关心其根视图,而且还包括与其他视图控制器的关系,就像它是否移至父视图控制器一样。 最后,视图控制器的根视图(也称为UIView)具有自己的内容和生命周期。 根视图具有其子视图,例如按钮,标签,开关或其他UIView子类。 在大多数情况下,并不是每个开发人员都考虑子视图的生命周期。 但是有一种常见的情况是将视图控制器嵌入另一种情况。 在这种情况下,我们需要为两个视图控制器的视图模仿生命周期操作,并在必要时调用适当的方法。 我们如何获得有关生命周期事件的通知? UIViewController有很多方法可以在发生某些特定操作时通知我们。 例如,我们可以重写viewDidLoad方法以在加载视图后立即执行一些操作。 或使用loadView方法将UIViewController的根UIView替换为我们的自定义UIView类。 我们将研究视图和视图控制器的组合之间的关系,以了解当前状态。 与其过多地关注每种方法的作用,不如介绍每种方法的重要意义以及何时使用它们。 UIView — UIViewController关系 loadView :这是加载视图控制器的根视图的位置。 view , UIViewController view属性为nil 。 如果要创建自定义视图并将其设置为view属性,则需要重写此方法。 如果使用Interface Builder创建视图和初始化视图控制器,则不得重写此方法。 重写此方法后,我们必须初始化自定义视图并将其设置为UIViewController view属性,并且永远不要调用super.loadView因为它自己创建视图并分配给view 。 最后,我们不应该直接调用此方法。 […]