任何拥有两年以上历史的iOS / MacOS项目都必须处理Swift和Objective-C的混搭 ,在这种环境中,不同的语言会试图共存。 但是,这种和平可能会受到某些特殊条件的威胁,在某些特殊条件下,由于歧义性,无法正确建立两种语言之间的桥梁,例如在循环引用的情况下。 以这种情况为例: ObjcMainClass由符合Swift编写的ComponentProtocol的对象组成,因此需要导入ProjectName-Swift.h生成的文件 ObjcMainClassTests是用于测试ObjcMainClass组件的Objective-C单元测试类。 它将使用符合ComponentProtocol的StubComponent对象,以控制要测试的公共方法的执行流程。 StubComponent是在单元测试目标中定义的,并且需要包含@testable import ProjectName代码才能找到协议定义。 由于StubComponent位于单元目标中,并且是用Swift编写的,因此ObjcMainClassTests必须导入ProjectNameTests-Swift.h生成的文件。 尝试运行单元测试,您得到的是“在ProjectNameTests-Swift.h中找不到模块ProjectName”错误: 在采用模拟单元测试方法的项目中,这种情况可能很常见,其中将新Swift接口的具体存根传递到现有的Objective-C实体。 最好的解决方案是减少Objective-C和Swift代码之间所需的桥梁数量。 尝试将模块或对象图迁移到Swift,或在计划迁移本身之前在Objective-C中临时编写协议和存根。 第二种方法显示在Github上的演示项目中,您可以在此处找到失败和通过的场景:https://github.com/matsoftware/TestObjcSwiftCircularReference。 桥接愉快☺
在本教程中,您将学习如何在MacBook中安装Xcode。 来源:iosDevelopers.org->在此处阅读原始内容 什么是XCODE? Xcode是macOS的集成开发环境,其中包含Apple开发的一套软件开发工具,用于为macOS,iOS,watchOS和tvOS开发软件。 这是开发Apple应用程序所需的唯一软件。 在本完整的iOS开发课程中,您将仅使用此软件。 XCODE是您的武器。 XCode不仅支持Swift,还支持其他编程语言,例如C,C ++,Objective-C,Objective-C ++,Java,AppleScript,Python,Ruby,ResEdit等。 XCODE的费用是多少? 作为Apple开发人员,您不会经常听到这个词,但是Xcode是免费的。 因此,现在您无需花一分钱就可以继续学习。 但是,是的,在学习了基础知识之后,如果您想将应用程序上载到appstore,则需要一个开发者帐户,该帐户的费用为$ 99。 我们将在稍后讨论。 现在,您可以继续使用它。 如何安装XCODE? 您需要按照以下步骤在MAC中安装Xcode:- 检查您的MAC版本。转到屏幕左上方的Apple图标,然后单击Cick-> About this MAC。 现在,您可以看到您的MAC版本。 Xcode 8的最低系统要求为OS X 10.11.5或更高版本(El Capitan),或者理想情况下,您应该运行macOS Sierra(10.12)。 如果您仍在运行早期的操作系统,则需要立即更新操作系统。 2.在您的MAC上打开Appstore。 3.搜索XCODE。 4.单击Xcode下方的GET按钮,然后等待其安装。 大约大小为4.8GB,因此如果您仍在使用2G,则可能需要一些时间(当然不是我) 5.安装完成后,单击应用程序中的XCODE图标并启动它。 6.轰! 您已准备好摇滚。 现在,您已经在MAC上成功安装了Xcode,并且所有设置均可用于启动Swift。 因此,让我们进入下一章。 到时候那里见 注意:我们在第1章中讨论了Swift的一些基础知识。如果您错过了该章,请在这里阅读:单击此处获得第1章。 如果您喜欢我的教程,并且想学习iOS和Swift,请访问我的博客www.iosdevelopers.org 现在,Namaste! 🙂
如果您想进行完整的iOS培训,可以通过以下详细信息与我联系,我会使用目标C或Swift提供实时iOS应用培训 skype:alok.upadhyay32 邮件:meiosdose@gmail.com 应用程式:+ 91–7838552946 您好,希望您一切都好。 在这一部分中,我们将讨论NSFetchResultController( NSFRC )。 我建议您也阅读之前有关核心数据的教程: 基本 简单的应用程序 核心数据单例 使用核心数据进行单元测试 核心数据迁移 NSFetchResultController 当需要获取 , 插入 , 更新和删除核心数据并且需要更新用户界面(如UITableView和UICollectionView)时,可以使用NSFetchResultController。 每次在托管对象上下文中对托管对象模型执行插入,更新或删除操作时, NSFRC都会提供委托回调 。 NSFRC提供了performFetch()方法,该方法返回NSManagedObject模型的数组。 这个NSManagedObject模型数组与UITableViewDelegate和UITableViewDataSource方法作为提要数组一起很好地工作。 NSFRC仅适用于核心数据。 请从这里下载启动项目 请输入☕和开始代码– FetchResultController的基本初始化包含以下步骤: NSManagedObjectContext —一个管理对象上下文,NSManagedObjectContext NSFetchRequest —提取请求,其中包含有关要从核心数据存储中提取哪个实体的信息。 NSSortDescriptor —用于按升序或降序排列结果的排序描述符。 在表视图部分中显示的可选部分名称 。 缓存名称 ,如果您有一个只读数据集,则NSFetchResultController会在第一时间从存储中读取/读取数据。 下一次提取将使用缓存自动获取数据。 显然是一个NSFetchedResultsController类。 一个负责获取诸如插入,更新,删除之类的核心数据操作的回调的委托 。 初始化 请牢记所有这些要点,以便打开入门项目并在CoreDataManager类中的代码下面复制粘贴: 懒惰的var fetchedResultsController:NSFetchedResultsController = { //初始化提取请求 让appDelegate = UIApplication.shared.delegate为! AppDelegate […]
我最近开发了一个iOS应用程序,该应用程序比较了两个HTTP库(NSURLSession和Alamofire),并决定使用A / B测试工具来收集性能更好的信息。 在这里探索时,我定义了我的研究参数(它们易于使用且易于收集支持信息),进行了一些研究以查看哪些工具更适合我的目标,并最终得到了我愿意测试的三个平台: Firebase和Kii 。 据我所知,你们中的许多人经常不知所措,因此我决定分享在将其SDK与移动应用程序集成过程中遇到的所有困难; 从我的角度来看,这些工具具有所有好处。 这是我对Kii的经验! Kii(Kii Corporation)是一家提供移动后端即服务(MBaaS)的跨国公司。 Kii Cloud服务允许移动应用程序开发人员在不编写服务器软件的情况下向其应用程序添加云服务。 我在研究过程中发现了这个问题,感到很惊讶。 我迅速了解到,使用Kii可以更轻松地访问最常见的A / B测试工具。 尽管大多数时候我不得不放弃太多信息才能开始使用平台仪表板,但是使用Kii创建帐户非常简单明了。 这样做之后,我立即可以访问仪表板。 然后,我可以通过三个简单的步骤创建一个新的体验或应用程序,正如他们所说的那样。 我只需要命名它,选择一个服务器位置(以确定观众将在哪里使用该应用程序,在我看来是不相关的)和一个平台(在我的情况下是一个iOS应用程序)。 此过程还将创建要由我的iOS应用程序中的SDK使用的密钥。 下一步基本上是创建一个新测试,并提供所有信息,我们要在该应用程序上进行测试。 Kii Cloud仪表板可以创建一个新的A / B测试,以添加多个转换,还可以为每个变化选择百分比分布。 Kii团队为多个移动平台提供了多种编程指南,以帮助想要使用其工具的任何人。 由于我的应用程序是基于Swift的应用程序,因此链接SDK非常容易。 我只需要通过添加Kii Cloud框架来准备Podfile,然后再次运行pod install命令。 SDK的用法与之前的用法非常相似:只需导入并使用它即可。 下一步是在您的应用程序中使用实验。 由于我之前已定义它,因此您只需要从Kii Cloud中检索它即可: 现在已经检索了实验,我们可以获取所选的变化和变量值(基于实验定义)。 如前所述,我尝试并集成了三种不同的工具。 这是我对这三个方面的概述,这是有关如何集成Firebase的教程,这是集成Optimizely所需的一切。
简短明了,让我们直接看一下传统MVC和iOS中MVC的图表。 在传统的MVC中,视图对象可以通过采用“主观观察者”设计模式来注册模型对象的状态更改事件,一旦视图对象感兴趣的模型对象的状态更改,视图对象就会得到通知。 在iOS中,我们应该努力避免视图对象与模型之间的直接交互。 视图对象应始终通过控制器对象来了解模型对象中的更改。 好吧,就是这样。 以上是我想在本文中谈论的主要内容,但是如果您想获得更多详细信息,可以继续阅读。 Model-View-Controller是一种非常高级的体系结构设计模式,它认为存在三种类型的对象:模型对象,视图对象和控制器对象。 它定义了这些类型的对象在应用程序中扮演的角色及其通信线路。 模型是模式的核心组成部分。 它代表特殊的知识和专长,并根据问题域表达应用程序的行为。 它们保存应用程序的数据,并定义处理该数据的逻辑。 设计良好的MVC应用程序将其所有重要数据封装在模型对象中。 一旦将数据加载到应用程序中,任何属于应用程序持久状态的数据(无论该持久状态存储在文件还是数据库中)都应驻留在模型对象中。 因为它们代表与特定问题领域相关的知识和专长,所以它们倾向于可重用。 理想情况下,模型对象与用于呈现和编辑它的用户界面没有显式连接。 例如,如果您有一个代表一个人的模型对象(例如您正在写通讯录),则可能要存储生日。 存储在您的Person模型对象中是一件好事。 但是,存储日期格式字符串或其他有关如何显示该日期的信息可能更好。 视图对象知道如何显示,并且可能允许用户编辑应用程序模型中的数据。 该视图不应负责存储其显示的数据。 (当然,这并不意味着视图从不实际存储其显示的数据。出于性能原因,视图可以缓存数据或执行类似的操作)。 视图对象可以负责仅显示模型对象的一部分,整个模型对象甚至许多不同的模型对象。 视图有很多不同的种类。 视图对象倾向于可重用和可配置,并且它们在应用程序之间提供一致性。 在iOS中,UIKit框架定义了大量视图对象,并在Interface Builder库中提供了许多视图对象。 通过重用UIKit的视图对象(例如UIButton对象),可以确保应用程序中的按钮的行为与其他任何iOS应用程序中的按钮一样,从而确保了各个应用程序在外观和行为上的高度一致性。 控制器对象充当应用程序的视图对象与其模型对象之间的中介。 控制器通常负责确保视图可以访问他们需要显示的模型对象,并充当视图了解模型更改的渠道。 控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。 在iOS MVC设计中,当用户输入值或通过视图对象指示选择时,该值或选择将传达给控制器对象。 控制器对象可能以某种特定于应用程序的方式解释用户输入,然后要么告诉模型对象如何处理此输入(例如,“添加新值”或“删除当前记录”),要么可能具有模型对象在其属性之一中反映了更改的值。 基于相同的用户输入,某些控制器对象可能还会告诉视图对象更改其外观或行为的某个方面,例如告诉按钮禁用自身。 相反,当模型对象发生更改时(例如,访问新的数据源),模型对象通常会将更改传达给控制器对象,然后控制器对象请求一个或多个视图对象进行相应的更新。 除了将应用程序分为三类之外,模型-视图-控制器设计还定义了它们之间的交互。 模型存储数据,该数据根据来自控制器的命令检索并显示在视图中。 视图基于模型的更改为用户生成新的输出。 它还可以向其关联的视图发送命令以更改视图的模型表示形式 以下准则适用于应用程序设计中的模型-视图-控制器注意事项: 设计良好的MVC应用程序的目标应该是使用(理论上至少)可重用的尽可能多的对象。 特别是,视图对象和模型对象应具有高度可重用性。 特定于应用程序的行为通常尽可能地集中在控制器对象中。 尽管可以使视图直接观察模型以检测状态变化,但是最好不要这样做。 视图对象应始终通过中介控制器对象来了解模型对象中的更改。 努力限制应用程序类中的代码依赖性。 一个类对另一个类的依赖性越大,可重用性就越差。 具体建议因所涉及的两个类别的MVC角色而异: —视图类不应依赖于模型类(尽管某些自定义视图可能不可避免)。 —除其他模型类外,模型类不应依赖任何其他内容。
作为iOS开发人员,您担负着许多职责,例如编码,为不同环境创建证书和临时证书,创建开发和发行版本,生成用于应用商店部署的屏幕截图,在发布应用之前将必需的元数据添加到应用商店并将其上传到应用商店。 因此,除了实际的开发之外,还有很多杂项任务需要照顾。 而且您必须每次都执行它们。 您想花时间做有意义的事情,这就是Fastlane出现的地方。 Fastlane自动执行这些琐碎的任务,这些任务是使用少量命令来部署构建所必需的。 是的,这是对的。 Fastlane几乎可以处理为不同环境创建证书和临时证书,创建开发和发行版本,生成用于应用程序商店部署的屏幕截图,将必需的元数据添加到应用程序商店以及将应用程序上载到应用程序商店的所有操作。 就这么简单! 您只需要设置Fastlane即可,所需的工具和少量命令集将为您完成所有工作。 Fastlane提供了各种工具来自动执行这些任务。 您可以根据需要使用这些工具。 但是在那之前 如何为您的新/现有项目设置Fastlane? 打开终端并使用以下命令导航到您的项目路径,然后按Enter。 cd ~/your project path 输入以下命令,然后按Enter。 fastlane init 将Fastlane添加到项目后,它将具有Fastlane文件夹,其中应包含以下所示的文件。 在这里, Appfile存储应用程序标识符和您的Apple ID。 Fastfile管理您创建的调用某些操作的通道。 通过Deliverfile ,您可以在将应用程序提交到App Store时添加所需的元数据。 泳道基本上是一个动作项目,按照您的指令和所需顺序执行某些任务。 您可以创建多个通道及其关联的任务。 完成后,您可以呼叫任何特定的车道以执行其任务。 这是Fastlane的工具列表。 cert:自动创建和维护iOS代码签名证书。 这将确保您在本地计算机上安装了有效的证书及其私钥。 要使用此工具,请运行命令fastlane cert 。 仅当需要创建新证书时, 证书将 –创建一个新的私钥 –创建一个新的签名请求 –生成,下载和安装证书 –将所有生成的文件导入您的钥匙串 请注意 cert将永远不会撤销您现有的证书。 如果您无法再创建任何证书,则cert会引发异常,这意味着您必须撤消其中一个现有证书才能为新证书腾出空间。 感叹:因为您宁愿花时间在建物上,也不愿与资源调配作斗争。 是的 它可以创建,更新,下载和修复供应配置文件(使用一个命令)。 它支持App Store,Ad Hoc,Development或Enterprise配置文件,并支持一些不错的功能,例如自动添加所有测试设备。 叹息将确保您在本地安装了与已安装的证书匹配的有效配置文件。 要使用此工具,请运行以下命令 […]
我发现UISplitViewController出现了一个与iOS 11的新大标题有关的烦人的bug:当UISplitView折叠时,当用户滚动详细视图控制器时,大标题拒绝缩小和拉伸。 该错误仅在详细视图控制器上显示,并且仅在拆分视图折叠(紧凑宽度)时显示。 本文介绍了该错误的原因以及解决该错误的两种解决方案。 在Xcode 9.2 / iOS 11.3上发现了错误。 UINavigationController向下搜索当前子级的视图层次结构以搜索UIScrollView。 请记住,UITableView和UICollectionView也是UIScrollViews。 首先,UINavigationController查看子级的基本视图,然后检查基本视图内的第一个视图。 之后,它放弃寻找! 如果找到滚动视图,则导航栏将挂接到滚动事件,并根据用户滚动自动调整大标题和栏的大小。 这一切都很好,当用户上下滚动时,标题将缩小和拉伸。 但是,如果导航栏找不到滚动视图怎么办? 运气不好,它不会收缩或伸展。 这里的漏洞在于拆分视图折叠了,只是在详细视图控制器中找不到滚动视图。 但是为什么找不到滚动视图? 让我们更深入… UISplitView会根据其大小类自动进行调整。 当它的宽度变紧凑时,它会自动折叠成一个简单的UINavigationController。 但是如何? 引擎盖下面发生了什么? 拆分视图适应后,只需将详细信息视图推送到主视图的UINavigationController上。 但这是棘手的部分: 典型的拆分视图设置包含两个UINavigationControllers。 Master具有其自己的UINavigationController,而Detail具有完全不同的UINavigationController。 拆分视图折叠后,Detail的UINavigationController会发生什么? 让我们拉起Xcode的漂亮视图层次调试器并找出答案。 调试器显示两个UINavigationControllers:嵌套在Master的导航控制器内部的Detail的导航控制器。 那么Master的导航控制器如何向下搜索并找到UIScrollView? 请记住,它需要找到此滚动视图才能缩小大标题。 答案:找不到它! 这就是为什么它不起作用。 嵌套在其中的第二个UINavigationController会掩盖搜索。 这就是大标题拒绝缩小和拉伸的原因。 至少那是我的有根据的猜测。 一个简单的解决方案是删除详细信息的UINavigationController。 使用以下示例中显示的设置。 但是,使用此方法存在一个主要缺点 :没有用于非折叠拆分视图的导航栏。 您可能需要使用导航栏来显示外观,标题,或者更重要的是在详细视图控制器中放置导航项。 通过实现UISplitViewControllerDelegate的两种方法:我们可以在折叠状态下显示详细信息时动态移除多余的导航控制器,并且在从折叠状态展开时也可以重新添加导航控制器。 删除UNavigationController splitViewController(_:showDetail:sender 🙂 询问委托人是否要执行在拆分视图界面的第二位置显示视图控制器的工作。 在折叠的拆分视图中显示详细信息视图控制器时删除导航控制器 第4行:检查以确保拆分视图已折叠,您只想删除处于折叠状态的导航控制器。 第4行:确保vc(视图控制器)是UINavigationController,这将停止无限递归。 第5行:从导航控制器中获取详细视图控制器。 第6行:使用detailVC手动触发显示详细信息(无需嵌入UINavigationController中)。 第7行:返回true表示我们自己处理了过渡。 重新添加UNavigationController […]
Swift中的Tuple是什么: 元组是swift中可以容纳多个类型的复合类型。而非常简单的元组是可以容纳零个或多个类型的类型。 像一个元组可以容纳Int String bool或任何其他数据,即使它可以容纳其他复合类型和名称类型。 在苹果文档中: 元组类型是用括号括起来的零个或多个类型的逗号分隔列表。 了解元组是值类型而不是引用类型更重要。 句法 : var(元组名称)=(type1,type2) var myTuple =(100,“ String”)//这里的元组具有2个值Int和String 元组可以创建两种方式的隐式定义类型或显式定义类型: 明确定义: var tupleOne:(Int,String)=(12,“ Ekram”) 在这里,我们明确定义了元组类型(Int,String) 明确定义的类型: var tupleTwo =(“ Ekram”,true) 这里这个元组上的两个元素两个是字符串,另一个是布尔 使用名称类型创建: 我们也可以这样定义类型元素名称 var tupleTwo =(name:“ Name”,isOky:true) 访问元组: 我们可以通过两种方式访问元组元素 按名字 例: var tupleTwo =(name:“ Name”,isOky:true) 现在我们可以像这样通过名称访问这两种类型 var name = tupleTwo.name var nameIsOky = tupleTwo.isOky 按索引 我们可以像这样通过它们的索引访问元组元素 创建一个元组 var tupleThree […]
开始: 一切都始于我三年级时,我报名参加了Swift课程。 在此之前,我对计算机语言的了解很少,仅了解一点Python和C。 原因: 我报名参加该课程的唯一原因是我是Apple的忠实粉丝,我喜欢他们给我带来的舒适的产品,硬件和软件的高度兼容性,美观的外观等。 我只想靠近苹果。 从班级中学到: 众所周知,这些课程仅讨论基本内容,例如如何使用UITableView,UIView,UIButton等。 这意味着您发布应用程序还有很长的路要走。 是的,是的,等等,阿诺有什么意义? 那是您需要分享的重要内容吗? 您说的没那么重要,但是让我决定发布应用程序的主要原因是与讲师的谈话。 当时我很高兴通过这门课程,我只想感谢讲师带领我进入Swift的大门。 他告诉我:“当您最终看到您的应用程序出现在App Store中时,您所获得的快乐就是您无法购买的。” 坐下来开始编码: 第一步真的很重要,不要再担心可能的障碍,只需抓一把椅子,倒一杯咖啡,坐下来开始编码。 大多数人都停留在第一步中,没有什么可担心的,只是随便打滚就可以了。 您会惊讶于开始编码后出现了多少个想法。 解决问题: 编写应用程序的方法并不总是一帆风顺,但最重要的是不要轻易放弃。 遇到问题时,请尝试调查没有该代码的网站:堆栈溢出 , 您的大部分问题都可以在那儿解决,或者从椅子上坐下来休息一下,做些编码以外的事情,无法说出原因,但是在我的情况下,当我洗个澡或在街上走路时,解决方案常常就出来了。 尝试: 有勇气尝试新事物。 以我自己为例,我从未学习过任何计算机绘图程序,因此在应用程序图标设计方面,这对我来说是巨大的痛苦。 那时,我只有三种选择。 1.雇用某人为我绘图。2.问一个了解计算机绘图的朋友。3.自己绘图。 我之所以选择第三项,是因为这是我将学到最多的唯一方法。 你真的相信那头牛吗? 当然不是,因为聘用某人来画画的价格不是我负担得起的,我是一个孤独的人。 所以我必须自己做,但这实际上是这三个中最好的选择,因为现在我学会了如何使用Sketch,而且我确定我会在以后的开发中使用它。 任何方式只要记住要面对障碍,不要害怕尝试新事物,那是改进的唯一捷径。 发行后: 我的App被Apple批准后,每当我看到我的App出现在App Store中时,我就会被幸福的狂喜所支配。 讲师说的对,这确实是您买不到的东西。 即使检查App Store Connect中的下载计数也是一件有趣的事情。 结论: 总而言之,发布一个应用程序并不难,只要跳入该应用程序就可以了。 随便吧〜
本文是Heimdall源代码的简要概述,并说明了为Vapor Web Framework编写第三方插件的过程。 去年,一位导师建议我为Vapor Web框架编写一个记录器。 最初,这似乎是一个复杂的任务,但结果再简单不过了。 让我们创建一个插件! 创建一个Swift包 蒸气插件必须是快速软件包,因此可以使用Swift Package Manager导入。 因此,首先需要在终端上运行以下命令来创建一个快速包。 麦克迪尔·海姆达尔 光盘海姆达尔 swift package init –type可执行文件 这将创建以下目录结构。 删除Sources目录中的main.swift文件。 Heimdall只是2个快速文件,而且少于200行代码! 以下是这两个文件的说明,没有实现细节。 如果您想查看所有代码,请参考github repo。 记录仪 HTTP记录器做什么? 它访问有关每个请求和响应的信息,例如状态码,HTTP方法等,并将其写入文件。 您需要创建一个“中间件”,该中间件针对每个请求运行,并将数据简单地写入文件。 以下代码片段显示了没有实现细节的基本中间件。 类记录器:中间件{ var path:字符串=“〜/ Logs / logfile.txt” //此方法针对每个Web请求运行 公共功能响应(请求:请求, chainingTo next:Responder)throw-> Response { //从响应对象访问数据 writeToFile(dataToBeLogged) } func writeToFile(path:){ //编写写入文件的快速代码 } } 记录仪与蒸气项目集成的提供商 现在您有了一个记录器,但是其他开发人员将如何在您的项目中导入您的记录器? 要添加功能或为Vapor创建第三方程序包,您需要创建一个“提供程序”。 提供者提供了一种在Vapor Web App中导入第三方程序包的统一方法。 […]