Tag: swift

iOS。 如何实现可滚动视图?

作为iOS开发人员,我们经常会遇到需要在控制器中使用可滚动视图的情况。 基本上,有几种方法可以实现此目的。 在此博客文章中,我们考虑使用代码构建UI,即不使用故事板。 首先,如果您不知道什么是滚动视图,则它是UIScrollView类的对象。 我们在开发中需要它,因为设备的框架或显示器在水平和垂直轴上都受到限制。 因此,当我们需要显示比设备框架(尺寸)大得多的内容时,滚动视图会为我们提供帮助。 UIScrollView是一个特殊的视图,其内容视图在水平和垂直轴上都比其自身大得多。 上图的用例是当我们放大图像并滚动y,x尺寸以移动它时。 但是在本教程中,我们考虑了第二个用例,当我们需要滚动视图仅水平滚动时,如下所示: 这用于显示内容,该内容仅长于设备的大小,但不宽于设备的大小。 那么代码在哪里? 我们到了: 1-我们创建UIView类的实例,将其用作滚动视图的内容视图。 因为滚动视图需要具有内容视图才能显示UI元素。 0 —我们创建UIScrollView的实例。 1-在这里,我们将滚动视图添加到控制器的视图,然后将scrollViewContentView添加到我们的scrollView 2-设置scrollView约束。 我们将其边缘设置为等于视图的边缘。 3 —设置scrollViewContentView约束。 4-我们使它的边缘等于scrollView的边缘。 然后另外使其宽度等于视图的宽度,这一行代码非常重要。 如上所述,滚动视图可以在两个维度上更大,因此通过编写此行代码,我们让scrollView认识到我们希望它更长,即仅在y维度上更大。 而已! 此外,我们可以轻松地将视图添加到我们的scrollViewContentView上,它将垂直滚动! 完整的源代码可以在这里找到! 谢谢!

优化Swift编译时间

您在项目中使用Swift进行编译时是否遇到任何问题? 我知道我已经知道了,这让我想知道为什么要花这么多时间来编译,以及如何才能使编译时间更快。 经过研究,我从Robert Gummesson那里读了这篇文章,阐明了编译器如何看待我的代码,以及如何使它更好地使其更快地工作。 在研究了我当前正在研究的项目之后,我决定该是时候最终改善项目的编译时间并节省一些宝贵时间了。 优化代码“编译器样式”后,我将向您展示前后 首先要做的是评估Swift需要花更多时间在哪里编译代码并对其执行操作。 为此,我使用了Robert的Build Time Analyser,使生活更容易查看和比较构建时间。 按照说明进行操作并构建项目后,我花了7分钟以上的时间来编译项目。 七分钟似乎并不多,但是当您不得不每天从一个分支机构切换到另一分支几次时,这7分钟就成为一个问题。 好的,我有项目的编译时间,并且我的项目中编译的类也最慢,这正是我要关注的地方。 我将向您展示当前正在从事的项目“前后”的构建时间。 在此之前,我将向您展示我关注的一些优化选项。 三元运算符 在这个简单的示例中,仅通过用if-else语句替换三元运算符,就可以将构建时间减少97% 。 我们可以看到我们有CarImmersionView,AssistancePresenter,CarImageService,MileageInputViewController,TrackRequestViewController和URLExtensions。 我在这些方法中处理了可以重构的任何函数,就像前面的示例一样。 后 重构这些文件后,这就是我得到的结果: 我们可以看到构建时间减少了将近1分钟。 当然,构建时间会因构建而异,有时,如果不执行任何操作,文件编译的速度将比以前慢或快。 但是,每次迭代之后,这快一分钟的编译时间是一致的。 我们可以看到,通过尽力为编译器优化代码,我们可以缩短应用程序的构建时间。 当然,我们需要评估这段时间是否值得。 编译器喜欢用.forEach替换.map ,但是使用map函数可以更好地读取代码。 因此,归根结底,这是一个折衷,它取决于每个项目和团队才能在代码可读性和编译时间之间找到共同点。 Apple一直在不断改进Swift和Xcode,因此此处介绍的时间可能与我们不久的将来有所不同。 作为参考,对于本文中的任何内容,我都使用MacBook Pro 2017和2.3 GHz Intel Core i5以及运行Xcode 9.2的 16 GB内存。

Swift 3的MVC架构简介

MVC背后的梦想 MVC是用于强大的面向对象编程的强大iOS体系结构模式。 它可以将应用程序的数据/逻辑,视图和控制器清晰地分开。 理想情况下,模型和视图不应直接交互,而控制器应进行调解。 如果使用后端或本地存储系统,则更新模型对象的逻辑应在这些模型文件中。 视图应该是“哑”的,并且只能处理与演示文稿相关的任务。 现实 大规模视图控制器。 通常,遵循MVC设计模式的应用程序具有绝对庞大的视图控制器文件,可以执行所有操作。 另外,您的应用程序一定会违反MVC规则,这几乎是不可避免的。 视图可能会直接与您的应用程序数据交互,或者模型可能会更新用户在屏幕上看到的内容。 根据MVC和Apple的说法,这是不容忽视的,但它一直都在发生。 我应该为我的应用程序使用MVC吗? 如果您只是刚入门或正在构建相对简单的应用程序,则MVC很可能是完美的。 让UIViewController对象做很多不同的事情是创建简单应用程序的一种非常简单的方法。 MVC已建立并且有据可查,因此很容易找到很好的例子。 Apple关于MVC的文档: https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html 一些替代方案: MVVM —模型,视图,ViewModel Swift中的MVVM – Artsy工程 模型视图ViewModel已成为我在iOS上编写应用程序的默认方式–它使编写iOS应用程序变得很有趣。 我写了…… artsy.github.io VIPER —视图,交互器,演示者,实体,路由 使用VIPER构建iOS应用程序·objc.io objc.io出版有关iOS和OS X开发的高级技术和实践的书籍 www.objc.io 对于初学者来说,其他设计模式可能较难入手,但是,如果您要开发复杂的应用程序,那么从长远来看,了解和采用MVVM或VIPER可能对您和您的团队有所帮助。 当今,大多数流行的应用程序都使用自己的设计模式-通常是传统模式的混合。 给那些使用MVC的人一些最终提示 给您的对象明确的责任,不要偏离他们。 使您的视图可重用,灵活且可测试。 尽量保持控制器清洁。 调试会容易得多。

Swift中的内存管理:了解强引用,弱引用和未引用

在我们正在执行的所有编码的背后,您可能在编写代码时注意到一些变量,它们引用了strong , weak或unowned 。 他们到底是什么意思? 通过以strong为参考声明所有变量,是否会使您的变量更强? strong , weak或unowned的用法实际上与Swift中称为自动引用计数(ARC)的内存管理有关。 让我们放慢一点,尝试了解这里的含义。 因此,ARC实际上会进行自动引用计数。 在计算机科学的定义中, 引用计数是一种将引用,指针或句柄的数量存储到资源(例如对象,块或内存,磁盘空间或其他资源)中的技术。 简而言之,ARC实际上有助于将引用存储到内存中,并有助于在不使用引用时进行清理。 另外,在这种情况下,引用计数仅适用于类的实例,不适用于结构和枚举,因为它们都是值类型,而不是引用类型。 在进一步介绍之前,为什么内存管理这么重要? 由于内存管理在分配内存中起着巨大的作用,因此程序确实可以在用户的​​请求下执行,并且在不再需要时可以免费重用,因此这确实是一个大问题。 但是,如果您耗尽内存,会发生什么呢? 该任务将停止执行,这意味着您将无法执行任何任务。 该任务可能不会继续执行,但会继续运行,直到达到极限并且程序崩溃为止。 您可能不希望用户使用越野车程序。 什么是自动引用计数(ARC)? 如官方文档中所述, 内存管理在Swift中“行之有效”,您无需自己考虑内存管理。 当不再需要类实例使用的实例时,ARC会自动释放它们。 ARC还跟踪信息,例如了解代码之间的关系,因此ARC能够有效地管理内存资源。 ARC如何工作? 每次通过init()创建类实例时,ARC都会自动分配一些内存来存储信息。 更具体地说,该内存块保存实例以及属性值。 当不再需要该实例时,将调用deinit()并且ARC将释放该实例的内存空间。 使用下面的代码,这很容易解释,但是我仍然希望您了解代码的作用。 这是带有Person实例和Gadget实例的两个类的示例, Gadget具有init方法,该方法将设置实例的属性,这意味着将任何信息分配到内存中。 同样,在deinit ,我们将看到实例被释放,这意味着包含信息的内存将在我们的情况下释放。 强vs弱vs无主-事实 通常,在创建属性时,除非引用被声明为weak或unowned否则引用为强。 将属性标记为weak ,它将不会增加引用计数 介于两者之间的是unowned引用,它们既不是强引用,也不是可选类型。 编译器将假定对象没有被释放,因为引用本身仍然保持分配状态。 强大的参考 让我们看下面的例子。 我们有一个Person类型的变量,其引用为“ Kelvin”,一个Gadget类型的变量,其引用为“ iPhone 8 Plus”。 查看控制台消息。 您应该看到两个变量都已正确初始化。 现在,添加以下代码kelvin分配iphone并设置iphone的owner 。 在将kelvin和iphone设置为nil之前,请确保插入代码: 好的,在Playgrounds中再次运行代码。 您应注意,控制台仅显示有关初始化的消息。 […]

自定格单元

使用Swift在iOS中使用TableView和CollectionView App Store上的大多数iOS应用程序都有一个项目列表的UI表示形式,因此很明显,iOS开发人员在整个开发过程中花费了大量的时间使用TableView和CollectionView。 自2009年以来,在AppIt Ventures,我们一直在开发iOS应用,并适应iOS提供的所有技巧,改进和新功能。 在本文中,我们希望共享一个称为“自调整大小的单元格”的概念。 尽管这不是一个新话题(iOS 8宣布了这一话题),但我们希望通过Self-Sizing Cells帮助初学者了解更多详细信息和用例。 在iOS 8之前,在具有不同高度的单元格的TableView或CollectionView中显示动态内容并不是一个容易的过程。过去,我们不得不以编程方式计算每个单元格的高度并增加相应单元格的高度。 使用自调整大小的单元格时,显示高度可变的动态内容是一个简单的过程。 将自动布局用于tableview单元内的UI元素。 将Tableview rowHeight设置为UITableViewAutomaticDimension 。 设置estimatedRowHeight或实现高度估计委托方法,并且此estimatedRowHeight将是单元格的默认高度。 设置这两个属性后,系统将使用“自动布局”来计算行的实际高度。 EstimateRowHeight是情节提要中原型单元格的高度,当rowHeight属性设置为UITableViewAutomaticDimension我们告诉tableview根据单元格中添加的其他约束来计算单元格高度。 让我们看一下如何演示如何将tableview告知自身大小的快速演示 。 创建一个示例报价列表演示,以在表格视图中显示带有作者姓名的报价,并使用自定义单元格将表格视图单元格设置为自定义表格视图单元格。 在此示例演示中,我们将展示如何创建支持动态类型的自定义TableView单元格 。 由于动态类型使用户可以控制在单元格中显示的文本的大小,因此,必须根据文本大小调整单元格的大小,这一点很重要。 在情节提要中 ,使用tableview单元格并在其中添加两个标签。 2.我们必须在View控件r中添加以下两个Tableview委托方法。 要么 我们可以在viewDidLoad方法中添加以下两行代码。 3.在数组中加上一些引号,然后将其分配给indexPath()方法中cellForRow中的引号描述标签,有关结果,请参见下文。 在上面的结果屏幕中,我们没有得到预期的结果,因为我们需要将报价描述标签的行数设置 为零 。 设置好之后,最终结果如下。 与tableview演示类似,我们必须按照以下步骤将自定义集合视图单元格设置为自定义大小的 collectionView单元格 。 对UI CollectionView单元内的UI元素使用自动布局 。 设置UICollectionViewFlowLayout的EstimatedItemSize 。 设置systemLayoutSizeFitting为 UI CollectionView单元格。 estimatedItemSize是CollectionView中原型单元格的估计大小。 当我们将systemLayoutSizeFitting属性设置为CollectionView单元时,CollectionView根据其当前约束返回最佳视图大小。 就像我们对TableView所做的一样,让我们​​为CollectionView创建一个报价列表演示,并使用自定义单元格显示作者照片的报价。 我们必须在CollectionView自定义单元格类中添加以下方法。 在情节提要中将行数设置 为零 在CollectionView单元格(如TableView单元格)中获取报价描述标签。 最后,看到用于自定义UICollectionView单元格的结果屏幕。 注意:上面创建的CollectionView演示在UI和空格方面存在问题。 […]

字典和元组之间的区别

词典用于存储相同类型的无序值列表。 每个值都与唯一键相关联,该键充当字典中该值的标识符。 让我们创建示例字典 var studentDetails = [String:String]() 它也是一种可变类型,意味着您可以通过添加,删除或更改其项目来进行更改。 studentDetails [“ firstname”] = [“ Roy”] 元组表示单个组件中的值的集合。 在可以返回多种类型的函数时使用。 我们可以使用dot( . )表示法后跟值的索引来访问内部值: var name = [“ Joy”,“ Martin”] var firstname = name.0 var lastname = name.1 它可以是零个或多个类型的组合。 var value = [“ joy”,1,true] 元组上方是(String,Int,Bool)类型。 元组和字典之间的主要区别 元组是逗号分隔的多种类型的列表,字典是键值类型。 元组只能包含预定义数量的值,在字典中没有这种限制。 元组可以包含具有不同数据类型的不同值,而字典一次只能包含单个数据类型的值。 谢谢阅读。 如果您喜欢本文,请确保鼓掌以表示支持。

发电机em Swift

简介 生成器的primerira pergunta que vemàcabeçaépor te mos entent? Essa perguntanãoabrange somente o tema deste post,mastambémos diversos tipos de objetos quesãoutilizados pela suaaplicação。 重要信息: 量化“框架/ API / SDK”…的可用性,重要信息在实现影响方面具有重要意义códigodo seu应用程序。 紧急情况下的紧急情况: 基本的基础是todas,即“ Swift Swift”中的“ Collections e Sequences”。 您可以使用实用程序或命令来创建公用程序,也可以使用公用程序来替代公用程序。 O发生器 使用简单的协议即可:最基本的示例,最常见的示例: 协议类型Generator类型和简单性,续实现。 next(),公用事业证明人,要素“ eo”,在公共交易中使​​用附加条件的人。 PodemosImplementá-loda seguinte maneira: Bem,请立即给我起名:“ Para que diacho eu vou utilizar isso?”。 生成器类型的实用程序,可以在saber或ococre dentro da的实现中胜任,而algas可能会在下一个页面上显示下一个错误。 […]

使用Swift建立倒数计时器

在情节提要中创建新的视图控制器 添加按钮和标签: “播放” , “停止” , “重置” 3. ScheduledTimer和更新计时器方法 问:为什么“ func”需要添加@objc ? 如何修复“ #selector的参数是指未公开给Objective-C的实例方法”…… 通过这些免费教程 www.hackingwithswift.com 学习iOS的Swift编码。 4.重置/停止/减少/增加实施 Swift的计时器有一个称为invalidate()的方法,它将停止计时器。 有关完整的项目源文件,请访问GitHub

斯威夫特&&愤怒。 设置控制器。

4.将方法添加到SettingsViewController。 覆盖 func tableView( _ tableView:UITableView,didSelectRowAt indexPath:IndexPath){} 5.接下来,我们将添加一些依赖于indexPath的操作 覆盖 func tableView( _ tableView:UITableView,didSelectRowAt indexPath:IndexPath){ 如果 indexPath.row == 1 { } 如果 indexPath.row == 2 {} } 6.首先,行动将是与我们联系。 就我而言,它将打开Instagram。 如果 让 url = URL(字符串:“ https://www.instagram.com/curlnomad/”){ UIApplication.shared.open(URL,选项:[:]) } 7.接下来,我们将添加没有动作的简单AlertController 让 alertController = UIAlertController(标题:“”,消息:“确定要注销”,preferredStyle:.alert) let action1 = UIAlertAction(标题:“是”,样式:.default) 让 action2 = UIAlertAction(标题:“取消”,样式:.cancel) alertController.addAction(action1) alertController.addAction(action2) self .present(alertController,动画: true ,完成: […]

我讨厌Xcode Playground,但是…

长时间编译时,我讨厌Xcode Playground。 总有一天,我会用简单的代码来证明自己的概念。 但这需要第三方或外部库,例如Alamofire,swiftyJSON等。 那个行动 我刚刚启动Xcode,然后从打开的对话框中选择“ Playground入门 ”。 Xcode立即给我一个空白的操场。 大! 我需要一个SwiftyJSON来将JSON对象解析为swift模型。 我尝试将import SwiftyJSON放在Playground的顶部。 不幸的是,我有一个带有红色的错误(!)符号。 嗯..我应该为此讨厌吗? 解决方案 我回到了iOs项目,该项目已经依赖Alamofire和SwiftyJSON。 然后右键单击项目>新文件>选择Playground 。 在选择Playground将要保存的文件夹之后,不要忘记检查项目目标。 检查目标意味着您的游乐场将完全依赖于您,并且您对项目的依赖将与第三个库完全相同。 好极了! 现在,您的Playground可以正确导入SwiftyJSON和Alamofire了 。 在真正实施为更大的项目之前,我可以在这里进行试验性错误,以证明我的概念。 我只是意识到仇恨在那里,因为我不了解它。 自从找到窍门以来,我的仇恨变成了爱。 我爱游乐场 。 🙂