iOS 开发

iOS 常用 XCode, Swift3, UITableView, cocatouch, 一起创建 iPhone, iPad 和 Macbook应用

天哪,Codable太棒了

在上一篇文章中,我用滚动视图描述了我的短暂尝试,其中包括以下部分: 为了帮助您了解所见,我在Intertubes上寻找了引人注目的数据馈送示例,并最终选择了USGS地震馈送。 只是。 因为。 为了整理提要,我认为我可以快速给新的Swift Codable协议打转,那时候我就知道了Frickin 很棒的 Codable是什么。 但这是下一篇文章。 抓紧。 您现在可以停止收紧。 这是那篇文章 。 我们将深入研究Xcode 9和Swift 4的Codable功能。 我们将从我在滚动视图文章中提到的GeoJSON feed示例开始,然后使用RolePlayingCore Github存储库更深入地研究更多示例。 首先:简单地遵循Codable 我从一个仅包含几个项目的基本结构开始,然后迅速使用嵌套结构和枚举来构建它。 GeoJSON提要足够简单( 请参阅此处的链接 ),Swift提供的自动生成的构造函数和编码键非常有用。 我总结了一下,涵盖了大约一半的属性,大部分是有趣的属性: 现在,我没有尝试解决使用JSON可能引起的一些棘手的问题。 但这主要是因为该示例不需要它,无论如何,我花更多的真实代码(例如RolePlayingCore GitHub存储库)来揭示有关Codable的更深层真相的旅程很快就会花光。 “所有软件在编写后即会成为旧版。”-实用程序设计师Andrew Hunt和David Thomas 好的, 很好 。 那也不是真实的代码,但是由于我已经花了一些时间在JSON解码上,所以我在六个月的令人震惊的时间内建立了相当多的“旧版”代码,并且为后续工作提供了便利更深入到Codable。 所以。 CodingKeys,解码和编码,天哪! 当您必须处理带有下划线或空格,拼合或不拼合嵌套类型的名称,或转换非本地JSON类型(例如发给子级Date)的名称时 ,您突然不得不为Codables添加样板。 但是,这非常简单,我几乎想跳过它,并继续处理更棘手的问题。 但。 让我们。 让我们从使用序列化已经可以与JSON一起使用的现有类型开始。 所以。 假设某些D&D 类特征,我们可能具有: 注意TODO。 好。 呼吁采取行动! 为这项开源计划做出贡献! 帮助我致富! 帮助我舒适地退休! 好,好,回到现实… 相应的JSON格式可能如下所示: 在Swift […]

Swift,Xcode和iOS我的冒险

书签忍者是一个Web应用程序,可在台式机和移动设备的浏览器中运行。 在移动设备上,它具有看起来像本地移动应用程序的移动专用Web UI。 在桌面浏览器中,它使用书签和浏览器扩展,可以将当前网页链接发送到Ninja。 当前,在移动设备上,您只能通过通过电子邮件将链接发送到专用电子邮件地址(点击共享然后选择电子邮件)来执行此操作。 但是,使用此解决方案,您将无法添加标签或设置目标选项卡/类别,而无法在书签和扩展名的帮助下在桌面浏览器中进行操作。 因此,现在该为移动浏览器找到更好的解决方案了。 最终的解决方案是本机移动应用程序,它实际上是移动浏览器的共享扩展应用程序。 计划A 最初的计划是开发一个完整的本机iOS应用程序,该应用程序通过RESTful API与Ninja服务器通信。 3年前,当我学习Java类时,我了解了REST,但是我从未使用过REST,因此经验为零。 此外,引入REST也会影响服务器端,而不仅是客户端iOS应用程序,因此还有更多工作要做。 另一个挑战是Swift。 5年前,我开始在Objective C中开发iOS游戏。我从事该游戏的时间为一年。 然后我放弃了,我没有完成项目。 我还记得我不是Objective C和Xcode的忠实拥护者。 我读到Swift比Objective C有很多改进,所以我非常期待熟悉Swift。 计划B 当我开始担心该项目所需的工作量时,尤其是考虑到REST和Swift的不确定性时,计划B就出现了。 我的想法是通过在iOS应用中拥有Webview来简化事情。 实际上,在Web视图中,就像在浏览器中一样,您通过https访问Ninja服务器,并且UI看起来像本机移动应用程序(使用PrimeFaces mobile / jQuery mobile)。 使用此解决方案,我可以赢得以下成就: 完全不需要REST,因为我通过https访问Web视图中的服务器 只需编写更少的Swift代码(所有“添加书签”功能都已包含在已经用Java开发的webview中) 用户身份验证也可以在webview中完成(已经使用Java开发) 我认为这是一个很棒的主意,因此我决定采用计划B。以这种方式实施iOS共享扩展只用了几天。 我可以为计划B节省很多时间,所以我认为这是一个不错的决定。 仍然不是Swift和Xcode的忠实拥护者 尽管实际上只花了几天时间就编写了共享扩展名,但是Swift和Xcode还是令人失望。 在使用Xcode在Swift中进行Java和Eclipse编程之后,感觉就像倒骑了。 我无法更好地解释我的感受,但我认为有些人可能知道我的意思。 我只想谈谈我的一些经历: 我觉得API支持并不是真的对开发人员友好。 创建项目时,我必须选择共享扩展目标。 例如,这是关于在浏览器中共享网页。 因此,我认为获取标题和URL有点是something.getUrl()和something.getTitle()。 不,不是这样。 您必须编写15(!)行代码才能获得url和标题。 而且我没有在苹果官方开发文档中找到这15行代码,而是在不同的论坛和Stackoverflow上找到了这15行代码。 向后兼容性…当我在网上搜索某些东西时,发现的大多数Swift代码都在Swift 1或2中。当我尝试使用这些功能时,结果发现它们中的大多数已被折旧,删除或重命名。 3.因此,每年都有新版本的iOS发布时,我必须更新代码,重新生成并重新提交应用程序吗? 我无法调试…断点不起作用,“打印”没有打印到控制台。 我在网上搜索了此问题,并找到了很多有关此主题的讨论。 我尝试了所有建议的方法,但没有帮助。 最后,在代码中添加了iOS“ tweet”音效,以检查代码的这一部分是否运行。 […]

如何干净地隐藏UITableView节

采取任何应用程序。 前往设置。 您很有可能会找到带有分组节的UITableView。 大多数应用程序至少使用一个UITableView子类构建,并且经常需要根据用户设置或对功能的访问来显示/隐藏特定部分。 我们没有开箱即用的隐藏功能 UITableView是UIScrollView的子类,自iOS 2.0起就存在,它没有方便的isHidden属性,因此必须在数据源和委托中处理逻辑。 当逻辑跨越协议实现时,这很快就会变得像意大利面条。 最小化代码复杂度 试图处理每个特定情况并在显示节时将numberOfSections设置为n ,在隐藏节时将cellForRowAt indexPath设置为n-1 ,但是当我们必须处理cellForRowAt indexPath和后续设置中的单个单元逻辑时,这变得很复杂。 有40多个数据源和委托方法可以跟踪,并且代码维护从这里变得很棘手。 有更好的方法。 解决方案 让我们从numberOfRowsInSection开始,然后return 0以将Section隐藏 。 这是一个好的开始,但是由于页眉/页脚的填充,我们仍然会以一个空的部分结束,这会占用空间。 调整布局 要调整额外的间距,我们可以覆盖委托方法heightForHeaderInSection并为隐藏部分返回CGFloat.leastNonzeroMagnitude 。*请注意,此处返回0无效; 高度必须有一个值。 覆盖func tableView(_ tableView:UITableView,heightForHeaderInSection部分:Int)-> CGFloat { 返回shouldHideSection吗? CGFloat.leastNonzeroMagnitude:20 } 如果您已经覆盖titleForHeaderInSection ,则还需要将节标题设置为nil 。 重写func tableView(_ tableView:UITableView,titleForHeaderInSection部分:Int)->字符串? { 返回shouldHideSection吗? nil:“部分标题” } *您可能还需要覆盖storyboard中的heightForFooterInSection或将页脚值设置为<1。

在Swift框架中重用代码

复制和粘贴代码很糟糕,当发现错误并不得不使用它修复所有应用程序时,情况更是如此。 但是有办法避免吗? 就在这里! 苹果提供了一种称为框架的工具,以简化代码共享。 此外,它还为我们提供了一种将相关代码分组(模块化)和限制对代码访问(封装)的机制。 在本文中,我们将介绍什么是框架以及为什么使用它们。 我将逐步指导如何创建和构建框架,以及最终如何在应用程序中使用框架。 本文将专门用Swift编写框架中的代码。 什么是框架? 框架是一个结构化目录,可以包含共享代码和共享资源,例如图像,笔尖(XIB和情节提要的混合形式)和其他资产。 您可以将其视为传递代码和/或其他可重用资产以使代码正常工作的软件包。 为什么要使用框架? 我们已经介绍了使用框架的主要原因。 另一个很好的理由是简化与组织服务的集成。 例如,贝宝(Paypal)提供了框架来帮助应用程序处理信用卡交易。 Onfido提供了执行远程身份验证的框架。 框架可以节省客户与服务的集成工作。 为客户节省了时间和金钱。 客户使用您的服务的速度越快,您就越早开始赚钱💰。 此外,在选择提供商时,时间和精力可能是潜在客户的关键因素。 实际上,市值超过92亿美元的Stripe始于对支付处理器的整合挫折。 如何建立框架 在本节中,我们将引导您完成创建和构建框架的过程。 该框架将包含一个简单的登录屏幕。 在接下来的步骤中,我们将: 使用Cocoa Touch Framework模板创建项目 使用XIB添加视图控制器 将视图插入我们的视图控制器以允许用户登录 将XIB中的视图连接到LoginViewController类 以编程方式加载视图控制器 在框架之外访问视图控制器 如果您已经熟悉这些内容,请随意跳过任何部分或全部。 1.创建项目 首先,从菜单栏中选择File > New > Project… ,以Xcode创建一个框架。 通过选择iOS Cocoa Touch Framework项目模板继续,然后单击“ 下一步” 。 最终命名您的框架,您可以随意命名。 我要使用名称MyFramework 。 还要确保选择的语言是Swift 。 命名后,单击“ 下一步”,然后选择要存储项目的位置,最后单击“ 创建” […]

如何使用Codable在Swift 4中下载和解析Google Place JSON响应

作者的注释: 对我来说重要的是,本教程应尽可能易于遵循。 如果您有帮助实现此目标的建议,请直接与我联系。 对于新的iOS开发人员而言,网络可能是最令人困惑和困难的主题之一。 好消息! 在Swift 4中,下载和解析JSON比以往任何时候都容易,而且您可以使用清晰易懂的100%本机代码来做到这一点! 您可以通过以下方法从Google地方信息下载和解析JSON。 一旦您了解了这一点,我相信您将能够从任何地方的任何JSON下载和解析信息。 JSON基础: JSON响应由key:value对组成。 键将始终为字符串类型。 值的类型可以是:字符串,数字,布尔值,数组,对象或null。 数组用方括号([])表示。 对象用大括号({})表示。 看一下您的源中的样本JSON。 在本练习中,我们的来源是Google地方信息。 识别应用程序所需的JSON字段是关键,因此您可以使对象简洁明了。 对于本练习,我想展示如何解析来自各种不同JSON情况的数据,除了标准键值关系外,还包括数组和嵌套对象。 这是示例JSON中的一项: 2. 创建一系列符合Codable的结构。 这些结构将保存我们从JSON读取的值。 可编码结构的基本结构: 符合编码 包含一个或多个常量,这些常量将保存从JSON读取的值 包含符合String&Coding Key的枚举。 枚举将在JSON键和您的常量之间建立连接。 我建议将这些结构放在自己的Swift文件中。 为了我们的目的,我们将该文件称为ResponseModels.swift。 GooglePlacesResponse结构 //一种。 我们正在使结构符合Codable。 // b。 我们将把结果保存在Place类型的对象数组中。 //C。 我们使用枚举来确保Codable知道从JSON读取的适当密钥。 在这种情况下,我们的results数组对应于JSON中的键“结果” (图1,一级) 。 放置结构 //一种。 完成Place结构后,我们将创建Location结构。 // b。 在我们的JSON中,有些地方有开放时间,有些没有。 因此,我们将此对象标记为可选。 如果您指示Codable搜索不存在的密钥,并且您的常量未标记为可选,则您将无法成功解码JSON并且不会收到任何结果。 //C。 在这里,我们将遍历JSON中的数组,并返回一个或多个自定义结构的值。 // d。 在这种情况下,我们的常量名与JSON中的键名不匹配。 […]

了解自动版式项目关系

自从Xcode 6中引入自动布局以来,它已经成为iOS UI设计海洋中每位开发人员的波塞冬三叉戟。 每个移动应用程序都通过“自动布局”和“自适应布局”进行设计。 我们都对自动版式了解很多。 那么,这个博客有什么新内容? 你很无聊 !! 等等,伙计们! 直到最近,我还是大力使用Interface Builder进行UI设计的开发人员之一。 因此,以编程方式创建和使用约束对我来说几乎是最少的。 当我开始以编程方式编写约束时,我经常迷惑于first item和second item之间的关系,即从一个UI组件到另一个UI组件的约束关系。 因此想到了记下我的观察结果。 让我们考虑以下设计: 为了在IB中进行设置,我们将要求View.Leading — Super View.Leading, View.Trailing — Super View.Trailing, View.Top — Super View.Top, View.Bottom — Super View.Bottom的最小约束。 让我们看看我们添加的约束。 我们不希望我们的约束无法通过“安全区域”布局,因此我们将它们与“安全区域”相关联放置,因此不要感到困惑。 即使我们从“视图”到“安全区域”设置了限制条件,也请仔细标记,理想情况下,第一项应该是“ View 但在某些限制条件下,我们发现第一个项目是“ Safe Area 。 为什么Xcode会这样做? 🤦‍ 好的,让我们将View设置为每种情况下属性检查器中的第一项,并查看更改。 只需反转第一个和第二个项目的trailing和trailing 。 在两种情况下标记常量的值都变为负数。 让我们离开IB并以编程方式放置约束,方法是从Purple View所有约束,然后查看其行为。 什么地方出了错? 要了解上述行为,我们需要了解以下概念并进行相应的研究。 iOS坐标系 参考上面的图表,随着我们向右移动,任何UI组件的x value都会增加,反之亦然。 当我们向下移动时,任何UI组件的y […]