Tag: iOS应用开发

iOS开发memo_UIScrollView

UIScrollView是你原本以为很简单,但操作起来很麻烦的物件。 再加上如果没熟读文件的话,往往只能从错误之中学习,所花费的时间成本相当高。 如果你用代码建立就已经很麻烦了,没想到用Storyboard建立又会更麻烦。 首要在于,原本你认知的UIScrollView实际上与你想像的东西大为不同。 先从code来解说如下: 一般我们建立UIScrollView时,最重要要的属性就是contentSize,因为由它来决定UIScrollView的滑动范围。 当contentSize比SuperView的size大的时候,UIScrollView就会启动滑动功能,因此contentSize的设置非常重要。 而当然不只是这样,UIScrollView的contentSize则又要靠指定frame来建立,否则它不会有任何滑动变化。 基本的代码如下: #import“ ViewController.h” @interface ViewController() @属性(弱,非原子)IBOutlet UIScrollView * scrollView; @结束 @implementation ViewController -(void)viewDidLoad { [super viewDidLoad]; UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(10,900,100,30)]; label.text = @“ Hello world!”; [self.scrollView addSubview:label]; self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width,label.frame.origin.y + 30); } 上面的代码通过IBOulet建立1个UIScrollView,另外建立一个UILabel对象,并指定该UILabel的框架,再把这个UILabel放到UIScrollView里面,注意!里面有非常重要的一点,就是把UIScrollView的contentSize的高度,设置为Label的y值在加30,代表UIScrollView的高会比Label的位置再高一点,留了一点空间相似的外观。 但是,如果想要在Sotryboard放上UIScrollView后,又想在里面放元件时,情况就会完全不同了! 首要就是在于约束。 这边就要提到用Storyboard建立UIScrollView的话,如果你约束上下左右都设置为0,不会出现任何警告, 按确定后,没有任何警告!

减少和过滤

“ Aujourd’hui nous allons illustreràtravers plusieurs L’utilitéde reduce and filter, fond d’ordresupérieurpour manipuler les collection”。 过滤 国务卿,布克尔·波克勒和卢旺达·雷蒙·弗朗西斯科·德·雷蒙·弗朗西斯·科普尔等人收藏,并附有条件性唯一性证书。 Voici签名: 原始封包和封包封的功能以及原封不动的清单。 禁止单身或单身的人在每次旅行中享有永久的权利。 对偶的支持者,对传统的声音的支持: Voici维护人员按功能选择过滤功能 : 商业评论书,以及精美的纪念章和纪念章过滤器,以及不动产说明书。 降低 塞隆语和确定性歌曲的用法和样例:乘数,索性等…独特的价值和价值。 Voici签名: 入门级和高级级的参数功能。 最有价值的初次使用权参数和最终使用权的参数将被优先考虑以保证其最终产量和价值。 法国传统音乐的支持者: Voici维护人员lemême示例avec la fonction reduce : 可以有效地减少不必要的损失,并可以轻松地解决价值问题,并可以有效地降低成本。 结论 遵循性原则可对各种功能进行过滤并 减少代码的永久性添加,并具有持久性和持久性。 N’hésitezpasàlaisser un commentaire si des ou des remarques。

可重用的APIManager-在Swift中为IOS应用程序使用Alamofire和EvReflection

在本文中,我将分享我之前工作过的项目中使用的APIManager。 它是一个单例类,用于管理不同类型的API请求,因此实现将很容易且可重用。 配置 首先,我们需要用于请求和响应类的映射模型才能使用服务。 因此,在APIManager中,使用模型来处理网络请求/响应操作。 您可以在这里找到详细信息。 使用Alamofire和EVReflection自动映射和解析JSON 我经常使用Alamofire进行HTTP联网,这是用Swift编写的流行联网库。 因此,它是… medium.com 另外,我还使用了RouterManager作为APIManager,您可以在这里找到。 使用Swift中的路由器为IOS应用程序更好地路由 在本文中,我将讨论在我正在制作IOS应用程序的项目中使用的其他可重用类。 APIManager使用另一个管理器来处理不同的需求,即AlertManager处理错误警报弹出窗口,而ErrorManager处理错误操作等。因此,在本文中,我省略了有关它们的详细信息。 我将在下一篇文章中分享。 脚步 在/ managers文件夹中设置一个APIManager。 设置您的API方法,方法将请求/响应类作为参数,并使用RouterManager类处理路由以进行操作(.GET,.POST等) 经理 实作 在ViewModel,Presenter等中,可以调用APIManager的方法(例如.getLogin,.postLogin)等。 因此,响应将由APIManager处理,您可以完成自己的任务。 (即将LoggedInState设置为.loggedIn或重定向到其他场景等) 感谢您的阅读。

在Swift中逐步实现委托。

那么,代表是什么? …在软件开发中,有通用的可重用解决方案体系结构可帮助解决给定上下文中常见的问题,可以说这些“模板”被称为设计模式。 委托是一种设计模式,当特定事件发生时,该模式允许一个对象向另一个对象发送消息。 想象一下,对象A调用对象B来执行操作。 一旦动作完成,对象A应该知道B已完成任务并采取必要的动作,这可以在代表的帮助下实现! 为了获得更好的解释,我将向您展示如何创建一个自定义委托,该委托在简单的应用程序中使用Swift在类之间传递数据,首先下载或克隆此启动程序并运行它! 您可以看到一个包含两个类的应用程序,即ViewController A和ViewControllerB。B有两个视图,这些视图可以在点击时更改ViewController的背景颜色,没有什么太复杂了吧? 好了,现在让我们以一种简单的方式来考虑,当点击B类的视图时,它也可以更改A类的背景颜色。 问题在于该视图是B类的一部分,对A类不了解,因此我们需要找到一种在这两个类之间进行通信的方法,这就是授权的亮点。 我将实现分为6个步骤,因此您可以在需要时将其用作备忘单。 步骤1:在ClassBVC文件中寻找实用标记步骤1,并添加此 //MARK: step 1 Add Protocol here. protocol ClassBVCDelegate: class { func changeBackgroundColor(_ color: UIColor?) } 第一步是创建一个协议,在这种情况下,我们将在B类中创建该协议,在该协议内,您可以根据实现的要求创建任意数量的函数。 在这种情况下,我们只有一个简单的函数,它接受可选的UIColor作为参数。 命名协议的一种好习惯是在类名的末尾添加代理人一词,在本例中为ClassBVCDelegate。 步骤2:在ClassVBC中寻找步骤2的实用标记并将其添加 //MARK: step 2 Create a delegate property here. weak var delegate: ClassBVCDelegate? 在这里,我们只为类创建一个委托属性,该属性必须采用协议类型,并且应该是可选的。 另外,您应该在属性之前添加weak关键字,以避免保留周期和潜在的内存泄漏,如果您不知道那意味着什么现在就不用担心,只需记住添加此关键字即可。 步骤3:在ClassBVC的handleTap方法中查找步骤3的实用标记并将其添加 //MARK: step 3 Add the delegate method call here. […]

验证您的移动应用程序依赖的内部API响应

跟踪内部API的更改并不总是那么容易。 在开发过程中,当每个人都被淹没,有据可查,有针对性的更改仍然可能使API用户感到惊讶。 为了轻松跟踪内部API的更改,某种自动的API响应监视器将很有帮助。 JSON模式 JSON模式定义了JSON响应的模式。 我们使用ajv来验证我们的模式。 为了帮助入门,我建议使用tuts +教程,在这里您可以找到有关JSON Schema的关键功能的出色介绍。 除了本文提到的内容外,我还有一些其他提示: 使用模式生成器-JSON模式非常冗长。 如果您对验证的响应很大,那么手写模式可能非常繁琐。 尝试json-schema-generator。 它仅支持JSON Schema规范的草案4(截至2018年5月6日)。 手动转换为最新草案应易于管理(迁移指南)。 安装ajv的命令行界面(ajv-cli)以通过终端运行ajv。 白名单方法—为了跟踪JSON密钥的添加和删除,我的架构被定义为将现有密钥列表列入白名单。 如果有新密钥或删除了现有密钥,则验证失败。 下面的要点说明了这种方法。 您可以安排测试每小时进行一次(如果您注册付费帐户,则可以进行更高频率的测试)。 我对断言非常满意。 它可以验证API响应,同时可以兼作API状态和性能监视器。 这是一个巨大的安全网!

iOS快照测试用例

“ iOSSnapshotTestCase” FBSSnapshotTestCase教程库Facebook脚本库uber ตัว快照测试用例มันเอาไว้ 快照快照方法renderInContext: UIView对象CALayer对象存储库(参考图像)源代码存储库中的源代码文档显示失败。 ราะ codeอเราเขียน代码ที่เกี่ยวข้องกับUIเยอะมากๆายกรณีทดสอบ(测试用例)ที่เราต้องทำเมื่อสร้าง UIView แล้ว… textราจะรู้ได้อย่างไรว่าตัวอักษร(文本)ที่ใส่เข้าไปเพียงพอในพื้นที่ที่เตรที่ที่เตยมไว้ิ่งโด ดีกับราจะรู้ได้อย่างไรว่ารูปที่เตรียมไว้พอดีกับ图像视图ที่มีให้ Viewราจะรู้ได้อย่างไรว่าสีหรือภาพของ UIView เป็นอย่างไรถ้า状态เปลี่ยนเช่น被选中,突出显示 codeาเราต้องเขียน代码iOSiOS快照测试案例ี่แหละจะมนี่แหละจะมนอน iOSSnapshotTestCase อาสามาถทำได้ Coารติดตั้งผ่านCocoaPods ให้เพิ่ม代码ในกล่องข้างล่างในPodfile target “ชื่อ target (unit) test” do use_frameworks! pod ‘iOSSnapshotTestCase’ end Objectiveาใช้ภาษา Objective-C ให้ใช้ iOSSnapshotTestCase/Core แทนซึ่งจะตัดในส่วนการรองรับภาษา Swift ออกไป อย่าลืมเปลี่ยนชื่อ目标测试นะครับ 2.บอกที่เก็บของไฟล์รูปซึ่งสามารถทำได้3แต่แนะนำให้เพิ่มเข้าไปที่schemaทั้งนี้สามารถกำหนดได้กำหนด2ปลายคือต้นฉบับ FB_REFERENCE_IMAGE_DIR ที่เก็บถ้ามีค่าไม่ตรไม่ตามฉบับ IMAGE_DIFF_DIR สร้างกรณีทดสอบแรก งไฟล์ร้างไฟล์单元测试ที่อยู่ภายใต้目标ของ单元测试โดยให้子类ตัว FBSnapshotTestCase แทนตัว XCTestCase กใช้ FBSnapshotVerifyView ยกใช้方法FBSnapshotVerifyView ในการทดสอบ recordา recordMode = true […]

快速提示:基于闭包的CollectionType API

我们每天处理数据集合,无论它们是字典,数组还是集合。 使用集合会导致很多样板工作: for-in语句,临时存储变量和许多代码行。 Swift引入了一组新的,基于闭包的功能性API,用于处理集合。 这些方法减少了样板代码,有助于突出显示重要信息并提高可读性。 这些方法也是可链接的,因此您可以轻松组成高级逻辑。 核心方法 forEach(_:) 这是一个简单的迭代器,它以与for-in相同的顺序调用self每个元素的闭包。 [“ a”,“ b”,“ c”,…,“ z”]。forEach { print(“ \(element),“) } //打印:a,b,c,…,z, map(transform:) 这将返回一个Array,其中包含将转换映射到self的结果。 let upperCaseLetters = [“ a”,“ b”,“ c”,…,“ z”]。map { 返回element.uppercase } // upperCaseLetters为[“ A”,“ B”,“ C”,…,“ Z”] filter(predicate:) 这将返回一个数组,其中包含满足提供的谓词的self的有序元素。 let元音= [“ a”,“ b”,“ c”,…,“ z”]。filter { 返回元素==“ a” || 元素==“ e” || 元素==“ i” […]

回到学校

沃尔沃aprender aprender Decidícomenzar明显的应用程序。 y como cualquier newbie mesumergíen Google haciendo lasbúsquedasmásobvias 您可以在任何情况下,从任何地方获得房地产担保,并以书面形式获得任何信息。 苹果公司的iTunes开发人员:iTunes开发人员,苹果公司的发展史,斯坦福大学的历史博物馆,苹果公司的发展史,以及iTunes的发展史。 4个诅咒。 Caber Aclarar que esto paramíes a prueba y error,perodespuésde ver algunas clases su Sufácilexplicaciónthinkóque es un buen punto para empezar。 曼彻斯特动机的埃尔斯坦索英格里斯学院。 Ya con esta base para aprender desde cero,me di cuenta queteníaque Organizar misdíassiqueríasacar elmáximoprovcho。 组织化 从视频到视频剪辑,从las tareas y siendo到104个视频片段,由estamos dicien制作,并由al […]

为什么要抽象任何iOS第三方库

如果您有iOS应用,则可能已集成了外部库和工具来帮助您更快地准备好产品。 但是,您的iOS体系结构和快速代码不应依赖于这些库。 与许多iOS开发人员一样,您已经为应用程序实现了外部服务。 它可能是诸如Stripe之类的支付系统,诸如NewRelic或Crashlytics之类的监控工具,也可能是诸如Google Analytics(分析)之类的跟踪平台。 这些工具很棒,但是,现在您必须切换到新服务。 这是否意味着您有数小时来重构方法? 您是否需要重写数百行代码? 如果是,那么这就是我们应该始终为外部服务抽象您的实现的原因。 在此演示中,我将展示如何通过Firebase集成将其切换到Fabric来记录事件。 这种方法包括如何抽象化实现以将第三方库包含到我们的代码中,并使其更易于迁移。 为了准备用于迁移的代码,我们需要抽象一些元素:要发送的事件,记录器,以及可能还需要经理来使所有内容保持单一状态。 假设我们有3个经典事件,分别登陆首页,注册和登录。我的视图可能如下所示 import UIKit import Firebase import UIKit import Firebase class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() FirebaseApp.configure() } override […]

转移iOS应用程序的副作用– iOS开发提示和技巧

当您销售长期开发的应用程序的时候到了,或者您即将接管一个应用程序时,您可能不必担心过渡过程。 尽管Apple已经详细描述了这些步骤,但是您应该在开始过渡之前考虑潜在的后果。 您还应确保该应用程序符合所有条件并符合转让条件 。 最重要的是,该应用程序必须至少具有一个已发布到App Store的版本,并且该应用程序的任何版本都没有使用iCloud权利或Passbook权利 。 备份数据 将应用程序移至新帐户后,旧帐户将不再可用 。 这意味着启动器将丢失有关该应用程序的所有信息,包括元数据,在App Store上可用的日期,定价,销售或下载统计信息。 您应该备份所有这些信息以作记录,因为过渡后将无法取回这些信息。 做好准备 如果您的应用程序使用以下任何功能,则需要执行一些其他操作: 可自动续订的订阅 -如果应用程序使用这种订阅,则可能会验证其有效性(例如后端)。 为了确保收件人在过渡期间能够验证订阅,发起方需要在启动传输之前生成特定于应用程序的共享密钥,并与收件人共享代码,以便他们可以设置自己的验证。 应用传输完成后,收件人应生成一个新的共享机密,以便组织外部的用户不再可以访问它。 Apple Pay-商户ID不会随应用程序一起转移。 只要原始证书有效,交易就继续成功。 在提交更新时,收件人需要生成一个新的商家ID。 钥匙串 -在过渡后提交第一次更新时,您会收到一封电子邮件警告,提示可能会丢失钥匙串访问权限 。 应用转换后,团队ID更改,因此应用标识符从[old-team].pl.brightinventions.app变为[new-team].pl.brightinventions.app ,这导致丢失了钥匙串访问权限。 用户更新他们的应用程序后,它将找不到身份验证令牌并要求重新登录。 钥匙串共享也仅在更新应用程序之前需要继续工作,并且需要替换为收件人创建的钥匙串组。 推送通知 -不会传输用于推送通知的客户端SSL证书,因此收件人需要创建自己的证书并将其上载到其推送通知服务(后端,Firebase等)中。 此外,如果某个应用程序是跨应用程序多人兼容性列表的一部分 ,它将不再与其他应用程序兼容或出现在其他应用程序的列表中。 同样,如果某个应用程序是该应用程序包的一部分,则您将不再能够查看该应用程序包的历史记录。 这需要时间 处理应用程序转移最多可能需要两个工作日。 在此期间,您将无法编辑应用程序元数据,权利,价格和应用程序内购买,因此您应确保在此期间不需要任何紧急更改。 转移应用程序对用户来说并不明显,并且准备充分应该不会以任何方式影响他们。 但是,您应该更新服务条款和数据保护条件,以便它们与新的所有者策略匹配。 将应用程序转移到另一个帐户并不困难,但这需要了解流程并做好一些准备,特别是如果您使用推送通知,钥匙串,Apple Pay,自动续订或当您的应用程序是跨应用程序多人游戏的一部分时兼容性列表或应用捆绑包。 最初发布于brightinventions.pl Mateusz Klimczak着,推动事物前进@ Bright发明 电子邮件Twitter Github Stackoverflow