Tag: iOS应用程序开发

立即开始使用Helper类! – 第1部分

。 。 。 专业人士提示: 如果要更改ViewController标题文本的字体,颜色等,则可以使用此类覆盖所有nav控制器的标题文本属性。 。 。 首先,我们需要在Helper类中添加titleTextAttribute常量。 在类中代码块的末尾添加以下行。 现在,只要您需要此属性来设置导航栏和标题的样式,只需为视图的导航控制器创建一个UINavigationController类,然后在super.viewDidLoad()之后的viewDidLoad()内部添加以下行, 十分简单。 现在结束了,我们不应该只在这里分配变量和常量。 我们还可以编写函数-我们需要全局使用的函数,以避免全部重写它们。 继续阅读后续文章,了解如何利用全局功能! 现在就这样。 在这里查看我的其他文章。

iOS开发人员(Swift)的10个最常见问题解答

我去过许多iOS开发人员特定的采访,我被要求解释很多东西而不是编写任何代码。 您可能知道如何构建应用程序或成为编写Swift代码的专家,但这并不意味着您会在iOS开发人员面试中表现出色。 大多数公司在雇用您时都不允许您编写应用程序或编写代码,它们只是问直接的问题,而且需要描述。 因此,请确保您了解开发应用程序时使用的内容。 这是我在iOS开发人员访谈中被问到的10个问题。 我已经从书本和在线资源中收集了答案,并将它们合并在一页上,所以您不会像我一样费劲。 程序需要根据需要分配和取消分配内存。 Swift会自动执行此操作。 Swift不使用垃圾回收器,这是一种常用工具。 ARC是为Obj-C引入的自动引用计数。 一切都是自动管理的,但是您需要了解ARC以避免内存泄漏。 保持周期? 当引用指向另一个引用时,就会发生保留周期,因此它将永远不会从堆中删除。 这主要发生在类和闭包中。 闭包存在于内存中,因此当您使用Self(作为参考)时,需要确保解决保留周期。 弱,无主,强? 除非您另外指定,否则所有Swift属性都是强大的,这意味着除非拥有它们的任何东西都从RAM中删除,否则它们不会从RAM中删除。 另一方面,当您想说“我希望能够引用此变量,但我不介意它消失了,所以我不想拥有它”时,它就很弱 。这看起来很奇怪:毕竟,引用可能不存在的变量有什么意义? 无所有权的意思是“不要介意这个,我将确保将其从内存中删除。” Model-View-Controller是基于三个作业类别的设计模式:模型,视图或控制器。 模型 :模型负责存储数据并使数据可用于其他对象。 视图 :视图是应用程序的视觉元素。 您在屏幕上看到的内容。 控制器 :控制器执行必要的逻辑,以连接您的视图和模型。 他们处理事件。 在开发应用程序时,您可以使用不同类型的设计模式,但这是最常见的设计模式。 Singleton :Singleton设计模式可确保给定类仅存在一个实例 Singleton Plus:您可以创建另一个对象。 不会强迫您使用共享的。 Facade :Facade设计模式提供了到复杂子系统的单个接口。 假设您有NetworkManager类,可以在其中发出HTTP请求,并且具有JSON响应。 使用Facade,您可以使NetworkManager只专注于网络。 装饰器:装饰器模式可向对象动态添加行为和职责,而无需修改其代码。 适配器:适配器允许具有不兼容接口的类一起工作。 它将自己包裹在对象周围,并公开一个标准接口以与该对象进行交互。 观察者 :在观察者模式中,一个对象将任何状态更改通知其他对象。 可可以两种方式实现观察者模式:通知和键值观察(KVO)。 主要区别在于值类型在传递时会被复制,而引用类型共享引用信息的单个副本。 一个可选的用来让任何类型的变量代表缺乏价值 。 可选变量可以随时保存值或nil。 类支持继承, 结构不支持。 类是引用类型, 结构是值类型。 强制拆包 ! […]

iOS Swift中的单元测试和TDD — pt1

单元测试是测试单个单元/组件的软件测试级别。 目的是通过测试组成程序的最小单元来测试程序的业务逻辑。 在面向对象中,这些最小单位是方法。 因此,我们通过提供输入来测试所有这些方法,并通过比较方法的输出并将其与我们的预期输出进行比较来测试逻辑。 简而言之,这是适合您的单元测试 。 减少错误。 改善设计。 允许重构。 降低变更成本。 好的文档。 简洁的代码示例胜于文档的许多段落 减少了程序员遇到的最大恐惧之一,那就是对一段代码进行更改,而不知道会破坏什么。 到目前为止,大家可能都在想。 如此多的讨论,让我们编写一些单元测试。 从此处下载启动项目。 这是一个简单的应用程序,它通过分别以米为单位的身高和以kg为单位的体重来计算一个人的BMI。 它包含一个名为BMICalculator的类,其中包含我们应用程序的业务逻辑,即用于计算一个人的BMI的逻辑,是的,您猜对了! 在本教程中,我们将测试该类。 运行项目,您将看到此屏幕。 玩应用程序,增加身高和体重,然后看一下您的BMI。 PS:请忽略应用程序的UI,因为我的设计技能不太好。 🙁 有两种方法可以在项目中添加单元测试。 1.从新项目开始 您可以在创建新项目时通过选中底部的“ 包括单元测试”复选框来添加单元测试 。 由于我们已经在项目中添加了单元测试,因此我们跳过此步骤。 2.在已经创建的项目中添加单元测试包 您也可以在已经创建的项目中添加单元测试。 转到文件>新建>目标 选择iOS单元测试套件 点击下一步 打开项目并转到底部的BMI CalculatorTests ,然后选择BMI_CalculatorTests.swift。 您会看到类似这样的内容。 当我们通过上述两种方法中的任何一种将单元测试添加到项目中时,这是Xcode创建的自定义单元测试文件。 让我们快速看一下单元测试的一些重要组成部分。 在最顶部,有一个导入,即导入XCTest。 XCTest库旨在提供一个通用框架,用于在Swift中为Swift软件包和应用程序编写单元测试。 在它下面,您将看到@testable import BMI_Calculator 。 这是Apple帮助您将应用程序代码导入到单元测试目标中的方式,以便您可以运行测试。 使用@testable时 ,无需将应用程序成员身份中的任何文件提供给测试目标。 Apple为您做到这一点,创建了一个很好的干净的分隔。 要创建单元测试,您必须继承XCTestCase 。 通过继承它,您将覆盖它的两种方法,即setup和teardown 。 正如其名称所表明的,它们用于在开始测试之前设置您的测试,并在完成测试之后将您的测试分解。 […]

SwiftCoders三月聚会

嗨,iOS开发人员, 感谢您昨日在亚美尼亚 Picsart参加SwiftCoders亚美尼亚的聚会。 这是我们共同提出的几点。 1.下次我们在2019年3月6日开会。 详细信息将很快提供。 得到你的票 2.让我们通过以下渠道继续关注 * Facebook页面上的新闻和更新 https://www.facebook.com/swiftcoders/ *直接通信的电报频道 https://t.me/SwiftCoders *闲聊和小组讨论 https://swiftcodersinvite.herokuapp.com/ ( 登录后加入#yerevan频道) 3.众所周知,我们已经创建了一个开源GitHub项目,以使我们能够一起编码并在聚会期间集体讨论解决方案。 https://github.com/SwiftCoders亚美尼亚 4.这是昨天的演讲 * Vahagn Gevorgyan的 “面向协议的编程” https://goo.gl/UMkq5f * Ghukas Stepanyan撰写的 “使用您的Linkedin个人资料进行个人品牌 推广” https://goo.gl/9btMCA 5.请给聚会打分 https://mogoni.typeform.com/to/Zs1zfX 6.如果您错过了下载LinkedIn的个人资料图片,请点击链接 https://goo.gl/Comj4v ** 什么是新的 我们的下一个活动是2019年3月6日。 https://swiftcoders.am ================================= SwiftCoders亚美尼亚是https://swiftcoders.org计划的一部分。 **(https://www.facebook.com/swiftcoders/) **(https://github.com/SwiftCodersArmenia/) **(https://www.swiftcoders.am/) **(https://www.swiftcoders.org/)

UITableView使用AutoLayout自动调整页眉和页脚视图的大小

在本文中,我将尝试揭露UITableView类的一些怪癖,并向您展示实现可变高度的页眉和页脚视图的最简单方法。 对我来说,编写UI的简单性实际上根本就是不编写任何UI。 在本文中,我将尽可能多地使用界面生成器🙂 我将仅出于简单起见谈论页眉,但页脚也完全一样。 TableView设定 分组样式表或纯样式TableView的标题与UITableView的任何其他行都没有不同。 设置实际上非常简单。 需要设置sectionHeaderHeight和estimatedHeaderHeight 。 UITableView.automaticDimension是使AutoLayout能够在运行时计算每个单元格的高度的工具。 应该将EstimatedHeaderHeight设置为对其内容的总高度的粗略估计,以显示滚动指示器。 在情节提要中选择TableView时,可以在“大小”检查器中设置这些属性。 创建标题视图 tableView(_:viewForHeaderInSection:)应该返回UIView的实例,但是您猜怎么着? UITableViewCell是UIView的子类。 这意味着我们可以使用情节提要板创建一个原型单元,该单元将从该函数中出队并返回。 我认为,这是在一个位置声明所有视图的最干净的方法,而不是将许多xibs散布在整个项目或在代码中声明为原型的单元或其他单元中。 我创建了一个原型单元,该单元由左侧的ImageView,标题和字幕标签组成。 在此项目的任何地方都没有设置静态高度。 我们希望自动布局根据标签的固有内容大小(将在运行时由其内容定义)来计算单元格的高度。 标签包装在StackView中,并限制在单元格内容视图的所有四个侧面。 我更喜欢在创建视图时使用StackView来减少定义的约束数量。 为了返回视图,我们调用dequeueReusableCell(withIdentifier identifier: String) -> UITableViewCell? 。 我们不使用此函数的forIndexPath:风格,因为我们没有为标头行定义indexPath。 同样, forIndexPath:断言为出队的单元格定义了一个重用标识符,以防止返回nil。 在我们的情况下,可以显示没有标题的部分。 警卫让headerCell = tableView.dequeueReusableCell(withIdentifier:“ header”)else { 返回零 } 空白部分标题 通过设计,如果在组样式表视图中没有为节定义标题,则框架将呈现30像素的空白视图。 苹果公司认为将不同的部分作为一个部分出现看起来很奇怪。 有时,我们只是想违反规则。 ♀️ 要解决此问题,可以使用CGFLOAT_MIN常量。 它代表CGFloat的最小非负值。 对于32位和64位代码,值分别为1.17549435e-38F或2.2250738585072014e-308。 毕竟,它不是零像素。 另一方面,在纯样式表视图中,标题高度可以设置为大于或等于0的任何值。 对于这种特殊情况,我们需要使用tableView(_:estimatedHeightForHeaderInSection:)和tableView(_:heightForHeaderInSection:) 。 如文档中所述,必须实现这两个功能以定义自定义视图的高度。 结论 我很困惑地看到想要实现高度变化的标头的人对StackOverflow有如此多的攻击。 这是我在使用TableView时一直使用的简单技巧,希望它对您和我一样有用。 […]

目录和文件制作器的提示

FileMaker商业智能工具mithilfe von Tableau Mit FileMaker 16的商业智能软件Tableau herzustellen。 Diese hilft Menschen dabei,即Daten zu visualisieren und zu verstehen。 高德纳(Gartner)魔力象限领导者盖恩特(Folge)的商业智能软件和雅虎(WahdefünfJahre)副总裁。 Mit TableaukönnenaußergewöhnlicheGrafiken和Berichte auf Basis von Daten erstellte werden。 Auch denak man仪表板,趋势和趋势,在kenkrete Erkenntnisse verwandeln kann中。 必须使用FileMaker的REST API,才能使用Tableau einfacher als jemals zuvor。 等级:姓名,名称,名称,名称,名称,名称,名称,名称,名称,名称,名称和名称,名称,名称和名称,密码,密码。 模拟zur PHPH API的Haben Sie nur Zugriff auf Felder,死于Ihrem Layout迷惑中。 Arbeitsblätter,仪表板和故事 在Tableau ist jedes einzelne Arbeitsblatt ein einzelnes […]

在开始iOS开发之前我希望知道的事情

如果您刚刚开始学习如何构建iOS应用,那么您可能会无所适从。 我去过那里,我想我仍然在那儿。 我是一名自学成才的开发人员,目前在银行工作。 今天,我想与大家分享在踏入大门之前我希望知道的事情。 您无需彻底了解有关代码的每个细节。 我是一个数学专业的学生,​​所以如果我不了解任何事情的每一个角落和裂缝,我都会变得不自信。 当我开始学习iOS开发时,它实际上对我起到了重要作用。 简而言之,几乎不可能理解代码中的所有移动部分,因为它们相互纠缠在一起,特别是如果您是Swift的新手。 刚开始时,仅接受原样可能会更有帮助。 让我们以UITableView为例。 当我第一次研究该概念时,我意识到需要设置UITableViewDelegate和UITableViewDataSource才能使其按我设计的方式工作,然后我偏偏于Swift如何将委托与表视图挂钩。 该部分实际上是协议部分,与UITableView的严格工作方式无关。 如果我可以准时返回去学习UITableView,那么我将探讨一些您可能认为肤浅的方法:为了使用UITableView,我需要设置委托和数据源。 对于委派,我可以更改单元格的高度或从用户选择特定单元格时回叫。 关于数据源,这全都与馈入表视图的数据有关。 然后,当您对它的工作方式更加满意时,您可能会进一步了解它的工作方式。 故事板与代码 如果您已经阅读了有关iOS开发的足够文章,那么我敢打赌您偶然发现了一篇有关哪种方法更好地创建用户界面的文章。 我认为,您需要学习它们两者。 每个公司和每个开发人员在这件事上都有自己的品位,但我确实认为,如果您刚刚开始学习故事板,则应该使用故事板。 每当您执行某项操作时,它会更加直观且更容易看到视觉变化。 而且,您甚至可能不知道如何使用每个UI组件。 在开始创建所有代码之前,请充分熟悉所有常见的组件和自动布局。 如果您通过程序化UI达到了这一目标,请找出何时一件事情比另一件事更有利,以及它如何比另一件事更好。 到了必须在代码中创建自定义UI的时候,就好像您正在大量使用情节提要一样。 了解软件设计模式 到您熟悉Swift时,您会意识到仅仅使它起作用还不够。 您需要考虑应用程序的维护方面,在代码库中添加功能相对容易吗? 发现错误后修复它是否容易? 单元测试容易吗? 当您使用大型代码库并且结构不合理时,您将发现进行更改或在此基础上添加其他功能非常困难。 它将到达您进行更改但不确定是否会对代码中的其他地方产生任何副作用而导致另一个错误的地步。 那就是设计模式发挥作用的时候。 这与我们如何构造代码有关。 它的范围很广,从MVC,MVVM,VIPER到RIBS。 尝试学习不同的设计模式,并将其应用到您的代码库中进行练习。 它将使您深入了解应考虑哪些因素以使代码库更好。 最后但并非最不重要的一点是,让自己接触与iOS开发相关的任何事物 换句话说,让自己沉浸在iOS世界中。 收听iOS播客,在youtube上观看iOS视频,阅读无数的iOS博客等等。 能够不了解这里和那里的某些部分是可以的,但是这会使您进入学习的心态并开始前进。 在我踏入iOS行业之前,我希望有人告诉过我这些东西。 在进入我的第一份iOS工作之前,我一直在认真研究iOS开发约9个月。 如果您目前感到不知所措和疲惫,请不要放弃! 你能行的。 如果您对iOS开发有任何疑问,请随时在Twitter或Instagram上发表评论或DM me。 感谢您的时间!

Swift 4.2有什么新功能?

又是一年中的那个时候,用于新的Swift语言更新。 4.2是Swift 4系列中继4.0和4.1之后的第二次更新。 在此博客中,让我们检查Swift 4.2中的新增功能,并记住Swift 4.2需要Xcode 10,并确保在开始之前运行Xcode 10。 枚举案例的派生集合: 引入了新的CaseIterable协议,该协议默认情况下会生成枚举中所有案例的数组属性。 我们只需要遵循CaseIterable协议,编译器就会生成allCases属性,该属性是所有枚举案例的数组。 枚举 CompassDirection:CaseIterable { 案例北,南,东,西 } print(“有\(CompassDirection.allCases.count)方向。”) //打印“有4个方向。” let caseList = CompassDirection.allCases .map({“ \($ 0)”}) .joined(分隔符:“,”) // caseList ==“北,南,东,西” allCases的自动综合仅适用于不使用关联值的enum 。 但是,如果需要,我们可以自己添加它们。 列举城市:CaseIterable { 静态var allCases:[城市] { 返回[.antwerp,.brussels,.mumbai,.hyderabad(国家名称:“印度”)] } 安特卫普案例 布鲁塞尔 孟买 大小写hyderabad(countryName:String) } 新的编译器指令: Swift 4.2引入了#warning和#error指令,它们会提示Swift编译器在编译期间发出自定义警告或错误 #warning主要用于提醒自己或其他人某些工作尚未完成。 如果提供的库需要其他开发人员提供一些数据,则#error主要有用。 #warning和#error工作方式相似。 func crypto(_字符串:字符串,密码:字符串)->字符串{ #warning(“这是可怕的加密方法”) 返回密码+字符串(string.reversed())+密码 }结构配置{ […]

iOS:Animate TableView更新

重新加载数据的更好方法 坦白地说: tableView.reloadData仅存在两个原因: 加载初始数据 激怒你的内部完美主义者 大多数数据驱动的应用程序都使用服务器来获取新数据,然后在表视图中显示此数据。 重新加载数据时,集合中的某些项目可能不会更改,或者集合可能仅添加/删除了一些项目,而不会影响所有其他项目。 在tableView上调用.reloadData()将立即更新tableView ,滚动位置将不明确。 不是最佳的用户体验,对不对? 在大多数情况下,您都希望通过漂亮的动画流畅地更新适当的节和行,而没有任何轻拂,跳跃或滚动。

Firebase身份验证

您好iOS工程师, 这是学习Firebase身份验证的好日子。 在我的第一篇文章中,我简要说明了身份验证及其在应用程序中的作用。 今天,我们将找到有关身份验证以及如何在应用程序中使用身份验证的更多信息。 什么是认证? 身份验证是授予用户访问操作系统的过程。 为了进行访问,用户输入其凭据,然后应用程序将该信息与数据库数据进行比较。 如果用户在数据库中,则他们可以使用该应用程序;否则,他们将被拒绝访问。 我们现在使用大量的应用程序,大多数(如果不是全部的话)都具有身份验证过程。 我希望您尝试一下,看看有多少应用程序要求输入用户名和密码。 该过程就是身份验证。 我们为什么要关心身份验证? 我们应该关心身份验证,因为它使我们作为开发人员和客户受益。 让我们考虑一下客户如何使用身份验证方法。 1.用户为应用程序提供新的用户名和密码。 2.该应用程序仅在数据库中为该用户创建了一个唯一的配置文件。 3.用户只能访问其数据。 这只是用户如何使用身份验证的基本概述。 大多数情况下,每个应用程序都像上面的列表一样工作。 用户可能会以不同的方式与某些应用进行交互,但这只是基本概述。 对于我们的开发人员来说,身份验证也是有益的。 让我们考虑一下为什么要使用身份验证。 1.身份验证有助于提高安全性,因为用户可以将数据保存到他们只能访问的数据库中。 2.当用户登录到应用程序时,我们将为该用户创建一个结构化的数据库。 3.因为我们可以将用户与数据相关联,所以管理应用程序的所有数据更加容易。 例如,假设我们有一个应用程序将图片存储在数据库中。 如果没有身份验证方法,我们将不知道哪个用户提供了上传图片。 拥有这些信息很重要,因为如果用户想查看他们上传的图片,我们将不知道,因为数据没有连接到任何用户。 通过身份验证,我们可以在该数据库中为该人创建一个唯一的ID。 用户每次上传任何图片时,都会将上传内容与该人的唯一ID相关联。 Firebase身份验证 我们了解身份验证的基础知识,因此现在我们可以讨论Firebase身份验证。 使用Firebase,我们不必从头开始创建我们自己的身份验证库。 我们可以使用Firebase形成的基础架构为我们的用户带来出色的用户体验。 我们可以在Firebase中使用三种身份验证方法。 三种方法是电子邮件和密码,服务和匿名。 1.电子邮件和密码是我们几乎每天使用的每个应用程序中看到的内容。 在使用大多数应用之前,要求您提供用户名和密码。 2.服务已经存在了一段时间。 您正在使用的应用程序将询问您是否要使用Facebook,Google,Twitter等进行登录。服务允许用户选择是否要使用其设备上已在使用的服务登录。 它使建立帐户的过程变得快速而直接。 3.匿名身份验证为用户提供了一个临时帐户。 如果用户稍后注册,他们仍然可以访问其数据。 哪些应用程序应具有身份验证? 我相信所有应用都将受益于身份验证。 就像我之前说过的,这是组织数据的绝佳方法。 您不想做的一件事就是无法保存您的数据。 身份验证是应用程序为用户创建初始数据的起点。 除非您有另一种获取数据身份验证的方法,否则它将是完成这项工作的最佳解决方案。 为iOS设置身份验证难吗? 使用Firebase并不难配置身份验证。 首先,您必须设置环境以将Firebase集成到您的应用程序中。 我确实创建了一个教程,向您展示如何在应用程序上设置Firebase。 您可以在此处找到视频。 在接下来的几天里,我还将创建一个有关如何在您的应用程序中设置身份验证的教程。 […]