Tag: 故事板

Swift中的单元测试笔尖

这是一个简短的教程,展示了如何将TDD原理应用于iOS项目中的笔尖设置,希望这将使您对一般的笔尖和TDD实践有更好的了解。 第一: 打开Xcode并创建一个新的单视图项目。 随便叫什么,但要确保启用了单元测试。 检查您的项目并删除所有样板代码。 您的ViewController应该看起来像这样:

O Primeiro Projeto gente nunca esquece

可以说是我的利古塔大学教授,还是其他国家的教授,请继续与其他国家的律师进行对话,并为您的研究工作做准备。 。 请联系我,我将继续为您提供免费的企业服务,其中包括: 在iOS上使用Objective-C查询解压缩器的问题,或者在Java EE上存在问题。 Recebi novamente是一位在iOS或Web上胜任教授的专家,他在MacBook Air上拥有11英寸的性能,而在esm上则是由Android研发的超级机器人。梅斯内沃索。 Primeiro Dia trabalho,Fu um dos Primeiros a Chegar,peguei或MacBook e fui pra mesa,Abri o Xcode或triste surpresa: Eu passei阿尔加姆tempo olhando pra essa montstruosidade,tentando entender porque uma pessoa tinha tanta maldade nocoração。 Cada uma das 5视图ViewController的副本,com的重复性和咨询性。 TI的时代教授,对普通民用炸药的解释: Depois que fui liberado pra refazer o projeto fiquei mais Caloo,fiz o que […]

程序界面与Swift中的Storyboard

在Swift社区中,有关如何构建用户界面的讨论一直在进行中。 我得出的结论是,这取决于个人喜好或公司的选择,直到我开始在拥有较大iOS团队的公司工作时。 我想分享一下我的观点随着时间的变化,这可能会帮助您选择一种更好的方式来构建应用。 使用Storyboard构建/查看用户界面太容易了。 假设您加入了一个团队,并且需要在现有代码库的基础上构建一个新功能。 如果所有内容都是以编程方式构建的,那么您可能需要花一些时间来弄清楚什么是什么,需要使用哪些UI组件等等。单击几下,这些问题就不会是Storyboard的问题。 但是Storyboard有几个问题,我找不到解决方案。 将数据传递到Storyboard创建的另一个视图并不理想 将数据传输到另一个视图的最流行的方法是,在创建实例或使用函数performSegue(withIdentifier:sender :)之后,立即将其立即传递给实例。 这种处理将数据发送到另一个视图的方法不是理想的,因为它是在团队中的每个人都了解我们将数据传递给视图的工作原理的前提下进行的。 假设您创建了一个场景,该场景显示了从数据服务器获取的对象列表,并且当用户单击一行时,我们选择了一个场景,该场景显示了所选对象的详细信息。 上面的方法不是最好的方法的原因是,即使不需要,对象属性也必须公开给外界。 这可能会导致如果分配了另一个对象,则可能导致错误。 然后,这种类型的代码希望团队中的每个人都知道在创建实例后detailViewController需要该对象。 如果您的项目有50个以上的场景,那每个人怎么知道每个场景具有的每个需求呢? 这可能会导致无效的发展。 如果继续以编程方式构建此视图控制器,它将看起来像这样。 如您在上面看到的,当我们初始化对象时它需要对象,因此编译器会在编译时对其进行检查。 这样,可以使未创建此视图控制器的开发人员得到所需的数据通知,以使该视图控制器正常工作,而无需花费时间去研究代码。 使用Storyboard修复某些东西时,它变得稍微复杂了一点。 如果在Storyboard中创建UI组件并在代码中进行设置,则有两个容器需要维护,即代码或Storybase。 例如,当您需要在特定的位置查找代码时,您需要设置表视图的委托,因此您必须检入代码和Storyboard,因为您可以通过两种方式进行设置。 好吧,这实际上是一个有趣的部分。 我长期以来一直主张仅将编程代码用于用户界面。 现在,我在一家银行工作,该公司的应用程序具有大量具有许多功能的场景。 我记不清多少时间我对Storyboard创建的所有场景表示感谢。 很容易看到流程,很容易理解是什么,很容易处理任何错误。 关于应该采用哪种方式,我仍处于围栏。 说您可以根据自己的喜好或您更看重的东西选择它是更正确的选择。 我仍然更喜欢程序化UI,而不是Storyboard,但这是我个人的选择。 希望我的意见能帮助您理解以前可能遇到的某些问题。 最后,这是一个选择,而不是一个要求! 感谢收看!

使用动画和不使用故事板的iOS登录/注销的最佳实践

众所周知,移动应用程序的范围正在日益扩大。 即使这样,登录页面/模块也不是一件容易的事。 因此,完成可测试,可重用和用户友好的登录编剧非常重要。 这篇文章旨在展示iOS登录/登出时的最佳做法,而无需情节提要,而是带有动画。 TL; DR 如果您只是对项目感兴趣,而不对故事感兴趣,那么这里是github存储库: ogulcan / iOS登录示例 iOS登录示例–一个示例iOS应用程序展示了如何在没有故事板 github.com的情况下处理登录/注销 分步指南 0.简介 考虑一下登录方案。 对于大多数应用程序,登录不是应用程序的真实部分。 通常,登录是要采取的步骤。 并且在必要时需要重新应用这一步骤。 例如,如果令牌已过期或用户更改了密码等。 因此,当应用程序启动时: 1.需要知道用户是否已登录或令牌未过期或用户未被禁止等。这意味着应用程序应检查相关服务。 2.如果用户正常,则意味着已登录,首页应显示为下一页。 如果用户不满意,则意味着应再次登录,登录页面应显示为下一页。 3.设置一些假登录,如果我们使用一些动画会更好。 这些是我要采取的步骤。 让我们开始。 1.检查用户 您可能希望在UserDefaults上保存用户。 否则令牌可能永远不会过期。 即使不推荐,事实并非如此。 因此,您可能不需要检查用户是否仍在登录。尽管我仍然建议您遵循以下步骤。 通常建议使用以下方法: 在didFinishLaunchingWithOptions内部的AppDelegate.swift中,检索用户数据并确定应显示哪个视图控制器。 并如建议的那样,让我们​​创建一个名为AppStoryboard的文件来定义每个故事板文件。 还有UIViewController扩展。 我们准备以更简单的方式启动每个视图控制器。 3.登录/注销操作并进行动画处理! 现在,如果我们运行该应用程序,我们将面临登录屏幕,因为我们没有任何令牌。 让我们实现登录和注销IBAction。 首先,我们需要一个更新RootViewController的方法/扩展。 每个IBAction使用钥匙串删除或保存令牌并设置视图控制器。 最后,如果我们运行该应用程序,则每个按钮都可以正常工作。 如果仅点击登录并重新启动应用程序,我们将面对主视图控制器。 精细。 为了更好,让我们添加一些动画。 首先,我们需要更新UIApplication扩展。 这是新版本: 准备使用。

如何避免情节提要中的Segue标识符

Segue标识符是纯字符串 。 故事板中的属性和代码中的文字。 我们需要确保情节提要中的代码与代码匹配。 如果我们需要以编程方式调用segue,则它们很有用,因为它们可以识别segue。 但是通常, 标识符用于将信息从一个视图控制器传递到另一个视图控制器。 像在此示例中一样,标识符用于从源视图控制器A配置B或C: 运行时错误 。 标识符是字符串。 我们可能会拼写错误或重构代码并更改字符串,而不会更新对应的字符串。 这会导致运行时错误。 如果标识符错误,则将继续执行segue,并且目的地将无法正确准备。 准备目的地的代码永远不会执行。 编译器无法检查标识符是否匹配,因此对错误一无所知。 开发人员也不了解它们。 将显示新的视图控制器,并且该应用将崩溃或行为不正确。 最糟糕的部分是,如果我们犯同样的错误,即仅在一侧更改标识符,则会在修复它们后再次出现这些错误。 我们可以通过定义标识符的命名约定( 请参见 stackoverflow问题 )和/或使用常量或枚举而不是文字来尝试最小化此问题 。 注意:Natasha The Robot在文章“ Swift中面向协议的Segue标识符 ”中解释了使用协议和枚举的字符串文字的另一种方法 。 他们摆脱了文字字符串,提高了代码质量。 序列标识符仍被使用。 刚性和脆弱性 。 Segue标识符很难维护。 它们的变化会影响不同的部分,它们是刚性的 。 如果您改变一侧,则会破坏另一侧,它们很脆弱 。 注意:刚度和脆弱性是不良设计的标志,摘自 罗伯特·C·马丁(Robert C. Martin)的 “ 依赖反转原理 ”。 重复的代码。 当我们重写方法prepare(for segue:UIStoryboardSegue, sender: Any?) ,我们将在条件prepare(for segue:UIStoryboardSegue, sender: Any?)和目标cast中复制代码。 […]

带有iOS中故事板的MVVMC

MVVM是MVC的替代品之一。 MVX模式未解决的缺点之一是视图导航。 MVVM也没有。 因此,提到了MVVMC。 C作为协调者是将导航与视图控制器分开。 使用MVVMC时,我们发现它将无法使用情节提要。 加入协调器后,诸如绑定,具有更好的可维护性的自动布局和可见性之类的所有好处都会消失。 原因是ViewController是调用performSegue并处理prepareForSegue那个。 如果我们想将这些方法转移到协调器上,我们需要找到一种方法来处理困难。 只要可以引用viewController,协调器就可以始终处理performSegue。 通过Apple文档,我们知道运行时的prepareForSegue 在segue创建之后且perform前调用。 为了在协调器中处理prepareForSegue ,我们需要在运行时进行一些技巧。 所以提出了一个问题。 我们是否要替换所有视图控制器的prepareForSegue ? 个人我更喜欢灵活性。 我不认为在所有情况下使用相同设计模式的整个应用程序都有意义。 另外,我不希望任何人只有在了解其工作原理后才能开始编码。 最好还是调用视图控制器的prepareForSegue 。 因此,我们可以认为视图控制器或协调器的prepareForSegue将首先被调用,或者我们可以认为一个是另一个的回调。 这导致使用毛毛雨。 通过这次采访,我们知道快速的动态编程不会很快到来。 似乎没有比迅速扑朔迷离的效果更好的方法了。 如果您发现我们不使用任何方法即可实现的任何方法,请发表评论。 因此,在需要协调器帮助时,让视图控制器可以采用一个协议。 protocol Coordinated { var coordinationDelegate: CoordinationDelegate? { get set } } 然后协调员应该处理方法 protocol CoordinationDelegate { func prepareForSegue(segue: UIStoryboardSegue) } 单一协调员 对于2个简单视图,假设我们要构建一个城市列表视图和一个城市详细信息视图。 MVVMC结构可以设计如下。 城市协调员创建城市视图模型和视图控制器。 因此,城市列表视图控制器和城市协调器分别采用协议。 class MVVMCSCityListViewController: UITableViewController, […]

故事板:已批准,但不推荐

自从在iOS 5中引入情节提要板以来,关于为iOS应用程序构建界面的最佳方法的争论一直很多。 尽管UI的可视化编辑器具有许多优点,但是许多开发人员拒绝使用它们,因为它们无法应对复杂的导航和UI层次结构。 Apple通过向OS X引入情节提要来大力鼓励使用情节提要。实际上,Apple Watch现在已要求使用情节提要,并且所有iOS项目模板默认都使用情节提要。 Xcode的最新更新甚至比以前选择在新项目中退出情节提要更耗时。 在Maxwell Forest,我们禁止使用情节提要板来支持程序化布局。 虽然我们可以看到将故事板用于小型项目和单独开发人员的好处,但我们发现在较大的团队环境中,故事板有很多缺点。 紧随其后,了解使用情节提要的利弊很重要。 长处 1.可视化 情节提要是出色的可视化工具,可封装视图表示和它们之间的过渡(segue)。 组织良好的情节提要可以轻松地从高层次了解应用程序流,功能以及应用程序中的视图如何协同工作。 这种可视化可以使刚接触项目的开发人员更容易掌握最新信息。 一个有效用于简单应用程序的情节提要 2.简单性 故事板也非常适合初学者,因为它们易于设置,并且只需最少的代码即可实现许多功能。 即使没有对自动版式的全面了解,简单的界面也可以快速实现,并且拖放界面对于人们学习如何开发比通过编程方式创建版式更加直观。 3.原型制作 Interface Builder具有强大的实用性:它可以使开发人员在没有设计背景的情况下设计出外观合理的UI。 它还允许熟练的设计人员对应用程序进行原型设计,并在工程师充实数据模型并微调UI细节之前将其显示给利益相关者。 弱点 情节提要的简单性和易用性很好,但是在开发更复杂的应用程序时,这也是它们最大的弱点。 在开发复杂的视图层次结构和交互时,尤其是在团队中工作时,Interface Builder的文件结构,工具和稳定性远非理想。 1. Interface Builder的稳定性和怪癖 Interface Builder已经走了很长一段路,但是仍然有其缺点。 例如,它不能在单个情节提要文件中处理大量屏幕,从而产生滞后并经常导致Xcode崩溃。 往返于关键视图控制器之间需要大量测试的应用程序流程可能很快就会陷入混乱,使在情节提要图板之间难以导航。 使用时,Interface Builder中的大多数操作都需要100%缩放,这进一步降低了可用性,尤其是在视图控制器之间拖动以创建序列时。 通过将情节提要分解为多个文件可以缓解这些问题,但是仍然难以管理,并且降低了情节提要作为可视化工具的有效性。 用于复杂UI的情节提要板可能很快变成一团糟 2.没有清晰界面的代码划分 当开发复杂的UI时,将实现分成两个文件,视图控制器和情节提要会使调试和维护变得烦人。 任何工作都需要在代码编辑器和Interface Builder之间进行上下文切换。 在繁忙的大型故事板上,这可能会令人厌烦并且令人生厌。 3.可重用性 可重用性在软件项目中对于减少重复,增加可维护性和错误至关重要。 故事板鼓励使用重复的视觉设计,并手动更改单个元素而非元素类别的属性。 为了使用情节提要板达到可接受的可重用性水平,必须将它们与NIB或程序化UI设计结合使用。 4.单个文件和合并冲突 对于任何严肃的开发,情节提要的最大缺点是它们是包含应用程序多个视图的单个文件。 在团队合作和使用源代码管理时(这应该一直如此),这会产生戏剧性。 只有一个文件意味着合并冲突要普遍得多,当必须使用XML处理冲突时,合并冲突会变得很混乱,这在使用Interface Builder进行更改后会变得非常棘手。 烦人的是,如果开发人员使用不同版本的Xcode,仅打开情节提要板文件将创建更改,这将导致合并冲突! 可以说,通过合理的任务管理可以使合并冲突最小化,但是大多数应用程序的大部分UI流程都集中在几个主屏幕上,并且大多数情况下,多个开发人员将在彼此非常接近的区域工作。 […]

InputAccessoryView和iPhone X

2.现在单击contentView,然后在大小检查器中检查“安全区域布局指南”。 3.将元件固定到安全区域底部。 4.编译并运行。 您已解决此问题。 注意:如果仍然遇到问题,请确保 在 viewDidAppear(_ animated: Bool ) becomeFirstResponder() viewDidAppear(_ animated: Bool ) 或之后 调用 becomeFirstResponder() viewDidAppear(_ animated: Bool ) 。

在情节提要中加载笔尖

Earnest最近发布了首个iOS应用。 下面,我分享了我们如何设计的一些细节。 笔尖和情节提要似乎无法相处。 想象一下一个iOS应用程序,该应用程序使用情节提要来布置视图控制器。 在某个时候,您想要创建一个名为MyView的UIView子类,用笔尖实现其布局,并使其出现在情节提要的视图控制器中。 创建MyView之后,将UIView对象拖到视图控制器中,然后将UIView的类更改为MyView。 “做完!” 你想自己。 您在运行应用程序时期望看到自己的工作成果,但是相反,您只会看到空白。 问题在于情节提要板默认情况下会忽略笔尖。 因此,您需要采取一些其他配置步骤。 您将在堆栈溢出详细说明方法上找到一些好评如潮的响应,详细说明了将笔尖配置为在情节提要中出现的最差方法:在情节提要中创建一个容器,将插座手动重新连接到新实例,或创建另一个UIView包含子视图。 我发现这些太多了。 每次使用自定义笔尖时,我都必须重复这些步骤之一,如果错过了某个步骤怎么办? 将UIView子类与程序化布局一起使用时 ,只有三个步骤。 我进行布局,将UIView对象拖到我的视图控制器上,然后设置我的自定义子类。 那行得通。 我希望从笔尖查看该行为: 我不要 : 每个笔尖和/或视图控制器的样板代码。 额外的意见浮动。 用其他东西包裹我的笔尖。 我要 : 在情节提要板上添加的所有约束都可以使用。 通过情节提要添加的所有子视图都将出现。 通过情节提要设置的任何UIView属性都将应用。 查看Swift ESTNib UIView扩展。 要使用,只需将扩展名添加到您的项目中,并为您的笔尖命名与您的子类相同的名称(即MyView.swift和MyView.nib )。 它是如何工作的? 如果存在与当前类同名的nib文件,该扩展将覆盖awakeAfterUsingCoder 。 它使用笔尖创建视图的新实例,将属性和约束从原始笔尖转移到新实例,并返回新实例以供视图控制器显示。 特别感谢XXNibBridge的创建者Sunnyxx,该目标具有相似的目标。 两个项目之间的主要区别包括 ESTNib传输NSLayoutConstraints的属性。 ESTNib不需要您的视图就可以遵守协议。 ESTNib通过覆盖工作,而XXNibBridge使用毛毛雨。 ESTNib支持添加情节提要的子视图及其约束。 未来的改进 ESTNib也应该能够从UIView子类反映定制的IBInspectable故事板属性。 检查我们 认真今天启动了我们的iOS应用程序! 对于我们目前的客户来说,这是通过Earnest管理您的贷款并推荐朋友的好方法。 对于其他所有人,您可以开始使用负担得起的学生贷款再融资或个人贷款。 在这里免费下载!

一切……无处不在……

您是否曾经尝试过在项目中使用MVC,并且一直都在考虑故事板,NavigationController,Segue,ViewController和视图? 有时,您尝试将上述所有信息传递给模型,而您根本不想使用MVC。 但是幸运的是,SWIFT的功能足以为您解决这些问题。 故事板 我们必须在项目中声明的最重要的内容是Storyboard,这是您进行其余操作之前必不可少的。 我几乎在每个项目中都使用了SWIFT功能,但是您可以通过这些代码查找许多其他内容,也许您找到了您真正想要的东西。