Tag: xcode

第一部分工程

在这个部分项目中,我们被分配制作一个颜色滑块,该滑块以矩形显示它,例如在photoshop或其他与照片/艺术相关的程序中。 在代码中,我们使用了不同的方法来制作它,例如函数,变量,按钮,动作等。 例如,在这个项目中,我们学习了如何将多个内容(例如滑块或开关)仅连接到一个动作中,这有助于使代码更小,更高效,以供以后编辑。 您只需要使用Ctrl将其连接到同一事物中,或单击其旁边的圆圈即可。 另一件事是功能。 功能是更新代码并帮助简化编码的一种方式,您可以添加说明以供计算机遵循。 我们使用函数来更新盒子的颜色并使滑块工作。 最后,我们还学习了如何从一开始就更改对象的属性,以使其看起来更美观。 我们通过进入viewDidLoad的函数来完成此操作,以便更改可以在应用开始运行时应用,而不是在运行之后应用。 这个项目帮助我们作为学生学习如何以更有效的方式进行编码。 就我个人而言,我知道我们应该学习的大多数东西,但是我从来不知道您可以将不同的渠道连接到同一动作中。 功能是我学到的另一件事。 我认为函数确实可以使代码更高效,并且更多的人应该学习如何使用它们,这就是我要说的,谢谢。

使MVC再次出色!

使用泛型,协议和扩展摆脱大型视图控制器 本文的副本也可在此处获得 Model-View-Controller是一种非常常见的软件结构,用于在Apple生态系统中创建应用程序。 尽管MVC是一个简单的概念,但是开发人员经常会错过使用它并将其转换为MVC的想法。 代表“ Massive View Controller”结构。 在这篇文章中,我们将看到如何通过使用一些简单的技术(如泛型,协议,扩展,便捷的初始化程序等)使MVC再次变得出色,让我们开始吧! 我们的应用程序是一个非常简单的应用程序,只有一个屏幕:登录屏幕,用户可以在其中输入其电子邮件和密码,并且该应用程序将在控制台中将其打印出来。 首先,我们将摆脱所有邪恶的源头,情节提要😈 尽管Apple提倡Storyboard作为为其生态系统开发用户界面的标准方法,但Storyboard仍然存在以下主要问题: 性能下降和编译时间。 它们不是git友好的,由于其XML性质,它们使团队工作更加艰苦。 故事板在运行时失败,而不是在编译时失败,这使它们成为大量未知错误和问题的来源。 和更多 … 就个人而言,每次在项目中使用情节提要或Xib文件时,我都会遇到可伸缩性问题。 但是,当我尝试以编程方式编写我的UI代码时,视图控制器变得更大,更难维护,从而无法实现与Massive View Controller对抗的全部目的defeat 1.子类化UIView和UIViewController 2.将所有UI和布局代码从视图控制器中移开。 3.使用扩展来组织视图控制器 4.使用便捷的初始化程序在一行中初始化和设置公共UI元素。 子类化UIView 我们将创建一个名为View的新基类,此子类将从现在开始使用,而不是UIView 类视图:UIView {覆盖init(frame:CGRect){ super.init(frame:框架) setViews() layoutViews() }是否需要初始化?(编码器aDecoder:NSCoder){ super.init(编码器:aDecoder) setViews() layoutViews() } ///在这里设置您的视图及其子视图。 func setViews(){ backgroundColor = .white } ///在此处布置子视图。 func layoutViews(){}} 子类化UIViewController: 与使用View一样,我们将创建另一个名为ViewController的新基类,从现在开始将继承并使用它,而不是UIViewController 类ViewController :UIViewController { 覆盖func loadView(){ 视图= […]

iOS | Swift:使用xib创建自定义视图。

要创建带有xib文件的自定义可重用视图,该文件可以通过编程方式实例化,也可以通过界面生成器加载,请按照以下简单步骤操作。 假设我们必须创建一个PersonView,以两个标签显示一个Person的名字和姓氏,并且我们想将此视图在不同的Screens上用作子视图。 创建一个新的UIView子类,我们说“ PersonView”。 现在让我们为PersonView创建一个xib文件,即PersonView.xib 设计xib文件。 例如,假设我们要通过我们的PersonView显示某人的名字和姓氏。 打开PersonView.xib文件,然后选择“文件所有者”并设置“自定义类PersonView”。 现在,PersonView.xib的文件所有者是PersonView类。 现在,我们将选择在PersonView.xib文件中拥有的唯一视图,并在其所有者PersonView.swift中创建出口,并将出口命名为contentView。 并创建名字和姓氏标签的出口,如lblFirstName和lblSecondName 。 在PersonView.swift中添加以下代码 现在,您可以创建PersonView的出口,并可以像这样使用它: personView.lblFirstName.text =“您的名字” personView.lblLastName.text =“您的姓氏” 最后。

实施夜间模式

为了获得最佳风味,此帖子最好在 Late Night Swift上找到 。 欢迎发布《深夜雨燕》的第一条! 与开始构建“夜间模式”相比,这比启动一个功能要好得多,因为越来越多的人在晚上使用他们的设备,这是一项非常重要的功能。 我们的目标是使将主题应用于UI组件并使主题之间的过渡动​​画化变得非常简单。 为了实现这一目标,我们将构建一个名为Themed的协议,任何符合该协议的内容都将参与主题化。 扩展名MyView:主题{ func applyTheme(_主题:AppTheme){ backgroundColor = theme.backgroundColor titleLabel.textColor = theme.textColor subtitleLabel.textColor = theme.textColor } } 扩展AppTabBarController:主题{ func applyTheme(_主题:AppTheme){ tabBar.barTintColor = theme.barBackgroundColor tabBar.tintColor = theme.barForegroundColor } } 如果您只是想潜入,这是示例代码的链接! github.com/latenightswift/night-mode 对行为的思考使我们概述了一些初始要求: 用于存储和更改当前主题的中心位置。 一个主题类型,将主要由标记的颜色定义组成。 当前主题更改时通知我们应用程序感兴趣部分的机制。 任何事物都能以干净,迅速的方式参与主题的能力。 要更改应用程序的状态栏,选项卡栏和导航栏以及自定义视图和视图控制器。 要使用漂亮的交叉溶解动画执行主题更改。 也没有理由为什么支持夜间模式的应用程序不支持许多其他主题。 考虑到这些想法,让我们进入并为主要演员建模。 主题协议的定义 让我们首先定义当我们说需要在某个地方存储当前主题并允许我们在主题更改时订阅通知时的含义。 ///描述一种类型,该类型具有当前的“主题”并允许 ///更改主题时要通知的对象。 协议ThemeProvider { ///应用实际使用的主题类型的占位符 关联主题 ///当前活动的主题 var […]

重新启动失败的XCTests

UI测试是相当不稳定的事情,这对任何人都不是秘密。 通常,在实践中,我们必须想出各种方法使它们尽可能稳定。 一种这样的方法是重新启动失败的测试。 如果在此类情况下的JUnit中我们有TestNG中的RetryTestHelper — IretryAnalyzer,那么为了在XCTest中测试iOS应用程序,我们没有开箱即用的东西。 经过一番谷歌搜索之后,我们找到的第一个解决方案— setup_fragile_tests_for_rescan —这是Fastlane插件。 Fastlane是一款华丽而优雅的工具,可用于自动完成移动应用程序周围的所有操作(签名,生成,测试,屏幕截图,交付等)。 该插件目前已被弃用,但取而代之的是改进的新版本。 我真的很喜欢Fastlane,但是我坚信主版本中没有包含插件。 虽然,这是一个现成的解决方案,但您的选择很可能落在它上面。 如果您不想要其他依赖项,并且准备进行少量编码,那么我们将继续。 我将告诉您,如何使用相同的Fastlane通过自写解决方案实现失败的测试的重启。 从理论上讲,不用Fastlane就可以做同样的事情,但是有了它,一切看起来都会变得更加优雅,而且整个过程真的很愉快。 安装Fastlane以运行我们的测试: $宝石安装fastlane 安装Nokogiri来解析测试结果: $ gem install nokogiri 在我们开始之前,我想添加一些理论上的补充。 由于Fastlane是Ruby上的一种DSL,因此其语法将非常接近Ruby爱好者。 要配置可运行命令及其参数,我们将使用Fastfile。 在.xcodeproj的附近,我们创建了一个隐藏的Fastlane文件夹和一个Fastfile配置,在其中将保留运行测试的整个逻辑: $ mkdir -p .fastlane $ touch ./fastlane/Fastfile $打开./fastlane/Fastfile 要运行测试,我们需要创建自己的Fastlane通道,并在其中调用名为scan的Fastlane操作: 现在,让我们编写一个Fastlane通道,它将重新启动测试指定次数。 为此,我们需要以易于解析的格式(例如.junit)生成测试报告。 运行测试一次并生成报告后,我们检查报告中是否有任何失败的测试。 如果存在,那么我们将测试循环预定次数,直到获得成功: 现在,要检查我们的重启,让我们编写两个测试: 首先,那将永远是绿色的 第二个总是红色 之后,与我们的测试运行程序一起运行Fastlane: $ fastlane测试 该解决方案的唯一可能的缺点是,在最终的测试报告中,我们将仅看到上次重启时运行的测试。 失败的测试试图通过@test_retries时间,但是在我们的示例中,它注定要失败。 但是,应该注意的是,虽然强制执行了重新启动测试的操作,但这并不是维持稳定性的最佳方法,因为您的应用程序已成为海森堡的目标。 因此,重新启动测试,减少重新启动它们的频率。 到此为止。 谢谢大家,在接下来的笔记中见(

iOS应用在设备上的启动时间

您是否曾经对测量应用程序的不同技术指标感兴趣? 如构建时间,启动时间,CPU使用率,内存等。因为它们可能会在使用应用程序时引起良好或不良的用户体验。 今天我们将讨论发射时间 。 但是首先……在这里您找不到关于“如何优化发射时间? -这不是本文的主题。 有几种测量发射时间的方法: 使用DYLD_PRINT_STATISTICS标志; 使用xcrun ; 使用Darwin C API手动进行计算。 设置此环境变量可让您分析主时间。 为了优化主阶段前的时间,我建议您观看WWDC关于优化应用程序启动时间的演讲。 不幸的是,您无法手动处理此信息并将其发送到服务器。 好吧,实际上,您可以解析os日志,但这不是一件简单的任务。 而且它不在当前主题范围之内。 但是我们想跟踪实际用户的启动时间。 我们应该怎么做? 使用此开发命令行工具,您可以编写脚本来测量模拟器上的启动时间。 但实际用户也没有。 好吧,我们应该使用Darwin C API。 主要思想:比较系统启动我们的应用程序过程的时间和应用程序可用的时间。 您要做的就是用C编写一些代码。 #include“ LaunchTimeMeasurer.h” #include ; #include ; double processUptime(){ struct timeval currentTime; // 1 struct kinfo_proc processInfo // 2; size_t processInfoSize = sizeof(processInfo)// 3; int mib [] = {CTL_KERN,KERN_PROC,KERN_PROC_PID,getpid()}; […]

Xcode Instruments —僵尸

在保存之前一切都很好。 但是,当我打印获取的结果时,事情发生了。 崩溃…。 这就是我所得到的。 没有控制台日志,没有警告,没有谋杀武器。 最初的线索是EXC_BAD_ACCESS和EXC_1386,表明它的存在,是的,ZOMBIE。 僵尸是保留计数为0的对象仍然继续存在。 要确认它在产品->编辑方案->诊断中启用了僵尸,请为Zombie对象启用复选标记。 再次运行该应用程序,我得到了日志。 由于字符串僵尸对象而导致崩溃的原因。 是时候找到僵尸了。 为了更深入地研究,我们需要侦探“ xcode工具”的帮助。 打开xcode->开发人员工具->工具-> 选择僵尸 在方案中选择所需的模拟器和应用,然后点击红色的录制按钮。 景气,我们弹出这个僵尸, 查看分配历史记录,我发现在获取之后,访问属性“ newName”会导致该属性的内存释放, 但为什么 ? 动机是什么? 过渡到ARC发行说明 描述如何将代码从手动保留/发行转换为使用ARC。 developer.apple.com ARC对方法命名施加了约束: 您不能给访问器一个以new开头的名称。 解决案例后,将核心数据实体的属性从“ newName”重命名为“ updatedName”,解决了崩溃问题。 希望这对您有帮助。 任何帮助都可以通过pratheesh_db@hotmail.com与我联系。

Xcode iOS Xcode无线部署

当我们使用Xcode进行应用程序开发时,通常将我们的iOS设备绑定到Mac上以部署应用程序,但是Xcode 9引入了“无线部署-调试”,这份5分钟的指南将帮助您进行设置。 切换到无线。 Xcode 9+ IDE 苹果系统 无线网络 iOS 10+设备 从finder或Xcode最近的项目中打开您的Project_Name.xcodeproj文件。 选择主project_name,然后一般检查是否有任何错误或警告。 将iPhone或iPad连接到Mac,然后按“信任此计算机”。 无线部署设备列表 检查“设备”列表,其中将显示所有可用于运行的设备和模拟器。 当您的iOS设备显示时,您可以选择窗口 -> 设备和模拟器 ,这将使显示成为一个新的弹出窗口。 无线部署位置 在选择设备屏幕中选择iOS设备 。 选中通过网络连接选项。 就是这样,除非您想为不支持无线充电的iOS设备充电,否则就不会再打乱电线了。 应用程序设备窗口 通过电缆断开iOS设备的连接,现在在Xcode设备选择屏幕中,它将在设备名称旁边显示一个网络图标。 注意:要使无线部署正常工作,工作站和iOS设备都应通过无线路由器或移动热点连接在同一网络上。 设备列表成功 最初发布在 kautilya.design上 。

使用SwiftGen以Swifty方式管理资源

在iOS Xcode Project中管理图像,字体,颜色,字符串文字的干净方法! 很多时候,在iOS项目中管理资产和本地化字符串确实很麻烦,这个博客的目的是讨论在SwiftGen的帮助下使用资产和本地化字符串的一种干净方法。 什么是SwiftGen? SwiftGen是一种工具,用于自动为项目的资源生成Swift代码,以使其易于使用。 它们是整合它们的许多方法,通常,我更喜欢简单而安全的方法是使用cocoapods。 我们可以简单地将pod ‘SwiftGen’添加到Podfile 如果您不熟悉cocoapods,建议您在这里看看:Cocopods教程 注意:当我们点击Pods / SwiftGen时,文件夹将为空,这是因为: SwiftGen并不是真正的pod,因为它不是您的代码在运行时将依赖的库。 因此,通过CocoaPods进行安装只是将SwiftGen二进制文件安装在Pods /文件夹中的一个技巧,但是您不会在Xcode的Pods.xcodeproj的Pods / SwiftGen组中看到任何swift文件。 这是正常的:SwiftGen二进制文件仍然存在于Finder中的该文件夹中。 添加一个名为Resources的新组,并将Assets.xcassets移到resources文件夹中。 创建一个新文件Colors.json来存储我们所有的颜色,类似地存储字符串:Localizable.strings来存储我们所有的字符串 对于字体,我们必须维护许多字体文件,因此最好创建一个名为Font的组,然后将字体文件放入其中。 现在创建一个新文件GenerateResource.sh并将以下代码添加到其中, “ $ PODS_ROOT / SwiftGen / bin / swiftgen” \ xcassets -t swift4“ $ RSROOT / Assets.xcassets” \-输出“ $ RSROOT / Assets.swift” 用于提供输入文件,模板和输出文件以生成资产的快速代码,上面的字符串,字体和颜色也是如此。 添加此文件后,我们需要在Xcode中创建运行脚本。 如果您不熟悉什么是运行脚本及其运行方式,请在此处查看:运行shell脚本 添加运行脚本后,我们需要在其中添加输入和输出文件,如下所示: 在`Colors.json`和localizable.strings中添加一些条目,如下所示: 添加它们之后,当您尝试构建项目时,它将生成如下所示的输出swift文件: 将这些文件复制到Xcode项目导航器中。 让我们看看如何在代码中使用它们: 这就是IT,我们完成了。 现在 […]

Swift:在情节提要之间切换

假设您已经创建了一个名为“ SettingControllerSB.storyboard ”的情节提要 。 接下来,您将需要通过“ Storyboard ID”为View Controller命名,如下所示。 现在,您应该可以通过下面的代码片段在此情节提要 ( SettingControllerSB )中切换/导航到视图控制器( SettingController )。 让settingController = UIStoryboard(name:“ SettingControllerSB”,bundle:nil).instantiateViewController(withIdentifier:“ Setting”)为! 设定控制器 self.present(settingController,动画:true,完成:无)