Tag: swift

iOS的TableViewKullanımı

从iOS发行到iOS发行人。 Ilk olarak故事板üzerindeki视图üzerine表视图ekliyoruz。 Böylebirgörünümelde ettikten管理员üzerineekliyoruz。 Şimdigeldik控制器üzerindekiişlemlere。 选择UITableViewDelegate和UITableViewDataSourcedelegasyonlarımızıekliyoruz。 Eklediğimizbu iki Protokol bizden ikifarklımethodu zorunlu olarakkullanmamızıistiyor。 numberOfRowsInSection和cellForRowAt。 numberOfRowsInSection toplamdakaçadet rowa sahipolacağımızıdöndürürkencellForRowAt表视图Celldöndürüyor。 Yani numberOfRowsInSection方法表视图üzerindekaçadet eleman,hücreolacağınıbelirliyyuz,cellForRowAtüzerindeise表视图hücrelerinidüzenliyor,ayarlıyoruz。 Zaten iki methodundöndürdüğüveri tipinden de anlayabilirsiniz。 Standart olarak UITableViewCell()在Storyboard上的可重复使用的单元格。 Haydiöyleyapalım。 TableViewCelli表视图可以用于UITableViewCell类,还可以用于标识符。 本OrnekCell添加UITableViewCell类。 Ve标识符olarak da ornekCellIdentifieryazdım。 否:不能识别XCode等级的检查员,请立即检查。 Burayıda hallettikten声音控制器üzerindeçalışmaya。 您可以从表视图视图中下载表,也可以从表视图中查看数据源。 UITableViewDelegate和UITableViewDataSource可以在UITableViewDataSource上进行更新。 Dahaaçıkanlaşılmasıaçısındanşöyleyapalım。 Meyvelerdenoluşanbir字符串数组oluşturalım。 Arrayımızşöyleolsun。 让meyveler = [“ elma”,“ armut”,“ muz”,“çilek”,“ kiraz”,“ portakal”,“ mandalina”] Arrayimizioluşturduktan声纳numberOfRowsInSection方法使用elemansayısını(Int)döndürüyoruz。 […]

Ruby和RSpec的介绍…

预备课程的第三周非常具有挑战性和趣味性。 这是我第一次使用Ruby和Rspec测试,我发现提高编程效率非常有用。 好吧,在展示我的工作之前,我将简要介绍Ruby和Rspec。 Ruby是一种动态的开源编程语言,其重点是简单性和生产力。 它具有优雅的语法,易于阅读且易于编写。 另一方面, Rspec是用于Ruby编程语言的单元测试框架。 它确实是一种行为驱动的开发工具,因为测试重点在于应用程序的“行为”,而不是其工作方式。 它强调应用程序的行为方式,而不是工作方式。 以下是一些有用的Rspec关键字: describe关键字 -用于定义“示例组”。 您可以将“示例组”视为测试的集合。 it关键字 —用于定义“示例”。 一个例子基本上是一个测试或一个测试案例。 Expect关键字 – Expect关键字用于在RSpec中定义“期望”。 这是一个验证步骤,我们在其中检查是否满足特定的预期条件。 模拟Fizzbuzz游戏 Fizzbuzz是一个小组文字游戏,儿童可以教他们有关分裂的知识。 对于孩子们来说,这是一个不错的游戏,它将帮助他们熟悉部门划分。 规则是如此简单,但是迫使玩家以几种不同的方式快速分析数字。 规则: 如果该数字可被3整除,那么该人不会说这个数字,而是说“嘶嘶!” 。 另外,如果数字中包含5,则玩家必须说“嗡嗡!” 。 同样,如果数字可以被3和5 a整除,则必须说“ FizzBu​​zz!” 。 这些嘶嘶声和嗡嗡声结合在一起,例如,代替35 ,我会说“嘶嘶声,嘶嘶声,嗡嗡声!” ,因为该数字包含5,可以除以5,然后可以除以7。 Fizzbuzz游戏是用不同的编程语言编写的,因为它对于初学者来说是一个很好的练习。 显然,我们将创建一个使用Ruby和Rspec来模拟fizzbuzz游戏的程序。 编写一个测试和程序,打印从1到100的数字。但是,对于三个打印数字“ Fizz”(而不是数字)的倍数,以及五个打印“嗡嗡声”的倍数。 对于三和五的倍数的数字,请打印“ FizzBu​​zz”。 现在,让我们开始吧! 首先创建一个新目录: fizzbuzz 2.打开fizzbuzz目录并创建Gemfile 3.打开Gemfile并将rspec添加为依赖项: 4.现在,我们必须通过输入$ gem install bundler来安装gem。 5.然后在终端中运行bundle install 6.现在,通过在命令行中输入$ rspec […]

使用UIMotionEffect创建视差效果

我敢肯定,您之前在设备主屏幕以及其他应用程序(如消息,天气和Facebook Paper)上已经看到了这种酷炫的效果。 iOS使用视差效果在主屏幕和设备其他区域上产生深度感。 在本教程中,我们将讨论运动效果,这是一种将设备的真实属性映射到应用程序界面并在设备水平和垂直倾斜时影响界面外观的简便方法。 什么是UIMotionEffect? UIMotionEffect是iOS 7中引入的抽象类,用于向用户界面添加逼真感。 将UIMotionEffect视为类似于CAAnimation的类,它们都分别为连接到它们的Views和Layers设置动画。 除了CAAnimation是时间的函数而UIMotionEffect是设备的运动的函数之外。 UIInterpolatingMotionEffect是负责将这些效果添加到视图中的类。 创建此类的新实例后,必须将适当的值分配给minimumRelativeValue和maximumRelativeValue属性。 当用户移动设备时,运动效果开始将系统返回的固定偏移值转换为指定的值范围。 建立您的Xcode专案 让我们开始使用Xcode创建一个新项目,然后选择Single View Application作为模板,并将其命名为Parallax Effect 。 我们将在这个项目中使用Swift作为编程语言,因此在创建项目时不要忘记选择它。 完成后,在Project Navigator中选择Main.storyboard ,然后将Image View对象从Object Library拖到View Controller。 下载此图像并将其图像更改为该图像 (或所需的任何图像)。 然后将其放在主视图的中心。 不要忘记将图像视图的“ 内容模式 ”设置为“ 居中 ” 。 使用Xcode 7.3,您必须为视图配置自动布局约束,以支持所有类型的iOS设备。 在最新版本的Xcode中,“自动布局”功能非常强大。 对于简单的约束,您只需单击“自动布局”菜单的“问题”选项,然后选择“添加缺少的约束” ,Xcode将自动为视图配置布局约束。 实现UIInterpolatingMotionEffect 现在,您已在情节提要板上创建了图像视图,是时候创建视差效果了。 打开ViewController.swift文件,并将以下代码添加到viewDidLoad 。 具有UIMotionEffect的视差效果 我见过许多开发人员使用keyPaths center.x和center.y实现此效果,我认为这不是通过在框外拉伸图像视图以告知视图控制器图像更大来解决此问题的正确方法。比显示的要多。 使用3D变换将是创建深度感知的正确方法,而无需那些黑客来实现我们的目标。 仅对垂直轴和水平轴使用关键路径layer.transform.translation.x和layer.transform.translation.y 。 创建完UIInterpolatingMotionEffect实例之后 ,正如我在本教程开始时所说的 ,我将为“垂直轴”和“水平轴”指定一个最小值和最大值。 最后,将运动效果添加到图像。 UIMotionEffectGroup类管理您希望同时应用的动作效果的集合,而不是单独添加它们。 而已! […]

iOS版参考资料

推荐人未完成的推荐作品。 Yasbemos que no esasíde sencillo,las referencias fuertes son necesarias pero hay que tener clarocuándohay que hacerlasdébiles,es Decir,identédóndehay riesgo de crear un ciclo deretenciónde memoria。 佩罗底漆 ¿Ques ARC? 自动引用计数,自动引用计数 ,大号rasgos,美国的mecanismo的备忘录。 公民身份证明书上的公民身份证明书,以书面形式证明。1.公民身份证明书上的公民身份以书面形式作证。1.西班牙裔美国人的信仰证明书上的自由魁北克省,利物浦或再利用。 ¿Quées unareferencia fuerte吗? 声明可变的实用程序,例如: var objeto = AlgunaClase() estamos creando或referencia fuerte desde el contexto实际( self )hacia objeto 。 ¿Quéesunareferenciadébil? 纪念性和无罪性的参考书目,无保留意见的无保留意见的海洋。 帕拉·德菲尼拉(Para definirla),《弱者》是无名的。 弱 weak乌拉圭objeto) […]

具有自动布局的表标题视图

请给我代码! 我一直在寻找如何在表格标题视图中使用自动布局。 设置表视图的tableHeaderView感觉就像将视图扔在一个黑洞中。 我们不知道它与层次结构中其他视图的关系。 最终,我找到了一种无需使用显式框架即可对我有效的解决方案。 注意:我将UIViewController和UITableView用作子视图,而不是UITableViewController。 要点: 1)设置表标题视图,2)将标题视图的centerX,width和top锚固定到表视图, 3)在表标题视图上调用layoutIfNeeded以更新其大小,4)*再次设置表视图标题。 脚步 在viewDidLoad() : 进行容器视图。 在此处添加所有内容。 确保正确设置约束以使其根据需要增长。 将tableHeaderView设置为容器 加 容器(现在为tableHeaderView)到表格视图的centerX,宽度和顶部锚点。 通过调用layoutIfNeeded()第一次更新标题视图框架,然后再次设置表标题视图。 就是这样。 // …在viewDidLoad()中 // 1。 让containerView = UIView() containerView.translatesAutoresizingMaskIntoConstraints = false // headerView是您的实际内容。 containerView.addSubview(headerView) // 2。 self.tableView.tableHeaderView = containerView // 3。 containerView.centerXAnchor.constraint(equalTo:self.tableView.centerXAnchor).isActive = true containerView.widthAnchor.constraint(equalTo:self.tableView.widthAnchor).isActive = true containerView.topAnchor.constraint(equalTo:self.tableView.topAnchor).isActive = true // 4。 self.tableView.tableHeaderView?.layoutIfNeeded() self.tableView.tableHeaderView = self.tableView.tableHeaderView […]

使用语音框架的自定义语音交互器

步骤2:设计UI 现在,在我们的默认视图控制器中添加一些UI元素。 TextView:显示语音输入的文本输出,并接受文本输入进行语音合成。 “听我的家伙”按钮 :开始收听。 “可以说”按钮 :将您输入的文本合成为语音消息。 步骤3:申请权限 为了安全起见,要访问任何硬件,该应用必须获得用户的许可。 只需转到Info.plist文件>>添加新行>>搜索“隐私-语音识别用法说明” >>提供一些获得用户许可的有效理由。 只是忽略我的理由😉 重复上述步骤,这一次是“隐私-麦克风使用说明”。 步骤4:添加语音框架 下一步,也许是最重要的步骤是在我们的项目中添加Speech Framework。 为此,只需单击项目文件>>向下滚动到“链接的框架和库” >>单击微小的“ +”按钮>>搜索“语音” >>单击“添加”按钮。 现在我们已经完成了配置和UI工作。 让我们开始编码。 步骤5:定义对象 为了使我们的应用能够进行语音输入,我们必须初始化以下四个属性。 让我们看看它们的作用是什么。 ognitionRequest: 音频缓冲区将传递给RecognitionTask对象。 ognitionTask :执行语音识别并检索结果的任务。 audioEngine : 连接的AVAudioNode组(稍后再讨论)。 步骤6:添加方法StartListening() 现在,创建一个名称为“ startListening”的方法。 在方法startListening()中添加以下行 在第一行中,我们正在创建SFSpeechRecognizer类的实例。 它基本上告诉RecognitionTask 识别本地/语言的语音输入。 在下一行中,我们正在初始化我们的RecognitionRequest。 第三行,我们正在检查是否成功初始化了ognitionRequest ,如果没有成功则返回致命错误。 步骤7:添加节点 让我们继续前进,并在我们的startListening()方法中添加更多行。 audioEngine!.inputNode返回引擎的单例输入节点。 现在什么是“ inputNode ”? 简单来说,它是用于执行音频信号生成,处理或输入/输出任务的缓冲区。 步骤8:启动音频引擎 让我们添加更多代码。 您在上面的代码中所做的就是准备您的audioEngine实例。 然后启动它以接受来自RecognitionTask的语音输入。 如果失败,则打印错误消息。 步骤9:开始任务识别 […]

隐藏的潜力

我经常问:“拥有私有方法的意义何在?”似乎没有必要隐藏一些。 直到我开始将大型功能分解为许多较小的功能。 然后,这成为访问Xcode的自动完成功能时出现过多方法的问题。 那只是六个功能! 我通常只有6个用于初始化设置! 既然我已经写了我的类,那么现在我就知道了我的类,但是那不是我们作为程序员应该担心的。 从现在开始两周就是我们自己,或者是新人跳入代码以提供帮助,甚至进行审核! (喘气) 使用私有(访问控制)可以使代码更具可读性。 如果我查看了一个类,并且发现有一个私有方法,我将立即知道它将不会在代码中的其他任何地方使用,并且仅与该类相关。 那么,什么时候应该使用访问控制功能(例如private)? 我已经开始简单地将它们用于初始化中的任何调用。 之后,我将私有化我知道不会在类或结构外部调用的帮助器方法。 在此类中,仅在update()中调用motionController(),而其他四个私有方法都在MovementController()中调用。 我的其余代码不需要知道该兔子需要移动的方式或原因,只需要这样做即可。 除了私有之外,还有其他访问级别,但是我们现在唯一关心的另一个级别是文件私有。 它的工作原理与private非常相似,但是它会跳过private变量或方法所驻留的范围,并提供对整个文件的访问权限。 那么,为什么要使用fileprivate而不是private? 好吧,我们通常不! 我唯一一次使用fileprivate是在类的扩展中。 我喜欢通过使用扩展来组织代码,将与这些扩展类似的功能和方法组合在一起,以使其对我可读。 但是,由于扩展位于不同的括号内,因此范围也不同,因此私有方法无法访问其他扩展。 如果所有扩展名都在同一个.swift文件中,则fileprivate将允许这些方法私有并且仍然可用。 在此示例中,我具有一个扩展,其中包含与需要初始化的子视图相关的所有方法。 因为loadSubviews()是在扩展名外部调用的,所以它是fileprivate的。 因此,总结起来,需要一些时间来习惯使用private和fileprivate。 在较小的项目中,它可能不太重要,但是我看到了它在组织中的潜力,尤其是当我们进入建筑设计领域时。 并非所有方法都是平等创建的! 有些人仍然生活在阴影中,但他们仍然做得很好。

使用SwiftyJSONModel在Swift中输入安全的JSON

原始发布在这里: https://gist.github.com/alickbass/b0683c175d6078d2a3bdb4ca005f56da 到处都是JSON 现在,每个应用都非常依赖通过互联网传输数据。 无需解释😉。 而且,当然,最受欢迎的格式是JSON。 在Swift和Objective-C我们需要先解析JSON,然后将其映射到本机对象,然后再使用它。 让我们更具体地考虑以下示例: 删除样板代码 。 因此,现在编译器知道我们使用了什么枚举,因此现在无需直接执行PropertyKey.hobbies.rawValue就可以使用: .hobbies就是这样。 密钥现在是类型安全的 。 这意味着我们不再可以将随机原始字符串用作JSON键。 我们仅限于我们的PropertyKey enum并且当我们尝试使用无效键时,编译器将给我们编译时错误。 看起来不错! 这仅仅是开始! 推断返回类型 除了类型安全键之外,我们不再需要编写stringValue , intValue等。框架知道在执行操作时应返回哪些类型 : 让firstName:字符串 您已经指定firstName为String 。 所以现在代替 : firstName = json [PropertyKey.firstName.rawValue] .stringValue 无需指定stringValue , 现在您可以编写以下代码 : firstName =试试object.value(for:.firstName) 这消除了我们使用Apple的方法进行转换时以及单独使用SwiftyJSON时获得的许多烦人的样板。 但这还不是全部。 现在,对于数组,我们不需要显式映射并转换为特定类型 。 所以代替 : 爱好= json [PropertyKey.height.rawValue] .arrayValue.map({$ 0.stringValue}) 现在我们要做的是 : 爱好=尝试object.value(for:.hobbies) 它的作用与常规String相同。 […]

删除核心数据关系规则

要开始处理核心数据的关系,您应该对核心数据框架有所了解。 今天,我将通过适当的示例向您展示删除规则如何与核心数据关系一起工作。 首先设置项目,从xcode创建新项目,名称为Department,如下面的屏幕截图所示。 不要忘记选中使用核心数据复选框。 现在,是时候借助xcode接口创建数据模型了。 打开Department.xcdatamodeld并创建数据模型。 在这里,我将创建两个名称分别为Department和Employee的实体。 部门和雇员实体具有一个类似于名称的属性,更重要的是在这两个实体之间添加关系。 我创建了Department和Employee实体名称之间的一对多关系 ,因为departmentToEmployee因为部门有很多员工。 另外,我还添加了Employee和Department名称之间的To One关系,因为employeeToDepartment因为雇员只有一个部门。 下面的屏幕快照显示了两个实体之间的关系。 删除核心数据规则 现在是时候通过删除一个实体对象来考虑其他实体对象的影响了。 意味着如果员工被删除会怎样? 员工所属的部门是否也应删除? 否。但是,如果删除部门会怎样? 应该有没有部门的员工吗? 在这里图片处理这种情况。 为此,我们在核心数据框架中有删除规则。 每个关系都有删除规则。 删除规则定义删除拥有该关系的对象时发生的情况。 核心数据支持四种基本删除规则。 没有行动 无效化 级联 拒绝 无操作删除规则 如果将删除规则设置为对该关系不执行任何操作 ,则不会发生任何事情。 让我们举个例子,如果部门有很多员工,如果部门被删除,那么员工什么都没有发生。 员工认为其仍与删除的部门有关。 取消删除规则 如果将删除规则设置为对关系无效,则关系的目的地将变为无效。 在我们的情况下,如果部门有很多员工并且部门被删除,部门与员工之间的关系将失效。 这是默认的删除规则,我们经常在项目中使用此规则。 级联删除规则 此删除规则很重要,并且在将规则设置为realtionship时,请确保所有可能的情况。 当数据模型具有更高的依赖性时,通常使用此规则。 在我们的情况下,这意味着,如果部门有很多员工,并且部门被删除,则属于该部门的所有员工都会自动删除。 在使用此规则之前,请确保您的项目要求。 因为如果删除关系对象,此规则将删除所有记录而不会产生任何暗示。 拒绝删除规则 此规则功能强大,与级联规则完全相反。 它可以防止删除记录,而不是按照级联规则删除所有记录。 在我们的情况下,如果部门有很多员工,则仅当删除属于同一部门的所有员工或没有员工与同一部门捆绑在一起时,部门才被删除。 这全部与核心数据的删除规则有关。 在处理两个实体之间的关系之前,请先了解此概念。 在设置删除规则之前,请先了解您的要求。 我希望你们喜欢阅读这个故事。 如果您对此有任何疑问,请与我们联系。

内存管理

历史: 手动保留释放(MRR):过去,开发人员会通过声明对他们创建的对象的所有权来确定是否将对象保留在内存中,并在不再需要该对象时放弃该对象。 MRR有一个参考计数系统,其中每个对象都有一个计数器,并且当其计数器降至零时将不复存在。 目前 :Swift使用ARC (自动参考计数)来使开发人员免于手动计数。 开发人员将变量定义为弱或强。 弱变量不会添加到计数器中,而声明它的对象无法保留它,而强变量则相反。 内部工作原理: 每当您创建类的新实例时,ARC都会留出内存来存储有关该特定实例的信息。 每当您不再需要该实例时,ARC就会释放内存并确保它不会占用任何不必要的空间。 因此,每当您编写代码并将类实例分配给属性,常量或变量时,它们都会对实例进行强引用。 强引用,牢牢把握实例,只要强引用仍然存在,就不允许释放。 保持循环和/或循环依赖: 当我们遇到ARC发生故障并且发生内存泄漏的情况时,我们将以保留周期结束。 当两个对象相互之间具有强引用且无法释放并释放其内存时,就会发生这种情况。 这会影响我们作为开发人员,因为由于高内存消耗,不良性能和崩溃,保留周期可能很危险。 这是ARC正常工作的示例。 当我们在命令行应用程序中运行此代码时,我们可以看到引用计数降至零。 我们来看一下正在发生的事情,我们实例化了两个对象sejan和angela,每个对象的引用计数均为1。然后我们将两个对象都设置为nil,可以看到对象sejan和angela已从内存中释放。正在打印。 但是,当我们添加另一行代码以表明Angela最好的朋友是Sejan时,会发生什么? 现在我们有一个循环依赖的问题! 因为我们的两个对象紧密耦合,所以发生了循环依赖。 维基百科指出, 循环依赖性还可以通过阻止某些非常原始的自动垃圾收集器(使用引用计数的垃圾收集器)释放未使用的对象来导致内存泄漏。 因此,现在我们将对象sejan和angela设置为nil,这些变量所指向的两个对象的引用计数都减少了1。因此,重新封装两个对象最初的引用计数均为2,实例化并互相引用。 ,然后将对象设置为nil,从而将它们的计数减少1,但是即使没有剩余的对象引用它们,它们的引用计数仍为1。 现在,我们创建了一个保留周期,以防止对象被释放!!! 如果这种情况在您的程序中的其他对象上持续发生,或者如果我们的程序运行了很长时间,则会导致内存泄漏 。 内存泄漏是由于不正确的内存分配导致的资源泄漏,因为不再释放不再需要的内存。 在OOP中,当对象存储在内存中但无法被正在运行的代码访问时,可能会发生内存泄漏。 解决方案1:弱变量。 强引用会增加对象的引用计数,弱引用不会。 弱变量指出,如果没有其他对该对象的引用,则不要因为该引用而将对象保留在周围。 将引用声明为弱引用意味着我们可以使该对象消失,但也意味着必须始终将弱引用声明为可选! 这是因为如果弱引用指向消失的东西,则弱引用将变为nil。 我们的循环依赖关系不再阻止对象被释放。 如果要声明一个对象的引用而不增加该对象的引用计数,但是又不希望该对象一旦分配就为nil ,则可以创建一个无主引用,而不是弱引用。