Tag: Swift编程

自定义ViewControllers演示

您可以在我的博客上阅读此文章 我们的应用程序中发生的大多数屏幕转换都属于以下类别: 模态演示 在导航堆栈上推送/弹出 尽管这足以完成我们需要做的大多数工作,但在某些极端情况下,我们可能希望采用一种“原生”方式少而定制化的解决方案。 对我们来说幸运的是,UIKit为这项工作提供了正确的工具。 与往常一样,我们不必离官方文档(View Controller编程指南)太远,更详细地说,我们正在寻找创建自定义演示文稿。 本指南在文档档案库中,并带有Objective-C示例,但它们仍然是您可以在其中找到的最佳内容。 阅读指南将揭示一些有趣的观点。 当将要显示视图控制器时,UIKit将执行以下操作: 调用过渡委托的presentationControllerForPresentedViewController:presentingViewController:sourceViewController:方法以检索您的自定义表示控制器。 向过渡委托者询问动画师和交互式动画师对象(如果有)。 调用演示文稿控制器的presentationTransitionWillBegin方法。 执行过渡动画。 在动画过程中,UIKit调用演示文稿控制器的containerViewWillLayoutSubviews和containerViewDidLayoutSubviews方法,以便您可以根据需要调整自定义视图的布局。 过渡动画结束时,调用presentationTransitionDidEnd :方法。 因此,我们有几点可以操作和更改动画和演示样式。 展示横幅 假设我们要将文件上传到我们的服务器,并且我们希望在操作完成后通知用户: func upload(file: File, using uploader: FileUploader) { uploader.send(file, then: { let banner = Banner(message: “File successfully uploaded ✅”) self.present(banner, animated: true) }) } 现在这将以模态形式全屏显示我们的横幅,但是我们可能希望使其看起来像屏幕底部的横幅,以减少入侵。 我们将专注于自定义演示,同时使用底部的默认过渡。 首先,让我们创建我们的自定义表示控制器: class BannerPresentationController: UIPresentationController { override var frameOfPresentedViewInContainerView: CGRect […]

XCode Long编译和完成问题

。 + [ctrl] + [space] buölümcül3’lü儿子zamanlarda benigerçektenyormayabaşladı。 Oysa enbaşadöndüğümüzdeherşeyhepgüzeloluyor veyagüzeldi。 Ne zaman yeni bir projeyebaşlasamo kadar mutlu oluyorum ki yazarken design konusundadüşünmeler或XCode’a nesöylesemyapıyorolması。 自动补全✅ 编译速度✅ Yazdığınızsatırsayıdı50–60 binlereulaştığındaXCode’a bi inme iniyor orlkönce。 Ortalıkyangınyeri osxağlıyorbi kenarda。 Sizde bi kenardaağlıyorsunuz。 自动补全😢 编译速度😢 Tamambirşeyleryapma vakti geldi diyorsunuz。 Jordan Rosemayısayında 编译 zamanısizintanımladığınınparametreninüstündeolanmethodları警告olarak veren bir swift flag ekledi。 添加前端选项“ -warn-long-function-bodies =”。 […]

为您的应用快速赢取:“添加到Siri”按钮

如您所知,自iOS 12起,可以将“ Siri快捷方式”从您的应用程序“捐赠”到用户可以在iOS设置中找到并且可以在“快捷方式”应用程序中用于自定义目的的操作系统。 您可以找到很多有关捐赠捷径的指南和讨论 NSUserActivity或INIntent就像来自NSSpain 2018的Ellen Shapiro的演讲一样。 在这篇文章中,我的主题略有不同,这是Siri快捷方式的一种捷径:直接从您的应用程序中显示Siri快捷方式语音注册的UI,每个用户都可以识别一个标准按钮。 SiriKit中的IntentsUI提供了一个新的UIButton子类,该子类具有默认用户界面,可以显示INUIAddVoiceShortcutViewController 。 该控制器将指导用户完成向Siri添加快捷方式的过程,而不是向快捷方式应用程序和设备设置的Siri部分添加快捷方式。 首先,您必须在ViewController中import IntentsUI 。 此按钮有4种可能的样式,应作为参数传递给 初始化方法: 注意:带有样式初始值设定项的button.translatesAutoresizingMaskIntoConstraints = false带有零帧,因此,如果以编程方式初始化它,请记住设置button.translatesAutoresizingMaskIntoConstraints = false 下一步:创建一个INShortcut并将其设置为button属性。 在INUIAddVoiceShortcutButton上向上触摸会自动调用此快捷方式上的操作。 可以使用INIntent和NSUserActivity创建快捷方式。 如果选择使用INIntent,请记住初始化程序是有故障的。 在第一段或Apple文档的此页面中链接的演讲中了解有关自定义INIntent的更多信息。 现在是时候设置代表了。 INUIAddVoiceShortcutButtonDelegate协议实现将在需要呈现请求视图控制器时通知您的视图控制器。 在此示例中,我仅介绍了addVoiceShortcutViewController或editVoiceShortcutViewController,而没有任何其他操作,但是您可以检查哪个按钮调用了委托方法或执行您喜欢的操作(我建议使用这些方法在分析服务上跟踪这些操作) 。 注意:没有“编辑按钮”,因此将是一个按钮,用于选择要显示的视图控制器 还没有结束,我们还有最后一点: INUIAddVoiceShortcutViewController和INUIEditVoiceShortcutViewController必须具有自己的委托,因为像许多其他系统ViewController(即邮件共享)一样,它们在取消或成功时不会以编程方式取消。 我们必须再处理两个委托,但是在任何情况下都可以丢弃VC,就像我在本示例中所做的那样,或者像在使用这些方法进行任何附带操作之前一样。 跟踪此事件也很有趣,以便更好地了解您的用户使用Siri Shortcut所做的事情。 方法签名正在讨论用户已采取的操作,请注意,我已将委托添加到以前的方法中: 现在,您的应用已准备好在Siri中捐赠和注册语音快捷方式,而无需离开它,也不会中断用户体验。 当您的用户在Siri对话中说出“魔术”短语时,您的AppDelegate将像对任何Intent或NSUserActivity一样调用continueUserActivity方法。 您可以在Apple文档中或在Ray Wenderlich撰写的有关Handoff的本教程中找到有关此主题的更多信息,请记住,Handoff和Siri快捷方式均基于NSUserActivity,并且在App Delegate中具有相同的入口点。 您还可以在我的GitHub上使用本文摘要的示例代码找到一个工作示例。 觉得这篇文章有用吗? 在Medium上关注我(Giuseppe Travasoni),并在下面查看我最受欢迎的文章! 请👏这篇文章分享! 使用UIFeedbackGenerator的触觉反馈和Taptic Engine改善iOS应用程序用户体验 如何将iOS 3D Touch作为UIGestureRecognizer应用于任何UIView 如何将Squircle半径应用于iOS视图

Penggunaan数据模型和结构pada Swift

Swift merupakan salah satu bahasa pemrograman yang mendukung pemakaian数据模型。 Kali ini saya akan membuatnya menggunakan struktur数据yang didapat dari API developer.marvel.com。 Mengapa harus menggunakan数据模型和结构? 恕我直言,bisa saja sebuah aplikasi dibuat tanpa menggunakan数据模型和结构,dimana masih menggunakan字符串状态。 Tapi tentu hal ini阿肯语menyulitkan untuk dokumentasi aplikasi tersebut和banyak kemungkinan untuk terjadi 错字 。 Bisa Juga Membuat Frustasi开发人员Yang Baru Akan Mulai Mengembangkan Aplikasi Tersebut。 […]

功能驱动的iOS架构的构想

更新: 我在Swift Ninjas聚会上展示的幻灯片。 亲爱的iOS朋友! 自从iOS社区开始尝试设计非UI驱动的应用程序以来,已经过去了两年时间。 我们都可以轻松回忆起Clean Architecture,Flow Coordinators和Redux之类的方法,它们都不是出于一种或其他原因成为标准的,但这并不意味着我们必须放弃! 我们的目标并不那么雄心勃勃。 我们希望能够: –构建业务逻辑驱动的应用程序,在这些应用程序中,我们的UI不会占据中心位置,而只是其他组件一样; –将功能组合为独立元素,以使我们的架构易于更改; –粗略地定义应用程序,稍后添加详细信息,并仅在需要时和将复杂元素分成小块时使用。 因此,让我们一起开始下一次尝试! 如果您想学习如何编写描述iOS应用功能的可读流,请查看具有功能驱动架构的示例Blog应用:

从Xcode配置生成代码

如果您还使用xcconfig文件来管理不同的环境beta , staging和live那么您可能已经注意到,通过plist从xcconfig读取值并不是真正的干净方法,它也不提供编译时安全性。 因为有时您忘记了将配置值添加到其他环境,并且预处理器宏不再能够读取这些值。 在plist中公开配置环境值 要从配置中读取值,旧的方法是在info.plist添加条目,然后在代码运行时中读取它们。 如果这些值不在特定配置中,则该应用程序将在运行时崩溃。 将生成的文件从finder中拖放到Xcode项目中,以便可以对其进行引用。 将文件BuildConfig.generated.swift添加到gitignore以便可以在每次构建时生成它。 否则,您将经常看到该文件在更改,因为您将经常在debug和release配置之间进行切换。 让我们将网址转换为它的类型 另一个sed😉 sed -E’s /“ http。* / URL(string:&)!/’ 将此添加到同一文件将成为 echo“ //生成的文件,请不要编辑” printf“ /// \ n // \ n //由BuildConfig.sh \ n” printf“ import Foundation \ n \ n” echo“ struct BuildConfig {” echo“ fileprivate init (){}“ env | \ grep” buildConfig_“ | \ sed“ s […]

目标C语言的方法或功能

方法或函数是一堆代码,我们可以使用一个唯一的名称从代码的其他地方调用,该方法将执行某些任务或返回我们可以使用的某种结果。 方法用于将我们的代码组织为可重用(和可理解)的方式,从而节省了很多时间和精力。 目标C有两种方法 不返回任何内容的方法 返回值的方法 让我们看看如何创建方法并调用该方法。 方法声明的语法 没有参数 -(返回类型)MethodName { //具有一堆代码的方法主体 } 2.带参数 -(返回类型)MethodName:(Parameter DataType)ParameterName { //具有一堆代码的方法主体 } 方法调用的语法 [self MethodName]; 让我们看看什么都不返回的方法 方法声明,不返回不带参数的内容 -(无效)PrintName { NSLog(@“我的名字是Verma Mukesh”)); } [Self PrintName]; //执行方法后,控制台上将显示“我的名字是Verma Mukesh” 不声明任何参数的方法声明 -(无效)PrintName:(NSString *)strName { NSLog(@“我的名字是%@”,strName); } [self PrintName:@“ Verma Mukesh”]; //执行方法后,控制台上将显示“我的名字是Verma Mukesh” 方法声明,该方法返回Nothing多个参数 -(无效)PrintFullName:(NSString *)strFirstName AndLastName:(NSString *)strLastName { NSLog(@“我的全名是%@%@”,strFirstName,strLastName); } [self PrintFullName:@“ Verma” […]

使用Swift进行实验

JoséAlejandro Cuffia在“ Unsplash”上发表的“棕色表面上的白色和绿色纸张” 我已经尝试过Swift一段时间了,至少可以说,语言很好。 您需要了解的警告,例如闭包,弱变量(无主变量),强变量,转义闭包以命名其中的某些变量,对于初学者来说是很复杂的。 但是,一旦习惯使用,构造本身就很简单(来自Ruby和Java背景) 我尝试了一个简单的应用程序,该应用程序从API中获取JSON,并以表格形式显示结果。 挑战本身就是结构。 我已经做了一段时间的Objective-C,问题始终是构建项目时没有标准。 有些人这样做非常复杂,例如使用响应式代码,键值编码和键值观察。 和其他人以更简单的方式。 我想说,从简单开始很容易,但是一旦复杂性开始,就必须考虑拆分和观察事物。 该应用程序本身具有一个主表视图,该表包含6个静态单元格,每个单元格使用不同的参数调用API。 我也尝试过缓存结果,但是似乎API本身没有返回正确的缓存头(返回无缓存)。 单击静态单元格时,将调用API,然后将数据填充到文章的结果列表视图中。 生成的表视图具有动态单元格,这有些复杂。 我尝试了一个集合视图,但是那似乎没有用。 看看https://github.com/dinks/MyNews 参考文献 自调整表格视图单元格 在本教程中,您将学习如何启用自动调整大小的表格视图单元,以及如何使它们按需调整大小。 www.raywenderlich.com https://newsapi.org/v2/top-headlines

加快您的iOS开发:模块的范例

如果我们看一下图形,这个概念很容易理解。 我们只需要将您的应用视为ViewControllers件的集合,这些ViewControllers件可能会出现在ViewControllers任何位置。 这意味着,如果我们想在不同的ViewController重用“模块1”,则它应尽可能简单。 然后,我们推断ViewController将由Modules组成 为了开始使用模块,需要一种解决方法,这就是为什么我创建了一个Cocoapod库来帮助我们实现这一奇妙 范例的原因 FTMTableSectionModules 具有TableView的可重用ViewController,分为几节 cocoapods.org FTMTableSectionModules 基本上包含2个类别: ModulesViewController是UIViewController的子类。 此类仅是已实现UITableViewDelegate 和 UITableViewDataSource所有方法的代理。 主要功能是根据所选部分将职责重定向到适当的模块。 此外,还公开了处理模块的方法,例如添加/删除/插入… TableSectionModule ,AKA 模块是NSObject的子类。 此类包含一些逻辑,以改善UITableView的生命周期 ,并使TableView的各个部分的隔离和可重用性变得更加容易。 在这里,我们描述了模块生命周期中最重要的步骤: 我想开始尝试我们已经有足够的信息,因此我们可以跳到有趣的事情……。 编码时间! 。 像往常一样,尝试开发中的新事物的最佳方法是创建一个“ Hello World!”。 第一步,创建一个HelloWorldModule作为TableSectionModule的子类 最后一步,我们错过了在MyFirstModulesVC中添加HelloWorldModule的操作 。 超类ModulesViewController自动调用一个名为createModules的方法,因此我们需要重写此方法: 模块范例的主要关键之一是将责任划分到应用程序组成的不同部分。 这可以归纳为2条规则。 模块内部发生的事情留在Module中 。 在模块外部发生的事情留在ViewController中 。 与其用无聊的理论来解释,不如让我们举一些真实的例子。 模块内部会发生什么,请留在模块中。 想象一下,我们有应用程序的典型部分,您可以在其中显示和隐藏详细信息。 正如我在开始时提到的,尝试将应用视为模块的集合是非常重要的; 在这种情况下,我们面对的是一个清晰的示例,我们需要创建一个新的模块。 在这里,我们可以看到一个示例,说明这个新模块的外观: 从GIF可以猜到,我们在扩展和折叠信息时将插入和删除UITableViewCells 。 遵循第一条规则, Module具有足够的授予权和责任如何单独实现这一目标,因此这意味着对于ViewController ,折叠和展开将是完全透明的。 在这里,您是实现新FoldUnfoldModule的代码。 加起来 ViewController仅包含Modules和Delegates如果有)的列表。 该Module包含视图(页眉/页脚/单元格)以及完全完成TableViewSection所需的每个逻辑 自从我们开始以来,已经提到过多次,这对于创建可以以最简单的方式在任何地方重复使用的组件非常重要。 […]

Swift使用Apollo和GraphQL的Swift中的单元测试指南第二部分

现在,我们有了一个可以正常运行的快速服务,该服务返回了名称空间域模型,我们可以为此类设计一种测试策略。 首先,我们要考虑对GraphQL进行完全模拟是否值得。 例如,您可以创建一个符合ApolloInterface的模拟对象,然后从那里编写单元测试。 相反,我们将模拟Apollo客户端,并使用残存的原始JSON实际执行Apollo查询。 这是理想的,因为我们实际上测试了代码如何与Apollo交互。 此外,您可以使用JSON和模拟的NetworkTransport对象在单元测试中模拟失败的网络或解析状态,从而使我们可以获得有关World.Store网络对象的更多测试范围。 此测试策略是从Apollo-iOS测试套件中借用的,您可以在此处查看源代码。 首先,让我们看一下模拟的NetworkTransport对象: 最初发布在 gist.github.com上 。