正如我们在上一篇文章中介绍了UITableView的基本用法之后,这次我们将将该示例转换为一个使用RxSwift处理UITableView 。 RxSwift是一个更高级的主题。 请注意,这个故事仅演示了基础知识,但是可以肯定的是,如果广泛且正确地使用它,它可以将您和您的应用程序提升到另一个层次。 本教程的源代码可在Github上获得。 我们将从创建另一个安装了Cocoapods和RxSwift Xcode项目开始。 $ pod init 将RxSwift添加到Podfile 。 …#UITableView吊舱“ RxSwift”的吊舱 豆荚“ RxCocoa” … 安装pod并打开UITableView.xcworkspace 。 $ pod安装 初始设置 首先通过在UIViewController导入RxSwift和RxCocoa ,然后我们可以将代码转换为Rx样式。 导入RxSwift 进口RxCocoa 这次,我们还需要在UITableView通过以下JSON显示数据。 // travel.json [ { “名称”:“香港”, “ desc”:“我住的地方。”, “ url”:“ https://zh.wikipedia.org/wiki/香港 }, { “名称”:“新加坡”, “ desc”:“一个干净整洁的地方。”, “ url”:“ https://zh.wikipedia.org/wiki/新加坡” }, { “ name”:“ Japan”, “ desc”:“喜欢那些美味的寿司和生鱼片。”, “ url”:“ https://zh.wikipedia.org/wiki/日本” […]
本地化您的应用程序显示名称实际上是一个非常简单的任务,因此让我们开始吧。 设置本地化 首先,请确保您设置了另一种语言的本地化(注意,这不是完全本地化应用程序所需的全部,而只是显示名称)。 在项目导航器中选择您的项目,转到“本地化”,然后选择一种语言来本地化您的显示名称,如下图所示。 创建一个字符串文件 接下来,您必须创建一个Strings文件,其中将包含要在项目中使用的本地化名称。 转到File> New> File,选择您的OS目标,转到Resources,然后选择Strings文件模板,如下所示。 选择模板,在名称字段中输入InfoPlist ,然后创建文件。 添加本地化的字符串 创建字符串文件后,将其打开,然后在检查器中选择要本地化的所有语言。 在您的基本语言文件中,添加以下内容: / *本地化包显示名称* / “ CFBundleDisplayName” =“您的本地化名称_In_母语_语言”; 然后,在每个其他语言文件中输入相同的名称,这样就将翻译名称替换为您的本机名称: / *本地化包显示名称* / “ CFBundleDisplayName” =“ Localized_Name_In_Other_Language”; 完成后,每个文件应如下所示: 将本地化密钥添加到Info.plist 您要做的最后一件事是在Info.plist文件中添加必要的键,以使您的应用能够在适当的情况下读取并交换本地化的显示名称。 您将添加的第一个键是“捆绑显示名称”键,如下所示: 捆绑包显示名称= $(PRODUCT_NAME) 您还必须添加“应用程序具有本地化的显示名称”键,并将其设置为yes,如下所示: 应用程序具有本地化的显示名称= YES Info.plist这些键如下所示: 这里的所有都是它的! 现在,您的应用名称将以您本地化的所有语言显示。
我的一个朋友要我帮助她在她正在重写并升级到Swift的现有应用程序上学习自动布局,并添加一些新功能。 该应用程序是夏威夷瓦胡岛上使用的一种教育工具,旨在帮助孩子们对学习环境产生兴趣。 我们准备更新Storyboard中的许多现有视图控制器,添加UIStackViews并设置约束。 大部分设置都非常简单,我们只需要确保针对新的较大手机尺寸正确更新了按钮,图像和文本视图即可。 该应用程序的主要重点之一是在Hèeia池塘周围,其中包含传感器信息,该应用程序可以显示该信息以向孩子们显示池塘中任何给定时刻的情况。 这是设计的新功能,其想法是在池塘周围有一系列按钮,以指示位于池塘中的传感器。 基本上,我们需要将按钮排列成半圆形,以近似池塘的边缘。 我最初的想法是使用贝塞尔曲线路径在池塘周围创建弧线,然后沿弧线放置视图。 不幸的是,没有一种简单的方法可以访问组成UIBezierPath的点。 关于Stackoverflow有一个答案,但这似乎比我需要的要复杂(但可以肯定地说更准确)。 相反,我选择对高中几何和三角学课进行噩梦般的回忆。 我先要说的是,高中时代对我来说早已不存在,而几何学就我所能达到的程度而言,我做得并不好。 可以说,正是这堂课让我不喜欢数学。 即使我的计算机科学学位三角学需要所有数学运算,也从来没有真正提出太多。 问题似乎比实际上要难得多,实际上是一旦您将注意力放在数学上。 我们都(希望地)记住一个直角三角形的勾股定理:a²+b²=c²。 这与我的旧克星正弦和余弦一起变得非常方便。 如果您有兴趣,可以在这里查看数学,我将跳过它,仅声明如果您有一个圆的半径和一个角度(通常由ThetaΘ表示),则可以使用余弦(Θ)函数和使用正弦(Θ)函数的y坐标。 这给了我们一个简单的公式,可以找到圆上给定点的一对(x,y)坐标。 x坐标=半径*余弦(Θ) y坐标=半径*正弦(Θ) 我想对视图应在屏幕上出现的位置进行可视化参考,因此我使用UIBezierPath创建了一个圆,池塘的左边缘大致充当了圆的中心。 由于自然不喜欢做完美的圆,因此我们的位置将是一个近似值。 我们使用贝塞尔曲线路径绘制对齐圆,并将圆与池塘近似中心的偏移量居中。 这为我们提供了一个很好的参照视图。 接下来,我们使用一个简单的循环对视图进行布局,以计算每个视图沿假想圆放置时Theta(角度)的变化。 由于总共有9个视图和一个半圆(2π是一个完整的圆),我们将π/ 9除以得到每个视图的角度。 我们将180 °除以9,得到的角度增量为20 ° (20 ° ,40 ° ,60 °等)。 我们将初始视图的中心点设置为大约池塘的顶部,并通过增加每个视图的Theta 值并使用余弦和正弦函数更新初始点的(x,y)坐标,将其余视图沿圆以均匀间隔沿圆放置。新Theta作为输入。 这给我们一个很好的平滑的圆形排列。 您可以从代码库布局图像中看到,我们可以很好地近似池塘的外部边缘(足够靠近政府工作),并且使用基于代码的布局,视图将针对不同尺寸的设备(不包括设备旋转)正确调整。 唯一需要注意的是要记住,如果使用自动布局,则直到调用viewDidLayoutSubviews之后才设置基本视图的边界(在这种情况下为背景图像)。 因此,我们不想在viewDidLoad调用我们的方法,而是在viewDidLayoutSubviews调用,否则我们的数学计算将被关闭(基于Storyboard中视图的大小,它们的计算将不正确)。 我们的最终布局为池塘提供了一个近似的外观,并以对称的图案布置了优美的景色。 资源 单位圆—数学很有趣 单位圆—三角函数与几何定义 沿贝塞尔曲线路径放置图像 是否可以在路径周长上对齐视图?
利用RxSwift和RxBluetoothKit的功能以无缝方式与HR监视器交互。 集成核心蓝牙以连接到心率监测器需要进行大量工作。 如果您熟悉反应式编程,则RxBluetoothKit使事情变得容易得多。 但是您仍然需要了解Core Bluetooth的工作原理,并编写大量代码以与HR监视器对话。 RxHeartRateMonitors是RxBluetoothKit和Core Bluetooth之上的一层。 我构建了它以无缝,反应式的方式与心率监测器进行交互。 您可以下载该项目并进行尝试。 它有什么作用? 仅列出心率监测器。 连接和断开监视器。 从监视器读取心率。 记住以前连接的显示器。 自动连接到以前连接的显示器。 读取蓝牙状态。 读取监视器状态。 在本文中,我将解释有关该项目的一些细节。 为什么创建它以及一些实现细节。 我正在作为一个团队的一部分来构建健身应用程序。 该应用程序的要求之一是列出可以使用的心率监测器。 同样,用户应该能够连接并从此类设备读取值。 我以为CoreBluetooth将使这项工作变得容易。 事实并非如此。 核心蓝牙太通用 它抽象了BTLE协议栈,提供了与各种设备进行交互的方式。 发现外围设备非常容易。 但是随后您还需要发现其服务,特征和代码。 最后,您需要读取原始数据并将其转换为正确的格式。 代码可能变得非常复杂。 为了给您一个想法,以下是从监视器读取心率值所需的步骤: 启动中央管理器。 发现外围设备( 需要一名代表 ) 过滤提供心率监测服务的外围设备 连接到外围设备( 需要委托 ) 发现该外围设备的服务( 需要委托 ) 发现服务的特征( 需要委托 ) 找到代表心率的特征 订阅特征值( 需要委托 ) 将原始数据转换为正确的格式。 实现必需的委托需要太多代码。 如果您看一下本教程或本文,则可以了解其复杂性。 苹果公司也有一个例子(在Objective-C中)。 复杂性很高,因为Core Bluetooth是通用的。 […]
存储在磁盘上捆绑目录中的代码和资源的表示。 苹果使用捆绑软件代表应用程序,框架,插件和许多其他特定类型的内容。 捆绑软件将其包含的资源组织到定义明确的子目录中,捆绑软件的结构因平台和捆绑软件的类型而异。 通过使用包对象,可以在不知道包结构的情况下访问包的资源。 捆绑对象提供了一个用于查找项目的单一界面,同时考虑了捆绑结构,用户首选项,可用的本地化以及其他相关因素。 任何可执行文件都可以使用包对象在应用程序的包内或其他位置的已知包中查找资源。 您不使用包对象在容器目录或文件系统其他部分中查找文件。 NSBundle包括一些常用功能: class var main: Bundle 返回包含当前可执行文件的捆绑对象。 class var allBundles: [Bundle] 返回所有应用程序非框架捆绑包的数组。 init(for: AnyClass) 返回与指定类关联的NSBundle对象。 init?(identifier: String) 返回具有指定包标识符的NSBundle实例。 func loadNibNamed(String, owner: Any?, options: [AnyHashable : Any]? = nil) 取消存档位于接收者包中的nib文件的内容。 func url(forResource: String?, withExtension: String?) 返回由指定名称和文件扩展名标识的资源的文件URL。 var localizations: [String] 捆绑软件中包含的所有本地化列表。 让我们实现一个功能强大的NSBundle! 捆绑包初始化。 在里面 主捆绑 常规项目中经常使用的组合以获得项目资源。 主捆绑 所有捆绑 如果您需要遍历分发包以查找某些内容或检查其是否存在。 所有捆绑 班级捆绑 […]
嗨,朋友们, 简直无法相信一月和二月来了又快。 希望您今年有个开门红。 我想回顾一下过去两个工作量 一月份发生了很多事情。 Daily Vibes可在Apple App Store中获得。 如果尚未下载,请试一试 为Beta测试人员添加了一份注册表: 制作和编辑并上传视频 改善上述截图 改善上述视频 在撰写本文时,所有这些想法都浮出水面。 我希望将它们与下一个版本一起发布,希望在下周的某个时候发布。 然后,我将不得不等待,看看分析。 单个应用程序需要大量工作。 我开始欣赏独立开发者及其成功的产品。 您确实需要戴上能成功开展业务的所有帽子comfortable。 对我来说,营销是一个未知领域,我很犹豫开始学习它。 但是现在来看我,我可以制作图标,促销视频,并开始对增长具有战略意义 。 这是我享受的旅程,但充满挑战。 那是什么呢? 刚开始 。 今天就开始做一件小事。 并做到每一件事。 单。 天。 并且不要忘记这些小小的胜利是累积的。 我也铺平了道路,并做了所有必要的书面工作以添加应用程序订阅。 现在我要弄清楚我在这方面的策略😉 哦,在结束语中,我想保持一个宽松的2周出货周期……到目前为止,我一直坚持定期更新的时间表=)我希望我能保持这一水平! 感谢您的阅读,直到下次我的朋友。 真诚的 亚历克斯
IBM终于发布了支持Cocoapods的Watson SDK版本。 所有以前的版本都需要使用Carthage和稍微复杂的安装过程。 为什么这很重要? 沃森为开发人员提供了令人难以置信的工具。 但是入门上的困难一直是个阻碍。 将IBM版本与Apple开发版本进行匹配是一件很痛苦的事情。 对于使用Github的开发人员而言,Cocoapods是首选的安装方法。 我刚刚升级到Xcode 10和IOS12。我知道让Watson工作会很痛苦。 令我惊喜的是,带有Cocoapods支持的0.33版本完美地工作了。 现在,包括任何Watson库,例如VisualRecognition或SpeechToText,都变得轻而易举。 这是可供开发人员放入其podfile中使用的库的列表。 在终端上,运行“ pod install”命令,然后打开生成或更新的.xcworkspace文件。 您的Watson Libs已准备就绪,可以使用。 要更新到较新的版本,只需使用“ pod update”。 在源文件中导入框架时,请排除IBM Watson前缀和版本后缀。 例如,在安装WatsonAssistantV1后,将其作为“导入助手”导入到源文件中。 另一个引人注目的改进是Watson SDK文档。 有人一直在忙于改进这些文档。 如果您是Swift开发人员,我强烈建议您在Github上检查Watson Swift SDK并在云中访问Watson。 我正在构建一个应用程序,用于检测来自其他世界的访问者,然后使用样式转换效果(艺术科学)来展示其真实本质。 因此,我将IBM Watson VisualRecognition和Apple CoreML结合在一起,以查找并公开Aliens或Alien Hybrids。 该应用程序可以使用经过训练的图像识别模型识别几乎所有东西。 您可能想知道,应用程序如何使用Watson Image Recognition查找外星人? 培训Watson以了解来自太空的访客将是另一篇充满希望的有趣文章(AI与ET)的主题。 对于程序员而言,在云中使用Watson进行训练,然后即时下载训练后的模型以在移动设备上快速识别是非常酷的。 Watson与CoreML使得增强现实中的图像识别成为可能。
我将在本节中介绍一系列文章,以创建实用程序类/函数,这些类/函数在开发过程中会很方便,让我们从视图实例化开始 在iOS应用程序开发期间,它是实例化视图的常见用例 通常我们可以通过3种方式实例化视图 使用XIB实例化 使用情节提要实例化 以编程方式创建视图并添加约束 最后一个超出了本文的范围。 使用XIB实例化 我们必须从主捆绑包实例化xib并加载它。 在这种情况下,代码将如下所示 使用情节提要实例化 在这里,我们实例化情节提要,然后使用其标识符加载viewController。 样本可以看如下 因此,上述实现非常完美,唯一的缺点是每次需要实例化新的viewcontroller时,都必须在代码行上方复制粘贴。 一种更简单的方法可能是概括上述方法以获取有关传递可变参数的视图 继续进行下去,我们可以概括上述方法,这样就不必在每次需要实例化视图时都复制粘贴相同的代码。 请从我尝试执行的以下仓库中导入代码。 pshrinivas / ViewInstantiable 方便快捷地实例化iOS视图的实用方法– pshrinivas / ViewInstantiable github.com 在这一步骤之后,实例化视图将是小菜一碟。 视图实例化可以如下进行 使用xib进行实例化:遵循以下可实例化的协议以查看或具有xib和view的viewcontroller 使用情节提要进行实例化:将情节提要协议与ViewController一致,并将情节提要名称作为参数传递 PS: 对于使用上述回购文件名,类名,XIB名称,应保持相同,否则将不起作用。 类似的标识符与故事板中的类名相同 因此,这种方式可以在很大程度上减少冗余代码。 请对此发表您的看法。 编码愉快!!! 感谢Ganesh&Karthik的校对。 现在我们知道任何错别字应归咎于谁
作为我在Galvanize课程中的一部分,学生在我们的第3季度项目中面临挑战,要有雄心壮志。 多么雄心勃勃? 不能发布产品是可以接受的,因为经验中最有价值的部分是尝试新事物,先潜水,拥抱学习新概念的过程,而不管结果如何。 考虑到这一点,我将记录我们团队在使用ARKit构建iOS增强现实应用程序方面的进展。 目标是建立一个类似于Jenga的游戏,在该游戏中,用户从AR塔中取出积木,然后将它们堆叠在塔上,直到塔翻倒,可怕地羞辱了最后一步的可怜灵魂。 当天的首要任务 大致了解Swift的语法 熟悉Xcode作为IDE 查找具有类似功能的应用程序的一些示例 今天发生的惊人的事情 我真正地接受了我零经验开始项目的感觉 。 我没有在Swift中工作,也没有进行任何移动应用程序开发,因此尝试全新的东西既令人恐惧,又令人兴奋。 对Swift语法有一个大致了解-我从Swift的伦敦应用程序啤酒厂的Angela Yu那里找到了一个很棒的Udemy课程,其中包括关于ARKit的部分。 在阅读了最初的视频之后,我对这种语言感到更加自在(部分由于在课程中学习Java作为选修课)。
NSJSONSerialization仅提供第二部分-从NSDictionaty / NSArray到JSON的序列化,因此您仍然需要执行从自定义对象到NSDictionary的映射。 该类很简单,应该像这样使用: NSDictionary * objectDict = @ { @“姓名”:@“约翰·史密斯”, @“年龄”:@(34), @“性别”:@“男性” }; NSError *错误; NSData * jsonData = [NSJSON序列化dataWithJSONObject:objectDict选项:kNilOptions错误:&error]; 正如我提到的,我们旨在编码的树的根对象只能是NSDictionaty或NSArray。 但是使用NSJSONSerialization还有其他一些限制: 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。 所有字典键都是NSString的实例。 数字不是NaN或无穷大。 您可以将一些选项传递给NSJSONSerialization来对数据进行编码和解码: 1.编码(NSJSONWritingOptions): PrettyPrinted-使用空格和缩进使输出更具可读性(在结果数据中添加一些额外的字节) SortedKeys —按字典顺序对键进行排序 2.解码(NSJSONReadingOptions): MutableContainers —数组和字典被创建为可变对象 MutableLeaves-字符串创建为NSMutableString的实例。 AllowFragments-告诉解析器允许不是NSArray或NSDictionary实例的顶级对象。 如果您不想指定任何选项,则可以传递kNilOptions -ObjC代码中的常量或Swift中的空数组。 回到我们的序列化链:使用NSJSONSerialization,我们仍然需要将自定义对象映射到数组和字典中。 为此,您有时会在模型对象内使用手动键值映射: -(NSDictionary *)jsonDict { 返回@ { @“名称”:self.name, @“年龄”:@(self.age), @“性别”:self.gender }; } 但是也可以使用ObjC运行时中的类检查来使其自动化。 #import … unsigned int […]