Tag: Swift编程

在大草原学习iPhone开发。 免费。

选择Codebase进行iOS教育的10个理由 从9月18日开始,Codebase将提供为期9周的密集iOS训练营,以教会您Swift中iPhone编程的来龙去脉。 (Pssst!没有学费!)这就是为什么您应该申请: 1.手机占主导地位 2016年发生了一件重要的事情:拥有智能手机的美国人数量超过了拥有台式计算机的美国人数量。 在全球范围内,自2014年以来就是这种情况。移动是未来,但现在就在发生未来。 随着所有令人兴奋的新技术进入市场,这些新技术有望改变我们看待世界的方式,因此再没有比这更好的时机了。 2.专家指导 Codebase的讲师是成功的,工作的iOS开发人员,他们了解他们的知识。 首席讲师Max Howell自首款iPhone推出之前就开始为移动平台进行编程,并曾开发过TweetDeck(自Twitter收购以来),Popular Pays和Poncho等产品,这些产品最近在Apple 的App Planet电视节目中出现音乐。 Max还是Mac的Homebrew软件包管理器的创建者。 听他为Changelog播客所做的采访! 3.代码是未来的语言 编码是新的素养,尽管语言,工具,框架和技术始终在变化,但良好的基础将帮助您跟上发展的步伐。 我们在Codebase的目标不仅仅是教您如何构建令人印象深刻的应用程序; 我们希望为您提供知识,以找到所需的答案,并激发您无畏的探索,快速行动和打破事物的愿望。 4.沉浸式学习是最好的 我们认为,掌握技能的最佳方法是潜入水中。如果您想学习日语,那么您将移居日本以获得最佳成绩。 代码库是您转向Swiftland的象征性举动。 每天沉浸在该语言中会增强神经通路,为您的体验提供背景,并帮助您保留和建立自己的技能。 5.一起学习更好 有很多很棒的在线资源可供您学习编码。 这些没有提供的是一群正在分享您经验的同学。 当您在社区中学习时,您可以获得各种知识,经验和不同的观点……并且有双重动机将其全部消灭。 6.南方美丽,和平且负担得起 编码训练营在大城市里比比皆是,但是城市生活带来的压力(噪音,人群,交通)可能会让人分心。 美丽的南方地区的慢节奏是思考编程逻辑奥秘的理想环境……此外,如果您是从外地访问,您将节省几美元的生活费。 7.萨凡纳适合技术人员 如果您遇到技术聚会,萨凡纳不会令人失望。 技术社区活跃,多元且包容,并且总有事情在发生。 看看我们的朋友发生了什么事: 创意海岸•techSAV•萨凡纳开放•ATDC•启动研磨• Geekend•移动性•公会厅•佐治亚州沿海地区的SDVC 8.我们可能为您找到工作 我们旨在为想要在萨凡纳生活和工作的高级毕业生提供带薪的学徒机会。 选择将取决于许多因素,但作为最低标准,您应该计划每天都参加并努力工作。 9.不收学费! 我们之前已经说过,但需要重复:2017年9月我们的iOS训练营所需的唯一投资是您的时间,精力和必要的设备-MacBook和iOS设备。 与学费高达15,000美元的计划相比,这简直是天方夜谭。 因此,您可以为代码节省脑力。 10.我们可以使我们的世界更美好 世界面临的问题似乎是无法克服的,但是我们可以尽我们所能,使我们的生活变得更好。 我们将尽一切努力来传播知识,创造就业前景,帮助当地企业并改善人们的生活。 来到Codebase时,我们希望您会受到启发,将您学到的东西带入您的世界,并尽一切努力使它变得更好。 在8月30日或之前提交您的申请! 任何问题? 向我们发送电子邮件至hello@codebasesav.com。

在Swift中展开和编辑iOS表格单元格

来自 petethedeveloper.com的交叉发布 最近,我们实现了一项功能,该功能允许用户向UITextView中输入任意数量的文本,而UITextView本身包含在UITableViewCell中。 要求如下: textview不可滚动。 而是,textview应该随着内容大小的增加/减小而扩展/折叠。 textview永远不会小于指定的基本大小 单元格应该因为包含的textview展开/折叠而展开/折叠 下面,我描述我们如何做到的。 实施 实现分为三个步骤: 当textview的内容更改时,计算显示所有内容所需的框架的大小。 这是使用以下方法在UITextViewDelegate textViewDidChange(textView :)方法中计算的; / *计算显示所包含内容所需的帧大小 内容* / 让fixedWidth = textView.frame.size.width 让newSize = textView.sizeThatFits(CGSize(width:fixedWidth,height:.greatestFiniteMagnitude)) var newFrame = textView.frame 如果显示文本所需的框架大小与当前的textview框架大小不同,请更新textview框架的大小。 请记住,我们绝不会将textview框架的大小更新为小于我们指定的基本框架大小; //我们的基本身高 let baseHeight:CGFloat = 50 / *我们的新高度绝对不能小于我们的基本高度,因此请使用两个中的较大者* / 让高度:CGFloat = newSize.height> baseHeight? newSize.height:baseHeight newFrame.size = CGSize(width:max(newSize.width,fixedWidth),height:height) 当textview的框架大小更改时,更新out表单元格的大小以匹配所包含textview大小的大小。 我们使用委托协议来告诉UITableViewController更新单元格高度。 我们传递计算出的框架高度,然后将其作为单元格的高度返回给UITableViewDelegate tableView(:heightForRowAt :)方法; //保存新高度 EditorialCellHeight = […]

具有自动调整大小单元格的自调整TableView的简单解决方案

几天前,我读了一篇简单但精彩的文章,名为Swift 4食谱: Dushyant Bansal的自调整表格视图 (底部的链接)。 他在那里所做的工作非常简单易懂。 他覆盖了reloadData()函数和UITableView的intrinsicContentSize变量。 该解决方案对许多应用程序都很方便,我在其中一个项目中使用了它。 我在这里利用他的一些资源来证明他的所作所为。 这是他使用的Custom类。 问题是,它仅适用于相同大小的单元 。 如果要将此SelfSizedTableView类应用于“ 自动调整表”视图单元格大小 ,则需要扭曲intrinsicContentSize变量。 修改后的代码将如下所示: 覆盖var internalContentSize:CGSize { setNeedsLayout() layoutIfNeeded() 设高度=最小值(contentSize.height,maxHeight) 返回CGSize(width:contentSize.width,height) } 只需在计算高度之前添加setNeedsLayout()和layoutIfNeeded() 。 你们都准备好了。 😆 我想提 如果您使用预设数据(不是来自API)用于tableView,请在viewDidAppear()方法中使用tableView.reloadData()获得效果。 如果要从API提取数据,则已经在API响应块中使用了tableView.reloadData() ,不是吗?

另一个Monad教程

适用于Swift程序员 介绍 函子和monad是一个概念,每个开始学习函数式编程的人迟早都会联系起来,并且通常很难与之抗争。 Monad是一个简单的概念:它具有简洁明了的定义。 另一方面,此定义基于多个抽象层,这使它很难掌握。 我们可以认为monad是简单的(与复杂相反),但是对于大多数人而言,学习monad通常很困难(与easy相反)。 要了解其完整的应用和通用性,这是最困难的事情之一。 这可能是一个解释,为什么周围会有无数的monad教程。 在建立了处理这些抽象的思维模型并获得对概念本身的良好理解之后,通常人们会尝试使过程对于新手来说更加可口,从而使编写教程几乎成为通俗的“通过仪式”。 我认为这与我没什么不同,所以我们继续。 在接下来的系列文章中,我的重点是就我在此过程中发现的陷阱进行思考。 我希望它将使本教程至少与以下术语中已有的一些教程有所不同: 我将尝试使本教程尽可能地实用,探索概念,但尝试将其付诸实践(理解为:代码)。 把它带入这个领域,对我们作为程序员来说更清楚,这对我有所帮助,我也希望可以对其他人有所帮助。 几种有关monad的解释试图使用隐喻来使其变得不太抽象。 在这些隐喻上,单子表示为设计图案,容器或盒子,卷饼,鸭带或“可编程分号”。 尽管它们都可以为单声道模型建模,但是有很多概念和抽象不适合或需要某种调整才能保持。 这就是为什么詹姆斯·伊里(James Iry)说单子像大象(使用盲人和大象的寓言)的原因:您可以有一些直觉或理解概念的某些部分,但仅看到细节会使您错过整个画面。 不知何故,我同意布伦特·约基(Brent Yorgey)的观点,即试图将这一概念适合于隐喻是一种谬论,因为它最大程度地减少了与抽象的斗争是理解过程的一部分。 因此,我将尝试着重于概念而不是隐喻,但我将尝试使用它们指出我在学习过程中与该隐喻有关的一些陷阱(我认为这些观点使我更难理解。概括这个概念)。 根据概念和示例,本教程分为多个小帖子。 我希望它使跟踪和跳过已知部分变得容易。 绝大多数monad教程都使用Haskell进行举例说明。 Haskell是一种纯函数式语言,其语法与大多数程序员习惯使用的命令式和OO语言截然不同。 因此,尝试阅读它们会带来两个挑战,而不是一个挑战:理解概念和语言本身。 找到这个Scala教程对我的学习至关重要。 Scala是一种多范式语言,尽管具有强大的构造,但比Haskell更易于阅读(至少对我而言)。 在本教程中,我将使用Swift,也是一种多范式语言,但我认为它也可以轻松转换为其他多范式语言。 我需要带些什么? 我将重点介绍monad概念及其理解的基石。 有一些以前的知识,我不会关注,但是非常重要: Swift-代码示例是使用Swift语言编写的,因此尽管我认为可以轻松地将其映射到其他编程语言(例如C#,Java,Kotlin等),但是该语言的知识非常重要。 泛型 -泛型类型是monad的基础。 理解概念及其语法很重要,以便理解本教程中的示例和代码。 函数式编程 — Monad是与函数式编程范例相关联的构造,因此了解它以了解monad的用途及其用法很重要。 本教程有两个基本概念:函数组成和函数是函数编程中的“一等公民”(它们是类型,它们就像任何其他类型一样,可以将它们归为变量,并将其作为参数传递到另一个函数或作为函数调用的结果返回)。 所有这些都说明了这一点,并希望我至少可以部分摆脱“ monad诅咒”(当某人终于能够理解它时,他无法向任何其他人解释它),让我们从这里开始。 如果您想转至特定职位,则以下是所有与monad相关的帖子的列表。

状态栏在iOS 9+中发脾气

如果您的应用支持iOS 9+ ,则您已使用修改了状态栏样式。 UIApplication.shared.setStatusBarStyle( .lightContent, 动画:真实 ) ..那么您一定已经看到上面的警告说它已经过时了! 与往常一样,它也建议我们使用替代的新方法。 覆盖var preferredStatusBarStyle:UIStatusBarStyle { 返回.lightContent } 如果您还没有使用过它,那么就让我们来谈谈吧,您可以跳到下一部分,我在这里讨论了在某些情况下它如何发脾气😒 preferredStatusBarStyle是UIViewController上的新UIViewController 。 必须在自定义视图控制器中覆盖它,这意味着在这里您可以控制其状态栏(黑色或白色👍)的样式。 每当加载控制器时,都会调用此属性。 在某些情况下,您的控制器可能希望根据某些条件(例如您滚动了多少)来再次更新其状态栏样式。 在这种情况下,您可以致电.. setNeedsStatusBarAppearanceUpdate() 此方法强制iOS更新其状态栏,并且在此过程中它将调用preferredStatusBarStyle 再次👍。 因此,您也可以根据需要强制iOS更新其状态栏😊 一切看起来不错吧? 😈 在一种情况下,这是行不通的,即您的控制器已嵌入导航堆栈中。 原因是iOS需要父控制器 (而不是子控制器) 决定需要显示哪种状态栏! 让我们看看在这种情况下会发生什么。 子控制器的preferredStatusBarStyle 不会被调用 其父导航控制器的 preferredStatusBarStyle 将被调用 现在不用担心,您不必UINavigationController子类来处理状态栏更新。 相反,我们可以利用扩展来进行救援。 您只需在代码库中添加以下逻辑即可。 扩展UINavigationController { 打开覆盖var preferredStatusBarStyle:UIStatusBarStyle { 返回topViewController?.preferredStatusBarStyle? 。默认 } } ..此逻辑仅表示您正在要求导航堆栈的topViewController决定需要显示哪种状态栏,以显示topViewController除了屏幕上当前的控制器topViewController什么都没有! 这样,您仍然可以在当前控制器中处理更新🚀 不确定为什么苹果决定这样做,但我们必须应对它

学习Swift:我是否过于乐观?

我一直在盯着我在免费在线指南的帮助下开发的相机应用程序的非常基本的布局。 没什么特别的,实际上这很糟糕,但这只是一个开始。 但是,我想知道我对Swift的学习能力是否过于乐观……我应该从更简单的事情开始吗? 简化我的方法? 构建Instagram副本时听起来很有趣。 对于初次使用编码器的人来说,挑战可能太大了。 我认为我应该想出一个简单的应用程序构想,以学习功能工作原理以及Xcode布局的一些基础知识。 我一直在研究Apple的“学习编码”电子书,这对我很有帮助,但它也使我真正了解到要学习多少信息。 学习所有内容都不是问题,但是正如前几天我告诉妻子的那样,我目前正在了解婴儿的水平。 我可以发出声音,也许其中一些声音可能会误认为单词。 但是,我还不能真正进行交流,我当然不能将单词串连接在一起以创建句子或讲故事。 应用程序构建是一个学习过程,我需要一次走一小步,我认为最好的方法是退后一步,尝试创建一个更简单的应用程序并以此为基础进行构建。 因此,因此……我本周的任务是使用Swift创建一个简单的应用程序。 明天,我将有更多关于此应用程序的功能以及如何使其正常运行的信息。 在此之前-保持推荐,关注和分享。 您的支持将帮助我继续前进! -J

无主与弱

弱和无所有权用于解决内存泄漏和保留周期。两者都不会增加保留计数。 话虽如此,我们不会像弱者那样使用无人值守 。 因为,我会说要么我们不想弄乱功能,要么我们不想三思而后行,就像其他人一样,我确实拥有甚至没有单个无主变量的源代码。 最近,我有机会更多地了解这些术语并进行猜测,只要您知道何时以及如何放置它们,我发现的弱点和无名者都非常简单易用。因此,在这里,我将帮助您找到何时以及如何 🙂 无人 要使用无主属性时应记住的重要点 ·当另一个实例具有相同的生存时间或更长的生存时间时,可以使用无所有权。 以客户和信用卡为例。 在这里,没有客户就不能存在信用卡。 信用卡实例永远不会超过它所引用的客户,并且我们仅通过在初始化程序中传递客户实例来创建信用卡实例。 因此,我们可以绝对保证没有客户就不会存在此信用卡。 当客户为零时,客户和信用卡都将被释放。 当在闭包中使用时,未拥有的引用的行为就像它们是隐式解开的optionals.so,因此当您在闭包中使用它们时,您不必进行可选的链接,也不必解开它们。 弱 每当引用被释放时,weak都会使指针无效,但无主不会这样做,因此可能导致指针悬空。 因为弱引用需要在运行时允许将其值更改为nil ,所以它们始终被声明为变量和可选 当在闭包中使用弱引用时,它们的作用类似于optionals.so,因此在闭包中使用弱引用时,必须对其进行可选的链接。 您是否想过闭包中[弱我]或[无主我]是什么意思。 它被称为CaptureList 好吧,方括号表示捕获列表,它只是一个数组 ,其中弱的self是其中的唯一对象。 作为一个数组,捕获列表不仅仅可以捕获弱的自我。 您可以捕获任意多的内容: 我希望这是有用的,如果您有任何疑问或需要澄清,我很想听听他们的意见!

使用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 的诞生感到疑惑, 或者想查看更多此类片段,可以在 这里 找到它们 😊

作为iOS开发人员实习生的12周-第九周

第9周真是令人兴奋! 我参与的一个项目已经发布,当然我也学到了新东西,我将在这里分享一些内容: 项目发布 我参与开发的面向消费者的iPad售货亭系统已在旧金山正式发布! 该应用程序用于为快速/休闲连锁店点餐/领取食物😊 建立消费者使用的东西真是太了不起了,我为此而活。 我等不及要把信息亭系统扩展到其他城市了! 我也很想去旧金山一探究竟 为成功发布而欢呼雀跃! 在StackView中对组件进行动画处理 如果输入无效,我必须设置一个错误UILabel动画,以在textField下面显示一条错误消息。 错误标签应来自无效输入下方,并在两秒钟后进行动画备份。 在上面的示例中,电子邮件字段不正确,因此错误UILabel应该动画,并在两秒钟后消失。 每个字段都是可重用的自定义UIView。 在每个字段中管理状态以验证输入。 errorLabel位于自定义UIView内,最初被隐藏并限制在自定义UIView的边缘 输入无效时,自定义UIView的高度将更新为初始高度的2倍 UIView.animate用于取消隐藏错误标签,并将errorLabel设置为UIView底部的动画 当在stackView中扩展不同的组件时,必须将发行版设置为以下内容, 否则它不会扩展并将下层的view向下推 stackView.distribution = .fill按比例 隐藏 当隐藏并取消隐藏UIView时,如果考虑一下,似乎只是在更改Alpha。 (0不透明度将不显示任何内容,而1的不透明度是完全不透明且可见的。尽管isHidden和更改alpha不透明度不能一起用于隐藏和取消隐藏视图。 例如,如果UIView用.isHidden隐藏,则.alpha更改不会取消隐藏它。 myView.isHidden = true myView.alpha = 1。 //这不会取消隐藏视图//以下将隐藏并取消隐藏myView.isHidden = true myView.isHidden = falsemyView.alpha = 0 myView.alpha = 1 在UILabel上填充 我必须使用一些填充文本和背景颜色,这些颜色从屏幕的左边缘一直延伸到屏幕的另一侧和边缘。 UILabel上没有内置的可自定义填充/插入。 显而易见的答案是将UILabel放在容器UIView内,并约束标签,以使标签在容器视图内具有填充。 虽然我无法将其用于由可重用的自定义UIView组成的stackView。 意见的顺序很奇怪。 即使容器视图是在错误UILabel之前添加的,并且错误标签已添加到容器中,但它仍显示在UILabel的顶部,完全遮盖了UILabel。 我在stackOverflow上的UILabel上发现了这个强烈的填充扩展,它起作用了: 第9周就这些了! 感谢您的阅读! 在这里阅读有关iOS开发者实习的第7和第8周的信息 […]