Tag: iOS应用程序开发

制作自己的CocoaPods-第3部分

到目前为止,学习如何安装cocoapods,以及如何以私人和公共两种方式来创建和分发cocoapods。 在这个故事中,您将学习如何利用自己的可可足纲(cocoapod),在上半部分私下分发。 假设您知道如何利用公开出售的椰壳足类。 私人椰壳纲的利用 假设每个人都知道吊舱的安装过程,团队中的每个人在使用私人椰壳前应遵循的步骤很少。 每个人都应该可以访问私有规范存储库 每个人都应使用以下命令将专用规格存储库添加到其本地cocoapod安装目录(ie ~/.cocoapods/repos/) 。 私有规范存储库的远程URL应该在项目Podfile的顶部指定。 这样, pod install命令便知道在哪里可以找到要安装到项目中的所需pod位置。 $ pod repo add [REPO_NAME] [REMOTE_URL] 让我们通过一个示例项目深入演示。 示范 创建一个新项目,使用私有规范存储库的源URL来安装自己的私有cocoapods,如下所示 创建项目后,需要在项目目录中创建podfile 。 Podfile是一种规范,描述了一个或多个Xcode项目的目标依赖项。 运行以下命令以创建Pod文件 $ cd [PROJECT_DIRECTORY] $ pod init $ open-一个Xcode podfile 通过最后一个命令,Xcode打开Podfile进行编辑。 如下所示添加私有规范回购源URL和私有cocoapod 修改Podfile之后,关闭Xcode并再次移至终端以运行pod install ,如下所示 $ pod安装 分析依赖关系 下载依赖项 使用my_own_cocoapod(0.0.1) 生成豆荚项目 整合客户项目 发送统计 吊舱安装完成! Podfile有1个依赖项,总共安装了1个pod。 成功完成Pod安装过程后,Cocoapod将创建.xcworkspace 。 现在开始,当您要编辑项目时,请打开xcworkspace而不是xcodeproject。 工作区包含您的项目以及相关性,如下所示 恭喜你! […]

使用Reactor建立乐观的网络

一个爱情故事 上次我们讨论了一些很酷的东西,我们可以使用Reactor架构来构建更具反应性的iOS应用程序。 今天,我们将研究如何与网络中的数据保持同步,并通过乐观的力量使我们的应用程序更快 ! 让我们看一下Reactor架构图以快速复习: 我们发送事件以使Reactor更新我们的应用程序状态。 反应器处理事件,更新状态,然后通知所有订户。 但是异步事件呢? 指令 在您的应用中,执行异步事件可能很常见。 Reactor提供了Command API,以帮助建立一致且安全的方式来执行异步事件 希望内部执行的代码看起来与您通常的网络功能相似。 此处的区别是我们将其包装在一个函数内部,该函数接收其自己的应用程序状态副本和对Reactor的引用。 我们在这里最终不需要任何状态,但是我们使用Reactor引用在网络任务完成时调度事件。 即时,乐观的网络结果 假设我们正在执行不同类型的网络请求,也许正在添加一个新播放器。 我们是否真的要等待服务器的响应才能更新UI? 您能想象喜欢在Facebook上发帖并等待请求一直到Facebook并返回以确认我们的喜欢已被成功记录,然后看到拇指变蓝吗? 没人会为此腾出时间! 我们希望我们的应用程序快速响应! 如果我们仅假设网络请求成功并立即更新UI,该怎么办? 然后,我们可以稍后再更新实际响应。 或者,如果发生错误,我们可以重置为原始状态。 我们称其为“乐观网络”。 这段代码类似于FetchPlayers命令,但是我们在结构中添加了属性-这使我们能够为异步命令设置必要的数据。 我们还在其他几个地方触发事件: 我们乐观地将新玩家添加到我们的州,并触发一个事件,通知反应堆使用我们的乐观者列表更新其当前玩家列表。 成功请求后,我们解析响应并更新(第二次)服务器返回的结果。 如果数据相同(如果我们的乐观是正确的话),那么我们应该不会有任何区别。 如果我们的请求返回错误,则将列表重置为开始时的位置,并向用户显示错误消息。 结论 如果您正在使用Reactor并执行任何异步操作,那么您想使用Commands! 命令将帮助您以一致的方式处理异步任务,同时利用Reactor的功能使UI始终保持同步。 而且,几乎无需进行任何工作,您就可以拥有乐观的力量,使您的应用程序感觉更快。

迅捷代码段#14 — UIAlertControllerStyle

您可以在这里找到其要点! UIAlertControllerStyle 第一个扩展位于UIAlertControllerStyle ,它返回特定样式的UIAlertController实例,即– alert或actionSheet 。 所以现在我可以做这样的事情, 让alertController = UIAlertControllerStyle 。警报 .controller(title :, message :, actions 🙂 因此,我现在可以要求一个特定样式的控制器(而不是在UIAlertController的构造函数中传递样式类型) (如果您已阅读以前的摘录或博客文章,现在您可能已经知道我喜欢面向扩展的apis –更加简洁易读)。 串 现在,任何警报还将具有与之关联的一些操作。 因此,下一个扩展名是String因为每个动作都将具有标题,并且它返回UIAlertAction的实例, 让dismissAction =“ Dismiss” .alertAction() let retryAction =“ Retry” .alertAction {/ *中的_重试逻辑* /} 因此,我现在可以要求在String上使用UIAlertAction ,而不是将标题传递给UIAlertAction的构造函数。 就是这样,现在让我们看一下整个api, 无需创建额外的类,我们已经能够编写如此短的api来构造任何类型的UIAlertController 。 您还可以使用相同的api制作actionSheet。 PS –为了简化起见,我使用了String ,但是如果您不喜欢它,则还可以为不同的动作创建一个Enum并将其扩展为具有类似的行为! 如果您对 Swift-Snippets 的诞生感到疑惑, 或者想查看更多此类片段,可以在 这里 找到它们 😊

iMate-iOS开发助手

iMate,iOS开发工具。 在设备和模拟器中显示应用和数据文件,在模拟器中安装,运行应用 用户说: “我尝试了几个类似的应用程序(OpenSim,…..),但这确实可以满足我的所有需求。 查找我当前Xcode项目的相应文件夹,安装/卸载应用程序,并找到这些f *** ng文件夹,这些文件夹使用50%的SSD来存储我(作为活跃的GIT用户)不需要的档案。 感谢开发人员提出清晰的概念” 网站 下载 Mac App Store(iMate Lite) 在iOS设备和模拟器中显示应用 在模拟器中运行,安装,卸载App 显示构建,存档文件,删除那些文件以节省空间 删除无用的模拟器 在iOS设备和模拟器中显示应用 2.显示构建,存档文件 3.在模拟器中运行,安装,卸载App

Swift Enum kullanarak daha组织listeleroluşturmak

UITableView 和 UICollectionView kullanırkenfarklısection’larıkurgulamak ve kodlamak她的zamankarmaşıkolmuştur。 您可以通过以下方式获取更多信息:“部分”列表中的“部分”部分,例如“部分”部分。 Buyazımdaswift enum kullanarak bu zorluklar ile engüvenliyoldannasılbaşaçıkabileceğimizdenbahsedeceğim。 Nedenkarmaşıkolsun ki吗? Diyelim ki birüründetayekranıtasarlıyoruz。 Enüstteürünresimlerininbulunduğubölüm,altındafiyat bilgisi,altındailgiliürüniçinkullanıcıaksiyonları,altındaüründetayları,altındabenzeryüylerderken uz Bukadarıyetmezmişgibibazıkullanıcılarabenzerürünlergösterilmesin,bazılarındaise aksiyonlar enüstsıradagözüksüngibi fantastik istekler mevcut。 İstanbulkarmaşıklıkburadabaşlıyor。 请使用UITableView和UICollectionView代表数据源,方法是将列表中的索引添加到索引中。 继续前进,从左到右依次是列表列表,列表列表,列表列表,列表列表,列表列表和列表列表。 Enumartıkdaha yetenekli Enum’lar genellikle kodokunabilirliğiniarttırmak,技巧güvenliğinisağlamakgibigerekçelerilebirçokprogramlama dilindekullanılır。 苹果迅捷的双向灌肠器tanımlamalarınıgeliştirdiveartıkenum’larüzerindebellideğerlertutabilme ve method yazabilmeolanaklarımızmevcut。 可以说是枚举,它的名称是alanyaratılmışoldu。 购买UITableView和UICollectionView列表中的列表。 哈迪·巴斯拉勒姆(HadiBaşlayalım) Mademöyle,类似的商店,您可以在此预订。 Benörnekolarak biraraçdetayekranıtasarlamaya karar verdim。 Listeleme双语UITableView kullanacağızve ilk olarak section’lariçinenumoluşturarakbaşlayayabiliriz。 枚举TableSection […]

如何在Swift中实现自己的Optional Chaining

深入了解.map和.flatMap运算符 自从我开始使用Swift进行编程以来,我不禁在对数组执行各种操作时使用map , reduce , filter等函数。 关于它们的事情是如此令人愉快,以至于我永远不会错过将我通常的数组处理例程变成这些漂亮的函数运算符链的机会。 但是,如果我告诉您可以将这一概念的使用范围扩展到集合类型之外呢? 对于您来说,这可能不是什么大新闻,但您可以将map运算符与Optional类型一起使用。 没有什么比老的“ Hello world”更好地说明编码问题了。 这是一个接受字符串并以“ Hello”为前缀的函数: map用于将可选值转换为另一个值(可能也是不同类型)。 如果可选值中有一个值,那么它将遍历整个转换链。 如果不是,它将继续返回nil 。 简单。 map用于将一个可选值转换为另一个可选值。 nil的行为不会改变,但是对于非nil值,其他所有转换都会增加一层嵌套,例如,您将从.some(T)转到.some(.some(U)) ,然后.some(.some(.some(V)))等。 就像前面的示例一样, flatMap用于将值转换为另一个可选值。 但是,每个新层都被“展平”到当前级别,因此最后只剩下一个Optional对象。 类似于保龄球从车道上掉下来并不断滚滚落下,一旦该值变为nil所有后续转换都将被忽略,并且一直保持nil直到链结束。 希望这可以使您更好地了解这些功能的行为方式以及它们为您带来的好处。 您可能还会注意到,此概念经常针对各种数据类型实现。 例如,一种非常流行的Result类型,广泛用作来自网络请求的值和错误的容器。 许多实现(例如这种实现)也支持map和flatMap功能。 但是,等等,还有更多。 再次查看图片,特别是flatMap部分。 这种行为会让您想起某些事情吗? 执行会沿着可选值的链进行下去,直到成功完成或达到nil为止。 如果您考虑一下,“可选链接”的工作方式完全相同。 因此,必须有一种方法可以仅使用map和flatMap运算符提出我们自己的Optional Chaining实现。 假设我们不使用转换函数,而是要访问某些属性。 从Swift版本4开始,我们可以通过传递属性名称作为函数参数来使用KeyPath语法来访问属性。 然后,我们将使用flatMap读取可选属性并map以访问非可选属性。 为了模仿原始语法,我们将编写一个扩展名并使用最喜欢的某个运算符,即~> 。 扩展名如下所示: 借助方法重写的强大功能,我们在处理普通变量和可选变量时都可以使用相同的方法签名,这将导致语法均匀,因此使用这些运算符的人将不必知道底层的方法。 试试看! 此新运算符可以用作内置链接语法的替代方法。 像这样: 几乎没有区别,您可以互换使用它们! 如您所见,“可选链接”并不是什么魔术,而仅仅是一种语法糖,它是一种机制的糖,您可以使用高阶函数的功能自行实现该机制。 现在,您知道了如何利用map和flatMap来编写更多声明性代码,并且已经准备好处理RxSwift之类的功能范例。 不要忘记Swift是开源的! 如果您想了解更多信息,可以自己研究Optional类型的源代码。 编码愉快!

Swift 4中的多个ViewController(第1部分)

系列 Swift 4中的多个ViewController(第1部分) 如何在Swift 4 medium.com中使用Multiple ViewController Swift 4中的多个ViewController(第2部分) 如何在Swift 4 medium.com中使用Multiple ViewController 彭根纳兰 Dalam bahasa程序swift kita bisa membuat lebih dari satu view dengan satu view controller yang sama。 Akan tetapi akan lebih bagus jika massing-masing视图memiliki satu视图控制器。 Dengan demikian kita bisa lebih mudah dalam mengatur fungsi atau setiap property pada masing-masing view。 Khusus untuk入门教程ini Mungkin,Akan,Berguna,Agar,Lebih,Memudahkan,Dalam,Membuat,Aplikasi,Yang […]

使用UIFeedbackGenerator的触觉反馈和Taptic Engine改善iOS应用程序用户体验

在我的上一篇文章中,我写了关于在任何UIView中引入3D Touch作为通用UIGestureRecognizer来改善与您的应用程序的交互的信息,现在我想探索触觉反馈,这为我们提供了一种新的物理方式来控制用户所发生的事情在他的iPhone上。 在通过Taptic引擎提供触觉反馈之前,播放声音是向用户提供有关应用程序中动作的反馈的唯一方法,但是声音令人讨厌,有时令人毛骨悚然。 UIKit为此提供了一种简洁明了的方法:用于触觉反馈即插即用实现的标准安全接口UIFeedbackGenerator。 在特定的UIFeedbackGenerator中,是一个我们不能直接使用的抽象超类,我们必须在3个具体的子类中进行选择,每个子类都有特定的使用目的地。 UISelectionFeedbackGenerator 当用户通过一系列离散值更改选择时,例如在Apple通过诸如UIDatePicker之类的选择器移动Apple时,提供此反馈。 在实现自定义分段控件或更改任何选择时,可以在多个选择表视图和集合视图上使用它。 UIImpactFeedbackGenerator 该反馈旨在用于模拟Taptic引擎的物理影响。 UI元素固定到位或某些元素碰撞时,请使用它。 它具有3个强度级别,您必须将其作为初始参数传递:轻,中和重。 Apple建议根据UI元素大小选择强度。 我还在自定义3D触摸手势识别器(在GitHub和我的Medium帖子中)中使用它,以中等风格提供有关成功手势的反馈。 UINotificationFeedbackGenerator 这是最完整的反馈生成器。 您应该使用它来传达任务或动作的结果。 与ImpactFeedback相似,它接受一个参数,但是这次不是init方法,而是运行Feeedback时。 这次的样式与强度无关,而是指通知操作的结果:成功,警告或错误。 选择一个表示用户已结束操作的结果。 UIFeedbackGenerator非常容易集成到您的应用程序中。 自iOS 10起可用,除非您支持以前的iOS版本,否则不必检查可用性,否则: 如果 #available ( iOS 10,*){ // UIFeedbackGenerator代码块 } 或更快捷的方式: Guard #available ( iOS 10,*) else { 返回 } // UIFeedbackGenerator代码块 现在,您可以初始化从3个可用类中选择的具体类,并确保选择一个适合用户操作的类。 让feedbackGenerator = UISelectionFeedbackGenerator.init() //要么 让feedbackGenerator = UIImpactFeedbackGenerator(style:.medium) //要么 让feedbackGenerator = UINotificationFeedbackGenerator() […]

功能性Swift:闭包{}

闭包是可以独立传递的功能块,可以在代码中传递和使用。 – 苹果 闭包可以从定义它们的上下文中捕获和存储对任何常量和变量的引用,因此称为闭包。 您可以将闭包视为一个没有自己名称的函数,并从其环境中捕获任何值。 函数和闭包是Swift中的一流对象 :您可以存储它们,将它们作为函数的参数传递,并像对待其他任何值或对象一样对待它们。 将闭包作为完成处理程序传递是许多API中的常见模式。 标准Swift库主要将闭包用于事件处理和回调。 函数是执行特定任务的独立代码块。 您为函数指定一个名称,该名称可以标识其功能,该名称用于“调用”该函数以在需要时执行其任务。 您可以使用func关键字定义一个函数。 函数可以不带太多参数,可变参数而返回任何一个或多个参数。 函数类型由参数类型和函数的返回类型组成。 对于上面的示例,函数类型为: (Int, Int) -> Int 可以将其理解为:“具有两个参数的函数,都具有Int类型,并且都返回Int类型的值。”可以将函数类型设置为参数或函数的返回类型。 可以将函数类型分配给任何这样的变量: var mathFunction:(Int,Int)-> Int =添加 函数是闭包的特殊情况。 闭包采用以下三种形式之一: 全局函数:它们具有名称,不能捕获值。 嵌套函数:它们有一个名称,可以从其封闭函数中捕获值。 闭包表达式:它们没有名称,可以从其周围的上下文中捕获值。 可以通过将函数类型放在大括号内并in返回类型后in关键字中来创建闭包。 单表达式闭包可以通过从声明中省略return关键字来隐式返回其单表达式的结果。 对于多行表达式闭包,不能省略return关键字。 如果由于函数的最后一个参数而需要将闭包表达式传递给函数并且闭包表达式太长,则可以将其写为尾随闭包。 在函数调用的括号()后面写一个结尾的闭包,即使它仍然是函数的参数。 使用尾随闭包语法时,不要在函数调用的过程中为闭包编写参数标签。 如果闭包是方法的最后一个参数,那么swift允许您这样编写: 使用reduce()的结尾封闭示例 尾随闭包语法的使用可以在闭包支持的功能之后立即整齐地封装闭包的功能,而无需将整个闭包包装在reduce(_:)方法的外部括号内。 闭包可以从定义它的周围上下文中捕获常量和变量。 然后,闭包可以从其主体内部引用和修改这些常量和变量的值,即使定义常量和变量的原始范围不再存在。 在Swift中,最简单的可以捕获值的闭包形式是嵌套函数,它写在另一个函数的主体内。 嵌套函数可以捕获其外部函数的任何自变量,还可以捕获在外部函数内定义的任何常量和变量。 Swift文档中给出的示例 此makeIncrementer函数接受一个参数(即Int)作为输入,并返回一个函数类型,即() -> Int 。 这意味着它将返回一个function ,而不是一个简单的值。 它返回的函数没有参数,并且每次调用都返回一个Int值。 在这里, amount是参数, runningTotal被声明为变量并初始化为0。嵌套函数incrementer runningTotal从周围的上下文中捕获amount和runningTotal […]

使用拖放API构建类似Trello的iOS应用

拖放是用户交互,当我们要构建一个用户可以在屏幕上移动数据的应用程序时,它很自然地起作用。 Trello,Jira等应用程序正在大量使用它在板之间移动数据。 在iOS 11 SDK发行之前通过拖放交互构建iOS应用程序并不是一个简单的过程。 根据我以前的经验,我们必须手动执行一些繁琐的任务,例如: 将长按手势识别器添加到我们要拖动的视图中。 用户开始拖动时创建快照视图。 当用户在屏幕上拖动快照时,处理所拖动快照坐标的更新。 当用户将项目放到坐标位置时进行检测和处理。 同步放置的数据目标和拖动的数据源,然后分别更新UI。 即使完成所有这些任务,也很难使它顺利运行。 值得庆幸的是,随着iOS 11的发布,Apple终于在Cocoa Touch SDK中提供了拖放API。 自从iOS 12是移动操作系统的最新版本以来,iOS 11是iPad以来最大的OS更新,这是史蒂夫·乔布斯(Steve Jobs)在2010年1月首次推出该设备以来,它是第三台介于PC和智能手机之间的设备。 它支持多任务处理,其中多个应用程序同时在“分屏”和“滑行”界面上运行。 macOS的Dock也是首次引入,它允许用户自定义自己喜欢的应用程序和最近使用的应用程序。 拖放API是在应用之间进行通信的最佳方式。 以下是几个主要功能: 在iOS上支持系统范围的拖放。 使用拆分视图或拖动到Dock上的应用程序图标,可在应用程序之间移动文本,图像和文件。 拖放视图时,API会自动处理所有动画。 开发人员只需要实现协议即可获得更大的灵活性和定制性。 支持通过拖动一个项目并点击其他项目来拖动多个项目。 拖放式API 根据Apple文档页面,以下是拖放API概述的简要摘要: 拖放功能既可以在单个应用程序中运行,也可以在多个应用程序之间运行。 在iPhone环境中,拖放操作仅在单个应用程序中有效。 在多应用程序环境中,用户开始拖动视图的应用程序将成为源应用程序。 目标应用是用户将视图放置到的应用。 当用户正在执行拖放手势时,系统会启动“ Drag Activity 。 系统还管理用户通过Drag Session拖动的对象的状态。 可以将UIView配置为使用实现UIDragDelegate和UIDropDelegate对象来支持拖放。 UITableView和UICollectionView都具有其自己单独的视图属性和协议,以处理单元格之间的拖放。 该API提供了自定义拖放行为的灵活性。 该系统还使用UTI (Uniform Type Identifier)安全,自动地处理应用程序之间的数据移动和加载,以处理文本,图像,联系人和其他许多内容。 我们将建立什么 在本教程中,我们将使用拖放API构建具有以下基本功能的类似Trello的应用程序: 创建一个木板。 将项目添加到板上。 使用拖放在木板之间移动项目。 为了成功创建这些功能,以下是我们将在项目中实现的任务: 应用流程图。 […]