可视化Segues

Segues允许应用程序转换视图并将数据从一个视图传递到另一个视图。 例如,如果您在iPhone上打开通讯录,则可以使用segue从所有联系人的完整列表转到一个特定的联系人,并说明了从一个屏幕切换到另一个屏幕的操作以及屏幕上显示的信息。目标屏幕。 segue的概念很简单,但是当我第一次遇到将segue付诸实践的代码时,我很难理解每个部分的含义。 当编码概念开始让我有些迷惑时,我发现可视化和创建类比非常有用。 因此,在本博文中,我将深入研究下面的示例segue代码,并创建一个故事以帮助直观地看到这些代码段的含义。 我假设读者熟悉以下基础知识:调用prepareForSegue函数的语法,情节提要的组成部分,Xcode项目中需要的文件等,等等。基本上,本文的目的不是引导您逐步了解实现segue所需的各个部分,而是帮助您描述功能中发生的事情。 让我们开始! 我们的故事 我们的故事发生在杂货店。 这家杂货店有很多过道。 通道7是谷物通道,即最佳通道。 如此多的美味含糖早餐美食! 这是我们故事的起点。 这家杂货店使用端盖或每个过道的末端来展示特殊物品和促销。 看看下面的端盖图片。 谷物交易多么划算! 由于这是一个令人难以置信的故事,所以我们也可以说杂货店使用很酷的机器人程序(是的,实际的程序,是字面上的类推),在商店中进行任何繁重的物品搬运或运输。 Segues并不是很聪明,因此他们需要商店中人员的详细说明,以便能够将物品从一个位置带到另一个位置,以及在新位置更新标志和价格。 当然,segues只了解用Swift编写的方向! 今天,杂货店经理想在端盖上设置谷物的特殊展示。 正在进行大甩卖! 经理需要将segue用于将谷物从第 7通道拖到 端盖 。 1.选择segue 首先,经理需要确保自己的工作正确无误。 (如果她不小心抓住了一个编程的从通道4拿走糖果并将其放入结账通道的方法呢?!)这是她写这些指令的方式: 仅在此标记具有标识符“ moveCereal”的情况下,其余说明才能继续进行,这意味着管理者的标记将从第7通道移动到端盖。 (在现实世界中,这些连接详细信息是在情节提要中设置的。)太好了! 2.告诉segue去哪里 现在,经理告诉segue去哪里。 segue的最终目标是结束盖帽,在这里称为EndCapViewController 。 最终的目的地简称为newLocation 。 为了可视化,这是在segue将任何内容移到那里之前, newLocation端盖现在的样子。 请注意,没有任何标志说明正在出售什么,而且货架上没有任何物品! segue稍后将填充这些内容。 3.告诉segue在哪里可以找到正确的谷物 接下来,经理告诉segue到底在哪里找到需要移动的谷物。 Segues不能分开阅读或分辨谷物箱,但可以在网格上或架子上找到坐标! 这些架子坐标称为indexPathsForSelectedItems。 但是segue应该将这些架子坐标应用于哪些架子? aisle7Shelves ,当然是在起始位置! (在现实世界中,这是当前视图或开始视图上的UICollectionView的名称。) 同时,segue会自动假设它将要接收许多货架坐标(请注意,它是索引Paths ForSelected Items的索引,而不是索引Path ForSelected Item的索引!),但是经理实际上只想要一种谷物,因此只需要一组谷物坐标。 既然是这种情况,她将专门指示segue仅遵循第一组坐标: […]

iOS 2018系列:破解iOS采访或成为iOS专家(4)

第4章:闭包和强大的闭包参考周期 面试是一个非常热门的话题,因为它提供了从初学者到专家级别的问题,而且大多数工程师在讨论中都对它感到困惑,即使您尝试在现实生活中使用它,也可能会遇到一些情况,混淆了使用什么和不使用什么! Swift中的闭包类似于C和Objective-C中的闭包。 闭包是可以独立传递的功能块,可以在代码中传递和使用。 闭包表达式语法 逃逸关闭 当闭包作为函数的参数传递给闭包时,闭包被认为是对函数的转义 ,但是在函数返回后会被调用。 声明将闭包作为其参数之一的函数时,可以在参数的类型之前编写@escaping ,以指示允许对闭包进行转义。 reversedNames = names.sorted(by:{s1中的s1,s2> s2})// (第1行 ) reversedNames = names.sorted(by:{$ 0> $ 1})// (第2行) 这两行都在做相同的事情, 第1行称为单表达式闭包的隐式返回, 第2行称为速记参数名 ,可用于通过$0 , $1 , $2名称引用闭包的参数值。上。 封闭的强大参考周期 之所以会出现这种强引用循环,是因为闭包(如类)是引用类型 。 案例:如果您将闭包分配给类实例的属性,并且该闭包的主体捕获该实例。 说明:之所以可能发生此捕获,是因为闭包的主体访问实例的属性,例如self.someProperty ,或者因为闭包调用了实例上的方法,例如self.someMethod() 。 在任何一种情况下,这些访问都会导致闭包“捕获” self ,从而创建一个强大的参考周期。 解决方案:弱引用或无主引用,弱引用或无主引用的适当选择取决于代码不同部分之间的关​​系。 问题:无主还是弱? 您应该使用两种参考类型中的哪一种? “只要有效,在引用生命周期中的某个时候变为零就使用弱引用。 相反,当您知道引用在初始化期间被设置为永远不会为零时,请使用无主引用。” “当闭包及其捕获的实例将始终相互引用且始终在同一时间解除分配时,将闭包中的捕获定义为未拥有的引用。” 有两种可能的方案: 闭包与捕获的对象具有相同的生存期,因此闭包只有在对象可以到达之前才可以到达。 外部对象和闭包具有相同的生存期(例如,和对象及其父对象之间的简单反向引用)。 在这种情况下,您应该将引用声明为Unown 。 一个常见的例子是在许多小闭包的例子中使用的[unowned self] ,这些小闭包在其父母的上下文中做某事,并且没有被其他地方引用或传递而不会超过其父母的寿命。 […]

在Swift 3中逃避闭包

如果将闭包作为参数传递给函数,并且在函数返回后调用该闭包,则闭包正在转义。 在Swift 2中,您可以使用@noescape属性标记一个函数参数,告诉编译器不允许传递给该函数的闭包对函数主体进行转义。 在Swift 2中,闭包默认情况下转义了函数体。 在Swift 3中,当函数具有闭包作为参数时。 我们需要将其明确标记为@ 转义,因为 默认情况下,闭包在swift 3中不会转义。 为什么不逃避? 默认情况下,使闭包不转义有很多好处。 最明显的好处是性能和编译器优化代码的能力。 如果编译器知道闭包是非转义的,则它可以处理内存管理的许多细节。 这也意味着您可以在无转义的闭包中使用self关键字而不会出现问题,因为闭包是在函数返回之前被调用的。 在闭包中不需要使用对self的弱引用。 这是一个免费的不错的好处。 例如 : 在Swift 3中,如果您有一个带有闭包参数的函数,并将其分配给在函数外部定义的变量,则此闭包可以通过存储在此外部变量中而从函数主体中逸出。 Swift编译器将给出如下错误 因此,您必须将闭包显式设置为@escaping

Siri快捷方式示例(iOS12 / Xcode10 beta)

2.在此示例中,打开* .intentdefinition,然后添加New Intent,为其命名,然后设置重要部分是Parameters and Shortcut Types (如果需要用户确认,请检查☑️需要用户确认),在此示例中,我将跳过确认过程。 查看苹果文档以获取更多信息。 参数让我们使用Custom类型。 快捷方式类型的 标题/副标题将显示为Siri结果。 3.不要忘记设置响应, 响应 模板中的模板将再次显示为Siri结果。 4.创建新的目标选择 意图扩展和意图UI扩展。 5.在您的应用程序目标中创建IntentHandler类, NSObject和IntentHandling的子类也在Inspectors中选择Target Intent和IntentUI 。 在“确认”部分中,Soup Chef App尝试显示订单确认视图,当Siri订购Soup Chef App时,也尝试在代码中显示发票,但两者均未显示在Siri屏幕中。 您可以在Siri响应文本中看到[object Object] ,这意味着Response中不支持Decimal 。 Apple可能会很快更新SiriKit和Siri Shortcuts文档,请等待。 源代码 neungnarakjung / CookBook-Siri-快捷方式-示例 CookBook-Siri-Shortcuts-示例– Siri快捷测试版(XCode10 beta) github.com

刷新每日优化工具用户界面

Daily Optimiser是我编写的第一个iOS应用程序,最近看起来有些疲惫和过时。 因此,上周我花了几个小时对UI进行改进和现代化,我对结果感到非常满意(本文结尾处有一些屏幕截图)。 我试图使字体大小和颜色更一致,更细微,以使信息具有清晰的层次结构。 更有趣的是,在过去几年的iOS开发中,我学到了很多东西。 回顾原始代码,很明显我不清楚如何最好地构造代码。 我对自动布局也很缺乏经验,并且在任何地方都使用表来构建屏幕! 我还使应用程序iOS11仅仅为了利用UI中的大标题,但从我的分析中,我几乎看不到任何人在使用该应用程序,因此它不会加剧不存在的用户群。 我必须承认我实际上并没有使用Daily Optimiser,因为我更喜欢Todoist而不是Reminders作为任务组织者。 但是,如果您正在寻找一个基于“日历和提醒”的简单应用程序来帮助您安排一天的活动,为什么不花钱呢? Daily Optimiser 4.0的屏幕截图 该帖子最初于 2017年11月26 日出现在 https://writingontablets.com/Refreshing-the-Daily-Optimiser-UI

Yummypets iOS应用程序堆栈

今年即将结束,我们想为 Yummypets 应用程序 共享iOS堆栈 。 我们开始做吧! 码 该应用程序的97%是完全用Swift编写的。 总共46k行代码。 MVC 整个应用程序遵循good’ol MVC模式 。 当控制器太大时,我们会将它们重构为较小的控制器。 核心 我们所有的模型逻辑和网络代码都封装在Core.framework中。 这迫使我们将逻辑和视图代码分开。 这也具有使我们能够在不启动完整应用程序的情况下处理纯逻辑的巧妙优势。 网络层 我们的网络层隐藏在Api界面后面。 这意味着我们的View控制器对我们的网络库一无所知。 这也意味着我们可以将api实现切换为返回虚拟数据以进行测试,而无需触摸控制器\ o /的任何一行 。 图像加载和缓存🖼 我们使用Kingfisher异步加载图像和缓存处理。 该api很简单,但是非常可定制。 我们以前使用AlamofireImage,但由于性能原因而切换到Kingfisher。 联网☁️ 对于网络,我们使用ws☁️,这是一个简单的基于诺言的JSON网络库。 它具有打包3件东西的优点: 出色的Alamofire库,用于网络请求 一个简单的Promise库 一个简单的JSON解析库 这种整洁的抽象层使我们能够有效地添加和维护路由。 异步🕐 我们严重依赖Promises来保持我们的异步代码清洁和可维护 。 为此,我们使用🎬 JSON解析⚙️ 我们对JSON解析库有严格的要求:不应强迫我们对模型进行子类化,同时支持类和结构,并且要尽可能简单。 为此,我们使用Arrow🏹,它将为我们处理所有样板JSON解析代码,并保持模型映射的清洁和可维护。 布局🏝 我们不会使用Storyboard或Xibs ,原因是我们在此不做详细说明。 TLDR : 更容易维护 。 您可以在这里找到有关此问题的精彩文章。 是的,我们所有的视图和TableView单元格都在代码中! 这带来了巨大的好处! 如您所知,纯自动布局的代码非常冗长 ,这就是为什么我们使用Stevia🍃使其保持可读性和可维护性 […]

项目6.7 –笔记薄弱的一周

沉默接管了项目6。6.3和6.4是周末在电脑上度过的时间,由于缺乏进度,6.5和6.6被迫放弃了说话。 将我们最终安静地带到6.7-6周计划的一个星期。 我一直在研究可可,NS前缀和苹果不太喜欢的开发套件的来龙去脉。 我的意思是没有冒犯,Mac应用程序可以很漂亮而且令人惊叹,只需询问Panic,但是您只能看到很多次 不会因CocoaTouch的普遍存在而感到孤独。 凭借多年的Apple开发人员经验,我觉得自己的工作效率只有一半。 每个Autolayout错误,以及解决了您从2002年以来的问题的方法的文章都不再起作用,并且坐标系的完全怪异意味着调试和测试比运送要花费更多的时间。 一个例子就是希望在NSTextView中找到光标的位置。 经过大量的UITextView答案,我找到了可能的解决方案。 textView.firstRect(forCharacterRange:,actualRange:) 这是为了给我当前选定范围内光标位置的NsRect。 只要您喜欢绝对的屏幕坐标,一切都会很好,但是对我来说完全没用。 该兔子洞进展为尝试使用以下命令将窗口坐标映射到文本视图的原点 [textView convertRect:rect fromView:textView.textInputView] 但是由于某种原因,textView的原点返回0,0,并且每个Stack Overflow都带来了比以前更多的问题。 最后,我浏览了足够多的NSContainers和NSLayoutManager文档,以偶然发现圣杯 让cursorPoint = textView.layoutManager?.boundingRect(forGlyphRange:textView.selectedRange(),在:textView.textContainer!) 最后,我兴高采烈地出现了,只花了一个小时就在光标位置插入了一个子视图。 (#ForFutureGoogle在NSTextView中找到光标/插入符号的局部坐标)。 然后,此模式进行多次自我复制,分为多个Objective-C至Swift复制粘贴重构以及Swift 2至Swift 3弃用路径。 我喜欢Swift作为一种语言,在搜索iOS解决方案时并没有这么大的问题,所以我的猜测是iOS内容更新速度更快并且紧贴前沿,或者iOS内容庞大而过时搜索。 就是说,总共大约20个小时之后,我已经成功地使用本地数据库,一个很酷的Medium风格的插入菜单和Operational Transformations构建了一个本地Notes应用程序。 回想起来,也许启动了一个未知数众多的项目,尤其是在第一周就显得有些雄心勃勃。 此外,我希望在该应用程序上花费总计超过20个小时,因此我认为最终产品将更加精美。 此外,我花了几个小时将一些逻辑提取到一个单独的库中,以用于业务逻辑/操作转换逻辑(以防我想创建一个iOS应用程序)和另一个库,用于包装类来处理中型TextView。 尽管如此,到最后,我还是学到了很多新的Cocoa开发人员,对任何Mac App开发人员都产生了新的尊重,并非常喜欢这个项目。 下一步? 我想花更多时间将应用程序完善成可用的工具,也许还要研究一下iOS应用程序和CloudKit的集成。 长期-如果我无法或不会支持我,我可能会愿意公开采购整个应用程序或库组件。 如果有人对应用程序感兴趣,或者代码可以随时与我们联系,那肯定会帮助我评估这些选项。 今天花费的时间:4小时 总开发时间:〜20小时 结果:工作记录应用 任务完成1/6 还是足够接近

📸迅捷相机-第1部分

iOS 11带来了许多新的酷功能,例如机器学习和增强现实。 因此,您可能需要测试这些功能或创建出色的应用程序。 但是,如果您注意到其中一些需要自定义相机并访问相机框架。 iOS有很多API,供我们访问设备相机,捕获图像并对其进行处理。 AVFoundation是您应该关注的框架。 由于此框架非常庞大,并且有很多方法可以实现所需的功能,因此我决定撰写有关以下内容的博客文章集。 创建自定义相机视图 从自定义相机拍照 使用录制视频 检测面部并扫描QR码 (如果您需要一些特定的东西,请在评论中问我。我将尝试写/学习此内容) 对于所有想跳过博客文章并查看实际代码的书呆子。 我被你盖住了。 这是Github回购。 请密切注意此仓库,因为我将在同一应用程序中添加所有功能,并且如果您想提高代码质量,欢迎PR /问题。 rizwankce /相机 sw swift github.com中的iDevices自定义相机

什么是ErrorType?为什么要使用它?

在Objective-C时代,处理错误的最常见方法是使用NSError实例。 一个可能失败的方法通常需要一个指向空NSError实例的指针,这样它才能在执行失败时以及返回时返回特定的错误信息。 然后,您将必须检查错误实例是否仍然为空。 然后使用erorr详细信息放在其userInfo ( NSDictionary )中,使用它们的代码 ( NSInteger )和域 ( NSString )区分这些NSError实例。 这种方法对许多Objective-C开发人员都有效,但存在一些问题。 首先,检查错误很容易被忽略/遗忘。 其次,开发人员可以选择不传递错误指针。 两者都可能导致不良行为,并且在最坏的情况下,还会导致应用崩溃。 此方法仍在Swift 1.x中使用。 处理错误的另一种方法是使用异常。 引发异常时,执行将暂停,并且堆栈跟踪会立即暴露出来或应用程序崩溃。 异常在运行时得到解决,这意味着当您与它们面对面时,您只会知道它们的存在。 引入ErrorType Swift 2.0中引入了ErrorType协议,该协议为开发人员提供了另一种错误处理流程。 许多数据类型都可以符合ErrorType协议,包括struct和class ,但是使用最广泛且可能是最理想的数据类型是enum 。 由于列举了这些错误,因此无需使用幻数就可以更容易地对其进行分类。 使用Swift强大的enum数据类型,也很容易通过错误传递值以提供更多上下文。 NSError符合ErrorType,但是从ErrorType转换为NSError会丢失几乎所有信息。 投掷 可能引发错误的方法用throws关键字标记。 抛出的对象必须符合ErrorType协议。 Cocoa和CocoaTouch初始值设定项现在使用抛出,而不是使用ErrorPointer导致失败( 初始化? )。 我们上面使用的示例的方法签名现已更改。 赶上试试 捕获模式现在是Swift中错误处理的核心。 现在要求将可能失败的方法放入do-catch块中。 调用这些方法需要在调用它们之前立即用try标记它们。 使用CustomError和methodThatMayFail()示例,调用用法如下所示。 当标有try的方法失败时,代码将立即进入相应的catch块。 请注意,在上面的示例中,可以使用简单的let语句检索通过CustomError放大的值。 开发人员被迫处理错误,从而导致更好的代码输出。 就像上面的示例一样,所有自定义案例都用通用捕获来处理所有其他错误。 请注意,不可能用尽所有ErrorType情况,因为任何抛出方法都可以抛出任何符合ErrorType的错误,因此总有必要进行通用捕获 。 还有其他方法可以调用失败的方法而不将它们放入do-catch块中,这是通过使用try标记它们! 还是尝试? 您只能使用try! 当您完全确定该方法不会失败时。 如果这样做,您可能会因为崩溃而使应用程序崩溃。 此模式也可以用来捕获开发人员错误。 […]

9款适用于iPhone和iPad的超赞付费iOS应用现已免费

1.诺齐奥 描述 Noizio是一款可消除街道噪音的应用程序,可让您专注于手头的工作,从而提高工作效率。 特征: •15种迷人的环境声音; •轻松选择和混合环境声音,使其完全适合您的心情; •简约设计; •声音以无缝循环播放; •支撑旋转装置; •添加了自动暂停计时器 2.我的感激日记 描述 每天仅需5分钟就能轻松过上幸福的生活。 基于久经考验的感恩和正念技巧,《感恩日记》是一本生活中最美好时刻的私人日记。 通过记录生活中的最佳时刻,Gratitude适用于所有性格类型,可以减轻压力,改善健康状况和您的整体生活质量。 特征: +有趣,轻松,快速的方式来捕捉当天的最佳时刻 +导入您的Gratitude应用程序条目 + 100%私人 +温和的提醒可以帮助您 +个性化的进步 +独特的表情符号捕捉当下的精神 +有趣的写作奖励 +密码保护 +导出为可爱的PDF +没有订阅