Tag: Swift编程

在iOS Swift中预取UITableView

UITableViewDataSourcePrefetching :iOS 10中的一种协议UITableView,可以异步加载异步数据源。 用户不希望滚动到chhmhoặcđừ滚动s并加载nhữngindexPathtiếptheosắpđượchiệnlên,请确保平滑滚动cho tableviewhoặccollectionview。 Cácbướcthựchiện: TableviewVà数据源 符合协议 tableView 。 prefetchDataSource = 自我 可以通过通讯协议tableView(_:prefetchRowsAt:)加载数据,并可以缓存。 显示数据UI UI tableView(_:cellForRowAt:) 取消加载获取异步任务: tableView(_:cancelPrefetchingForRowsAt:) 生活圈: Khi lnnđầhi hinn单元格,tindex索引路径= 0,hàmprefetchRowsAt索引10索引ti p theotínhtừ索引cuốiđhiệntrênmànhình(内容偏移量)。 Khi用户滚动chậmxuống,hàmprefetchRowsAtsẽtrảvề1索引tiếptheo,tứclà索引thứ11(10 +1)。 Khi用户滚动滚动索引,滚动索引10索引索引滚动索引(内容偏移量)。 Khi用户滚动chậmsauđóđộtngộtđổihướng滚动,hàmprefetchRowsAtsẽtrảvề10 index theohướngđãđổi,đồngthờisẽvàohàmcancelPrefetchingForRowsAttrảvềindexàvđindexà thị。 代码: -Thựchiệnkhaibáo代表 myTable.prefetchDataSource =自我 -实施代表 func tableView(_ tableView:UITableView, prefetchRowsAt indexPaths:[IndexPath]){print(“ Fetching:\(indexPaths)”)//异步加载:数据,图像… func tableView(_ tableView:UITableView, cancelPrefetchingForRowsAt indexPaths:[IndexPath]){print(“ Fetching Cancel:\(indexPaths)”)//取消隐藏các操作异步加载数据 } 您可以跟随đểnhậnnhữngbàiviếtmớinhấtcủamìnhnhé。

iOS UI测试,汗水…绕……更多汗水(第1部分:Stubbing网络)

当我试图为我的iOS项目争取到一个名为CI / CD的黄金之山时,UI Testing是我必须征服的山谷。 在那个地方,那是一次浩大,朴实而又烦人的经历。 Xcode为我提供了一种在旅途中帮助我的武器,该武器称为XCUITests。 该武器在访问,交互以及在我必须击败的测试中主张时具有很大的壮举。 但是对于存根网络来说,这就像枪战中的一把刀-它使我丧命。 反应过度? 我不这么认为,在这个山谷中,您需要隔离自己,以便一切顺利。 从真实服务器获得真实响应只会延迟测试,如果没有失败的话。 盯着空白处,我一直想知道应该怎么做……直到它撞到我身上。 OHHTTPSTUBS 我很高兴找到另一种名为OHHTTPSTUBS的武器。 OHHTTPStubs是一个旨在非常轻松地对您的网络请求进行存根的库。 —取自GitHub 当我穿越那片广阔的平原时,我高兴地哭了。 乐观地说,我跳得更快,跑得更快。 就像我找到了击败龙的武器。 我的心跳加快,然后突然停下来(我还没死,很冷)。 我面前出现了一个障碍物,它的魔力使我飞回了山谷的入口。 怎么了? 我在寻找线索,武器的背面写着一个线索。 杜德(Dude),托管测试非常棘手 我认为这是为了另一个叫做“单元测试”的山谷(这是我必须走的另一条路,但是让我们稍后再谈)。 那颗充满希望的闪烁星光突然使我失望。 但是,我仍然在绝望中寻找一种更相关的武器。 也许这不是我需要的武器,可能不是车辆还是房屋? 方便地,一个老隐士路过并丢下了一封信。 我在心里大声朗读。 亲爱的儿子, 您所需要的不是武器,车辆或房屋。 这是一个模拟服务器。 尝试一些事,例如迅速或使馆 -您方便的陌生人 哦,好吧……隐士似乎不喜欢类比。 为了寻找线索,我竭尽全力击败了这个令人烦恼的山谷。 看起来很奇怪,我将尝试其中之一。 迅捷 事实证明,这个“微小的HTTP服务器”是我的解决方案,我的光明了我的黑暗,我的罗密欧是我的朱丽叶,我的托尼·斯塔克是我的奇异博士,我明白了。 遵循此页面上的任务指南,我立即迈出了第一步。 但是首先,我必须下定决心,下定决心,并确定自己的build configuration和scheme 。 使用新scheme我可以为我的应用程序提供一个环境,该环境连接到localhost:8080(Swifter将在其中托管HTTP服务器)作为该服务器的base url ,我可以得到预期的响应,我必须为每个端点提供该响应我的应用最初与之联系。 预期的响应可以与JSON文件一起提供。 锁好并装好,我准备出发了。 我可以说,第一步是“冗长但必要的”。 当我浏览端点回答日记*咳嗽* apiary *咳嗽*时,我自信地走着。 我将所有这些注释放在由JSON扩展标记的单独注释中,并将这些注释放入我的资源中。 之后,剩下的就是在公园里漫步。 […]

是可选的,闭包可以抛出,是的。 –本–中

是可选的,闭包可以抛出,是的。 但是,没有语言功能可用于处理回调中的错误。 让我解释: 想象一下,我将闭包传递给了进行网络调用的函数。 如果该网络调用失败(例如,我收到HTTP 503 ),此功能将如何告诉我? 我看到三种方式: 回调有两个参数:成功值和错误值,两者都是可选的。 如果成功,则错误为nil ;如果错误,则成功为nil 。 这是不理想的,因为两者都可能为nil或都不为nil ,在这种情况下这是无意义的 该函数接受两个回调:一个在成功时传递值,一个在失败时传递错误值。 这样比较好,但是仍然可以同时调用两者,这是胡说八道。 另外,它体积大,并且没有利用Swift的闭包语言功能,例如在仅需要1个闭包的函数上省略括号。 回调采用一个参数,该参数是非可选的Result类型。 这是理想的,因为它永远不会同时具有成功或失败状态。 此外,您可以利用语言功能,例如省略括号和模式匹配。 同意,到今天为止,它体积很大。 但是,我看到了将来可以简化的一种方式,尤其是在标准库中提供了Result时。

在Swift中使用Alamofire进行可扩展的网络

如今,几乎每个应用程序都需要从远程API获取数据或向远程API发送数据。 现代应用程序的网络层是应用程序体系结构的关键部分,因此需要以可扩展和类型安全的方式进行设计。 前不久,objc.io的家伙们提出了一个小型网络库的设计,该库能够执行iOS开发人员在应用程序开发周期中可能面临的最常见任务。 在本文中,我将重新讨论objc.io的方法,并展示该方法的典型应用。 首先,我们需要定义三种核心类型APIAction , Resource和APIClient 。 让我们从APIAction开始。 APIAction实例描述将要发送到服务器的http请求。 这是一个协议,应该被采用。 与往常一样,您可以在GitHub上找到完整的源代码。 请留下您可能有的任何评论,我们很高兴收到任何反馈。 您可以通过LinkedIn或Facebook与我联系。 alexey-savchenko /网络示例-中 通过在GitHub上创建一个帐户,为alexey-savchenko / NetworkingExample-Medium开发做出贡献。 github.co

开始开发iOS应用程序(1):构建基本UI

在模板中选择Single View App。 下一步的初始中输入如下内容: 产品名称:FoodTracker 组织名称:WillingSplit 组织标识符:com.willingsplit 语言:斯威夫特 包括单元测试:已选择 每一个Apple ID都对应一个个人团队,可以用它在我们自己的iphone上进行测试。但是如果想要将应用发布到App Store中,必须要在Apple Developer Program上注册一个账号。 Xcode包括什么基本功能 组织代码文件和资源文件 提供代码和UI编辑器 提供模拟器和调试器 Xcode的界面组成 导航器区域:访问项目的各个部分 编辑器区域:代码,界面和资源文件的编辑 实用程序区域:两部分组成,上半部分叫检查器窗格,使用查看,编辑编辑器区域中查找的项目。下半部分叫库窗格,访问一些界面组件和代码片段 工具栏:构建并运行项目。 在方案弹出菜单上选择iPhone X 2.点击运行按钮 3.工具栏上方的活动查看器上会显示进度 :代码文件 :项目导航器导航界面。这个界面里列出了项目的所有文件。选择位置AppDelegate.swift图标,在编辑区域处显示。 AppDelegate.swift文件 在这个文件里实现了两个功能: 定义了AppDelegate类。它会为整个app创建一个窗口,所有的UI组件都会放置到该窗口上面。另外,它还提供了app状态转换的相应方法。 使用@UIApplicationMain属性创建应用程序的执行入口和事件循环。系统会创建一个应用程序对象。这个对象会管理整个应用程序的生命周期。同时,系统将创建一个AppDelegate对象,并把它分配给应用程序对象。最后系统启动应用App ViewController.swift文件 故事板显示应用程序的UI和页面之间的替换。 Xcode提供一个UI组件。其中一部分可以显示在界面上显示,例如按钮。另一部分类似手势识别,不会显示在界面上。 所有显示在UI上的元素成为View。View是内置UI的最基础的元素,可以用来给用户显示信息。并且,View还有内置的功能,例如响应用户的输入。 添加文本字段 在对象libray中选择文本字段 2.在过滤器字段中输入文本字段 3.将文本字段对象拖入到storyboard上面 设置文本字段的占位符文本 在Placeholder中输入“输入餐名” 设置TextField的键盘 在Return Key中选择完成,然后选择自动启用Return Key选择框。 当用户输入文字之后,完成按钮就会在键盘上显示。 默认预览页面是竖屏,切换到横屏如下图 添加其他设备的屏幕预览图 按照上述方法设置的UI是固定大小的,不会根据屏幕大小自动调节组件的大小。我们需要使用自动布局技术,让UI组件自适应屏幕。 自动布局可以帮助我们很好的设计自适应布局。它采用了约束来规定一个UI组件相对其他组件的位置和它自身的大小。自动布局会自动计算每个UI组件的位置和大小。 最简单的方式是使用UIStackView。堆栈视图提供一种按照一列或一行UIUI的方式。 首先将所有的UI组件放到一个Stack View中,然后给Stack […]

包装器,用于处理iOS中的字体

大家好,希望你做得很好! 在本教程中,我将引导您完成如何制作包装对象以处理iOS中所有自定义字体的方法。 开始吧… 字型: 字体可以为您的文本增加价值。 它可以帮助读者感知文字信息。 颜色 , 字体和文本大小的正确选择对于吸引目标受众至关重要。 使用印刷版吸引读者很容易,但要吸引他们的注意力需要更多的创造力。 TTF和OTF是扩展名,用于指示文件是字体,可用于格式化文档以进行打印。 TTF代表相对较旧的字体TrueType字体,而OTF代表OpenType Font ,它部分基于TrueType标准。 两者之间的重大区别在于它们的功能。 TTF仅取决于字形表,该字形表定义了每个字符的外观,而OTF能够与CCF(紧凑字体格式)表一起使用字形。 如何在iOS中添加自定义字体: 首先从Web或UIDesigner获取所需的字体文件(TTF或OTF) 将它们移动到您的项目文件夹中(如果需要,请确保复制并选择了目标)。 通过从导航窗格中选择项目根文件夹,然后从目标中选择“构建阶段”,仔细检查字体是否包含在资源包中。 然后展开“ Copy Bundle Resources”行,以查看那里的字体文件。 如果不存在,请在导航器窗格中选择文件,然后将其手动添加到目标中。 打开Info.plist,然后右键单击并选择“添加行”。 开始输入并选择“应用程序提供的字体”。 展开该行,然后在“值”字段中的“项目0”旁边输入字体的名称(包括其类型,例如,参见下图)。 →现在您知道了字体的价值,以及如何向iOS项目添加自定义字体。 现在,让我们编写一个包装对象来处理项目中的字体。 在开发阶段,字体大小或其样式随时可能取决于UI外观。 因此,通过使用该包装器,我们可以轻松处理这些更改,而无需花费大量时间和精力。 让我们编码: →首先,我们创建一个结构以封装所有需要访问的类型,以创建和返回字体 。 我们将枚举用于类型,因为它们在用例中非常方便。 它们也是值类型,因此也不必担心保留周期。 首先创建一个struct对象,定义一个枚举类型以选择或传递所需的Font名称。 此类型根据选择的情况返回一个值,该值是计算属性。 在本教程中,我使用“ SFProDisplay ”和“ SFProText ” 字体 (自定义),并且还提供了一个自定义大小写来访问预定义的系统(自定义)字体。 上面的Font对象不覆盖系统字体。 除系统字体外,您可以使用所有其余字体。 您可以根据需要使用系统API来构造系统字体类型。 如果要覆盖所有类型,请将它们包括在FontType 枚举中 。 如果您想了解有关在iOS中处理字体的更多信息,请检查以下我提供的资源。 目前为止就这样了。 祝您编程愉快,如果您遇到任何更好的资源或方法,请与我分享。 […]

服务器端Swift — MVC

我是全栈开发人员。 我的大多数服务器端应用程序都是用.NET(ASP.NET Web API,ASP.NET MVC)编写的。 但是我在副项目Vcoin上花了最后几个星期。 这是用Swift编写的非常简单的iOS应用程序。 我认为花点时间弄清楚如何在Swift中创建服务器端应用程序将是很棒的。 我已经阅读了一些很棒的文章和对该主题的介绍。 您可以在下面找到其中一些: 顶级服务器端Swift框架与Node.js的基准测试 编辑10月7日:结帐我的后续活动:Linux基准(Ubuntu) medium.com 顶级服务器端Swift框架的当前功能和优势 尽管Server-Side Swift在我眼中已经可以投入生产了,但我知道很难识别从哪里开始或…… medium.com 服务器端Swift框架比较 Swift已经问世了一段时间,它正在成为越来越有吸引力的解决方案,不仅适用于移动设备,而且还适用于… www.netguru.co 阅读这些文章后,我决定选择速度快且功能丰富的Perfect。 但是,在任何地方都找不到如何在Swift / Perfect中构建服务器端生产应用程序的示例。 如何将应用程序划分为某些层。 在哪里放置业务逻辑,验证,模型,数据访问等。因此,我根据对ASP.NET Core MVC的经验,决定构建一些简单的应用程序。 在本文中,我将重点介绍MVC模式。 在接下来的文章中,我将介绍数据访问(使用一些ORM框架),验证,授权等。 MVC的基本思想是通过控制器和视图从用户界面中分离内部数据模型。 服务器端API中的MVC模式: 模式 -应将实体保留在数据库中 提示 -API中的这一层不太明显,没有向用户呈现的具有视图的HTML / Storyboard文件,但是用户会看到其他东西-由我们的API(控制器)生成的JSON,对我而言,JSON是View层 控制器-与业务逻辑一起使用,当然,拥有轻巧的控制器并将真实的业务逻辑转移到比控制器(如服务)更可重用的组件上将是很棒的。 我的模型很简单。 我有两个类,用于存储有关任务和用户的信息。 现在,当我想添加一个新控制器时,我将不得不使用控制器实现创建一个新的Swift文件,并在DependencyContainer扩展中在容器中注册一个新控制器,并将其添加到resolveAllControllers方法的列表中。 当Swift将为自省引入更广泛的方法时,应该删除第二步。 Github仓库和源代码(分支: mvc-pattern ): mczachurski / TaskServerSwift TaskServerSwift –演示项目,其中包含用Swift编写的服务器端代码。 github.com

快速为Mac OS构建Vault App

开发iOS应用程序已经很长时间了,有一天我想为Mac OS开发一些实用程序应用程序。 在开发应用程序时,我意识到用于Mac OS应用程序开发的教程博客/视频的数量远远少于iOS应用程序开发的数量。 尽管人数少的原因很明显,但是我决定记下一个教训,就是这样。 在这个分为两部分的教程系列中,我们将构建一个Mac OS应用程序,即。 “保险柜”。 顾名思义,该应用程序将充当一个安全的保险库,其中用户可以隐藏各种文件,应用密码来锁定该应用程序,并且可以摆脱记住那些bash命令以进行隐藏/取消隐藏的操作。 在本部分的最后,这就是您应该开发的。 如果您直接要跳到完成的项目,请从这里克隆它。 首先打开Xcode,然后从New-> Project-> Mac OS中选择Cocoa App 。 创建项目后,打开Main.Storyboard 。 与iOS应用故事板不同,这对您来说似乎有些不同。 不仅有UIViewController,还有应用程序场景,窗口控制器场景和NSViewController 。 我们将在本系列后面的内容中看到“应用程序场景”和“窗口控制器场景”。 现在,让我们开始在提供的View Controller中创建UI。 从对象库中,拖动一个Box(NSBox)并将其放在视图控制器中。 将框重命名为“ ToolBarBox ”,并添加尾随,前导和顶部的约束,并在超级视图中使用“ 0”作为常量值,并在高度上添加约束(这将与superivew的高度成比例)。 为此,将约束添加为“等于Superview的高度”,并将乘数形式1的值更改为0.15 该框可被视为容器视图,其他视图(如“按钮”(用于“添加文件”,“设置”))将驻留在该视图中。 我们可以选择NSView代替NSBox,但是为了使事情变得简单,我选择了NSBox(与NSView不同,这里可以使用Attribute Inspector设置许多属性)。 与ToolBarBox相似,在对象库中添加另一个框,并将其命名为“ HeirarchyBox ”。 这将包含用于查看隐藏文件的按钮。 在此框旁,添加另一个框。 FileExplorerBox 。 这些盒子在一起将覆盖控制器的整个宽度。 就我而言,控制器的宽度和高度分别为1000和600(根据您的设计随意使用任何尺寸)。 HeirarchyBox和FileExplorerBox的顶部将接触ToolbarBox的底部,并且它们一起将覆盖整个宽度。 这样可以为HeirarchyBox提供约束。 虽然FileExplorerBox将在尾随,从底部到超级视图,从顶部到HeirarchyBox 。 我们已经完成了容器的工作,现在让我们在这些容器中添加更多的UI组件。 首先,将四个NSButton(用于图像,视频,音频和文档)从对象库拖到HierarchyBox中 ,并将它们嵌入到堆栈视图中。 在堆栈视图上方放置一个标签“ My Vault ”。 我们将对所有浏览器按钮(音频,视频,图像和文档)使用单一操作方法,因此,将标签分配给每个按钮(在本例中为101,102,103和104)。 […]

蒸气3系列II-认证

在上一篇文章中,我们使用Vapor 3完成了一个简单的RESTful API服务器。更具体地说,我们创建了User模型以将数据存储到内存中的SQLite数据库中,并实现了UsersController来处理来自客户端的交互。 尽管我们的服务器已经具有许多出色的功能,但是它也存在一个问题:任何人都可以创建新用户并将其删除。 换句话说,端点上没有身份验证以确保只有已知用户才能操纵数据库。 在本文中,我将演示如何存储密码和经过身份验证的用户,以及如何使用HTTP基本令牌和承载令牌认证来保护我们的端点。 请注意,本文将基于先前的实现。 一般来说,身份验证是验证某人身份的过程,一种常见的身份验证方法是使用用户名和密码。 打开我们的User.swift文件,并在var username: String下添加以下属性var username: String 。

如何使用Swift在iOS应用中构建自定义相机?

如果您正在阅读本文,则可能正在构建下一个与Instagram或Snapchat竞争的大型社交媒体应用程序,或者是一个可以帮助人们每天拍照的简单应用程序。 我想谈的是建立像Snapchat一样出色的自定义相机。 我不会详细介绍录制视频或拍照的内容,本文重点介绍构建自定义相机的UI部分。 希望我能写一篇有关录制视频和拍照的文章。 让我们开始… 创建一个名为CameraViewController的新视图控制器,然后开始导入和实现。 导入UIKit 导入AVFoundationclass CameraViewController:UIViewController { 将您的拍照按钮和照片预览视图放到情节提要中的视图控制器上。 @IBOutlet弱var photoPreviewImageView:UIImageView! 创建一个从按钮到视图控制器的操作,并将其命名为didTapOnTakePhotoButton 。 @IBAction func didTapOnTakePhotoButton(_ sender:UIButton){} 使用AVFoundation库可以进行摄影机操作,我们需要为此定义一些变量。 var会话:AVCaptureSession? var stillImageOutput:AVCaptureStillImageOutput? var videoPreviewLayer:AVCaptureVideoPreviewLayer? 开始在viewDidLoad方法中配置相机 覆盖func viewDidLoad(){ super.viewDidLoad() 会话= AVCaptureSession() session!.sessionPreset = AVCaptureSessionPresetPhoto let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo) var错误:NSError? var输入:AVCaptureDeviceInput! 做{ 输入=尝试AVCaptureDeviceInput(设备:backCamera) }将let error1捕获为NSError { 错误=错误1 输入=无 打印(错误!.localizedDescription) } 如果错误== nil && session!.canAddInput(input){ 会话!.addInput(输入) stillImageOutput […]