Tag: 委托

以相同的功能组合委托和块

在我正在从事的项目中,我们将代码分配拆分为多个小模块(框架),其中一个用于请求唯一标识符(在服务器端生成),该标识符将在每个API请求中使用,但在某些情况下,用户必须输入密码才能生成该唯一代码,因此该模块需要在用户界面中填充一些内容,但是如何获取呢? 因为我无法向您显示我们的代码,所以我创建了一个项目以将信用卡保存在本地钥匙串中,如果找不到卡,我们将要求用户按照以下UML序列图的说明将卡的详细信息提供给我们: NS通知 我讨厌通知,它们很难调试,并且增加了代码的复杂性。 如果我们想使用它们来解决问题,我们将至少需要3条通知,这太丑陋了! 代表 委托可以是一个解决方案,但是问题在于“进行结帐”是基于区块(异步http请求)的,因此,如果我们在钥匙串中未找到信用卡,我们将取消该请求。 委托+块(或Swift中的闭包) 这是我自带的解决方案,而不仅仅是使用委托,而是在委托函数中添加了一个完成块: func creditCardNeeded(错误:NSError,完成:@转义(_ creditCard:Dictionary )->无效); 此功能的第一部分是告知代表我们需要信用卡。 第二部分(关闭部分)将用于将信用卡详细信息从用户界面发送回框架。 是时候查看完整的代码🙂 根视图控制器ViewController 在这里,我们开始结帐过程(payAction是起点)。 请注意,我们保留了要使用的闭包的引用( self.cardCompletion = complete )。 2. CardDetaildViewController 该视图控制器将用于让用户填写卡的详细信息。 3. PaymentManager:框架类 在这里,我们使用委托功能开始请求或要求提供卡详细信息。 这里的主要问题是,当用户验证其卡详细信息时,我们将使用闭包引用返回框架并继续执行任务! 您可以在github上找到完整的代码:https://github.com/Red-Mak/RMDelegateWithCompletion

代表团

佩基,代表尼迪尔? “代表,贝利里·比尔·奥莱·奥尔杜恩·unda·比尔·内斯宁宁·巴斯卡·比尔·内斯尼·哈伯·贡德梅西内·奥拉纳克·坦尼扬·比尔设计模式’dır’。” Bir A nesnesini hayal edin。 Bir eylemigerçekleştirmekiçinB nesnesiniçağırır。 Eylemtamamlandığında,一个nesnesi B’ningörevitamamladığınıve gerekli eylemigerçekleştirdiğinibilmelidir。 BuişlemRepresentative’lerin院子里的孩子! Sizlere buolayıbirörnekleaçıklayayım: 2yaşınızdaolduğunuzuhayal爱丁。 Yemek yemeyi buyaştabilemezsiniz,buyüzdenannenizinyardımınaihtiyacınızvardır。 Yemek yapabilen bir anne Annoluşturmadanönce,Anneninnasılyemekpişirileceğinibilmesi gerekiyor。 协议YemekPisirme { func yemekYemek() } Şimdi,“ YemekPisirme”protokolüneuyan bir anneyapısıoluşturalım: struct Anne:YemekPisirme { func yemekYemek(){ //Protokolümüzdekifonksiyonumuzayazıekledik。 打印(“ Pizza geliyor !!”) } } 我的名字是:安妮·内西内西(Omşturalım): // Anne NesnesiniOluşturma var anne = […]

设计模式:IOS应用程序开发

在移动应用程序开发中,有很多工作是从应用程序的一部分委派给另一部分的。 假设,当在UI上点击一个按钮时,将触发另一个视图。 所有这些都是通过委派进行的。 IOS为我们提供了各种设计模式来处理事件的激活。 提供的设计模式类型包括“关键价值观察”,“通知中心”,“委派”。 关键价值观察(KVO) 让我们以银行应用程序为例,如果余额为正,则当前余额为绿色,如果余额为负,则余额为红色。 为此,在存款和取款期间余额值发生更改时,需要通知视图控制器。 使用KVO,我们可以注册以通知其他对象的特定属性更改。 注意事项: 如果要向对象A通知对象B某些属性的更改。 1. B中的特定属性应使用setter来更改其值。 2.对象A必须注册为特定密钥路径(属性)的对象B的观察者。 3. A类必须实现方法ObserveValueforKeypath。 此方法必须指定如何处理更改的值。 对于银行应用程序,Account类应具有属性的设置方法:当前余额。 视图控制器必须注册为属性:当前余额的帐户对象的观察者。 最后,视图控制器类必须实现如下的ObserveValueforKeypath方法。 通知中心: 通知中心是IOS提供的功能,可以使用该中心将信息广播到注册的对象。 NSNotificationCentre是一个单例类,通过该类,不同的对象可以将自己添加为观察者,并收到所需的通知。 在以上示例中,对象将自身作为观察者添加到NSNotificationCenter中,用于通知类型:UIDeviceBatteryLevelDidChangeNotification。 收到UIDeviceBatteryLevelDidChangeNotification时,会触发BatteryLevelChanged函数。 代表团: 代表们帮助我们从一个对象向另一个对象发送消息。 让我们来看一个具有两个视图的简单应用程序。 轻按view1时,view2的背景颜色会更改。 为了做到这一点,它们之间应该进行某种交流,而这正是代表团参与其中的地方。 轻按view1时,会将changeBackgroundColor的工作委托给其注册的观察者,在上面的代码中为对象view2。 当View2类采用ClassView1Delegate协议时,它应实现changeBackgroundColor函数以符合该协议。 以上三种设计模式都或多或少地完成了类似的工作。 但是根据应用程序的需要,应该选择合适的模式。

Swift 4.2中的委派模式

什么是协议? 根据 Apple文档 – 协议定义了适合特定任务或功能的方法 ,属性和其他要求的蓝图 。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 除了指定必须符合标准的类型的要求之外,您还可以扩展协议以实现这些要求中的某些要求,或者实施符合标准的类型可以利用的其他功能。 在SwiftTable语言中开发UITableViewDelegate和UITableViewDataSource基本表视图时,您已经看到了很多次的协议 。 两种协议都有其自己的方法是必需的和可选的。 如果您已经在Apple的框架中看到过。 如果您按命令键( ⌘ )并单击鼠标左键,则在 UITableViewDataSource上 可以看到这些选项– 现在单击“跳转到定义”,您将看到他们的协议方法–

Swift中的委托模式

刚进入软件开发领域,我首先开始学习用Python编写代码,然后再学习Java。 两种语言都是进入面向对象编程世界的绝佳机会。 但是,直到我开始学习Swift时,我才遇到了委托模式。 许多人警告我,由于这是一个新主意,因此可能需要一些时间来学习和习惯。 我准备好自己,看了一些视频,并完成了一些教程,但是第一次遇到一个复杂的话题时,有时会遇到挫折和困惑。 我继续前进,并自信地将其从我要学习的新主题列表中删除。 我以为,如果我在项目中需要它,我已经获得了足够的知识,至少可以查找它并将其轻松集成到我的代码中。 当机会出现在实际项目中使用它时,我很快意识到我对自己的理解并没有我想象的那么好。 此外,我很难找到一种资源来列出所需的代码行以及它们如何在涉及的两个类之间组合在一起。 我再次“打书”(隐喻地,我完全使用了互联网。)并开始了一个过于简单的实践项目,该项目隔离了授权模式,以便在它起作用之前我可以一直使用它,并且我完全理解了概念和用法。 因此,我对所学内容进行了反思。 代表团 简单来说,委托允许两个类进行通信。 从非技术意义上讲,委派(动词)是“将任务或责任委托给另一个人”(《牛津词典》)。 在技​​术世界中,除了对象之外,它是完全相同的。 该项目 我做了一个练习项目,该项目跟踪按下按钮时增加的计数。 我在这篇文章的底部包括了完整的代码,以及指向项目所在的GitHub的链接。 在我解释每个步骤时,请随时跳过或继续进行。 在第一个视图控制器中,我有一个显示计数的标签和一个通过segue移至下一个视图控制器的按钮。 在第二个视图控制器中,我只有一个按钮来更新计数。 在第二个视图控制器中,我可以多次点击“更新计数”按钮。 它将当前计数打印到控制台。 完成后,我可以在顶部的导航控制器中进行回溯,并看到第一个视图控制器中的计数标签已更新。 以下是我在第二个视图控制器上单击“更新计数”五次并返回到第一个视图后的示例。 如果我在不关闭应用程序的情况下再次重复该过程,它将继续从我上次中断的地方开始更新计数,在这种情况下为5。 代码 设置委派模式需要使用几行代码。 这里将扮演三个更大的对象:定义需求的协议,符合协议的类(即委托)和访问属性或调用协议中概述的方法的委托类。 定义协议 对于此示例,需要在两个类之间传递的唯一操作是增加计数器。 协议本身就是对象。 关键字协议是必填项,后跟用户提供的名称以及方括号。 该名称的处理方式与类名或枚举相同,其中首字母大写。 通常,在委托模式中使用时,协议名称将包含单词“ Delegate”以阐明其用途。 在方括号内,我定义了所需的方法。 我使用关键字func来指定我需要一个方法,该方法之后是我为其分配的名称,并带有开括号和闭括号。 协议IncrementCountDelegate { func gainCount() } 如果我的函数要返回某些东西或有参数,我会这样表示: func myFunction(参数:ParameterType)-> ReturnType 在协议中,我可能还需要一个属性,但对于此示例,则不需要。 虽然我知道我的方法gainCount()最终可能会需要一个称为count的属性,但委托类不一定需要了解它,因此我没有在协议中包括它。 以后再说。 但是,如果确实需要包含一个属性,则该属性应如下所示: var myVariable:VariableType {获取设置} 设置关键字 […]

在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. […]

使用Sourcery在iOS中自动生成委托存根

代表们,代表们! iOS喜欢代表。 它们在Apple的大多数框架中都使用过,我对您一无所知,但最终我在自己开发的每个应用程序中一遍又一遍地编写自己的应用程序。 在测试代​​码时,您必须编写许多手动存根和样板来测试调用委托的类,谁愿意编写比他们需要的代码更多的代码! 任何额外的工作都会使测试在整个团队中进行的可能性降低,并且在进行测试时会变得越来越精明。 每当您定义代理人BAM时,Sourcery都可以在此提供帮助。 在下一次编译时,会生成一个存根并将其添加到您的测试目标中,所有内容都会充实并准备就绪。 如果您不知道Sourcery是什么,它是一个元编程工具包,可以“ 扫描源代码,应用个人模板并为您生成Swift代码,从而使您可以使用元编程技术来节省时间并减少潜在的错误。” 这太疯狂了。 这篇文章不是Sourcery的完整介绍(尽管我们将在您的项目中进行设置)。 如果您想查看一个好的介绍,请转到Ray Wanderlich的教程。 它很好地解释了它并引导您完成它。 这是我们将做的一个例子: 代表定义: 协议AutoStub {} 协议OnboardingViewDelegate:AutoStub { func tappedLogin(用户名:字符串,密码:字符串)->布尔 func tappedRegister(用户名:字符串,密码:字符串) } 生成的存根: //使用Sourcery 0.7.2生成-https://github.com/krzysztofzablocki/Sourcery //不要编辑 类OnboardingViewDelegateStub:OnboardingViewDelegate { var namedTappedLogin:Bool = false var称为TappedLoginWithParamUsername:字符串? var namedTappedLoginWithParamPassword:字符串? var tappedLoginReturnValue:布尔? func tappedLogin(用户名:字符串,密码:字符串)->布尔{ self.drawnTappedLogin = true self.CalledTappedLoginWithParamUsername =用户名 self.CalledTappedLoginWithParamPassword =密码 返回self.tappedLoginReturnValue! } var namedTappedRegister:Bool = false […]

Swift:委托示例

implementอย่างการ工具代表แบบง่ายๆในภาษาswift iOSารเขียนโปรแกรมบนiOSมีการใช้代理模式เยอะมากซึ่งมันก็คือ设计模式iOSนiOSตัวอย่างที่คนเขียนiOSต้องคุ้นเคยก็เช่นการใช้TableViewเมื่อเคยชินกับ模式นี้แล้วอยากจะมาลองสร้าง协议implement ก็ไม่ยาก 1,制定协议 Classยนแยกใส่ไฟล์(.swift)หรือเขียนใน类ที่จะเรียกใช้代表ก็ได้✅ 协议messageSenderDelegate { func receiveMessage(消息:字符串) } 2.声明您要呼叫的代表 ับเก็บร้างตัวแปรสำหรับเก็บ类(引用类型)ที่เป็น代表มารอไว้ var委托:DownloaderDelegate! =无 3,在类方法中使用委托 @IBAction func sendMessageButtonWasTapped(sender:UIBarButtonItem){ 委托!.receivedMessage(消息:文本) } 4,在接收类中采用messageSenderDelegate协议 类ViewController:UIViewController,messageSenderDelegate { 5,实现委托方法 func receiveMessage(message:String){ 打印(留言) } 6.最后,设置发送班级的代表 จะ设置ที่代表类หรือ发送类ก็ได้ในที่นี้จะ设置ที่代表 类重写func viewDidLoad(){ super.viewDidLoad() SendingVC = Storyboard?.instantiateViewController(withIdentifier:“ titleView”)为! 发送VC SendingVC.delegate =自我 }

在Swift中通过委托传递数据

我想写一篇直截了当的文章。 直截了当,这样我们就可以看一下本文并知道如何在我们自己的项目中使用委托设计模式来传递数据。 我们走吧。 前提条件 强烈建议您首先阅读有关协议的信息。 您不必这样做,但这可能有助于巩固您的理解。 Swift 3中的协议简介 何时 我要说的是什么时候我们想通过委托传递数据。 考虑一下prepareForSegue,然后考虑相反的方向。 如果prepareForSegue指向前方,则委派指向后方。 假设prepareForSegue是从VCInitial到VCFnitial,则委派将是从VCFinal到VCInitial。 这是我们想要使用委托传递数据的时候。 这也是我们马上要做的事情! 设定 打开一个新的Xcode项目,然后随意调用它。 创建两个视图控制器。 将第一个命名为VCInitial,第二个命名为VCFinal。 应该看起来像: 现在将VCInitial嵌入导航控制器。 这样,我们在VCFinal上具有后退按钮。 嵌入后,应如下所示: 大。 现在让我们在VCInitial和VCFinal之间创建一个VCFinal 。 调用segue VCInitialToVCFinal 。 现在在我们的VCInitial 。 我们想使用我们的标识符执行segue。 因此,创建一个按钮并将其连接到IBAction 。 调用IBAction函数btnPerformSeguePressed 。 看起来像: 然后在我们的IBAction内部,使用我们的标识符执行segue。 performSegue(withIdentifier:“ VCInitialToVCFinal”,发送者:nil) 现在为VCFinal创建一个按钮,并将其连接到IBAction 。 称之为btnPassDataPressed 。 半场演出 好的,欢迎收看半场比赛。 我们将回顾当晚的亮点。 好第一件事。 两个View Controller和两个按钮。 关系。 好了,这是半场表演的结尾。 我们现在正在转向协议。 实施委派 仍在VCFinal.swift […]

消息以关闭迅速传递。

大家好,希望大家一切都好。 今天,我将向您展示如何使用闭包进行消息传递。 基本上,我将向您展示如何通过Protocols实现执行自定义行为的替代方法。 我不知道您对闭包有多熟悉,下次我将尝试使用闭包。 现在,对闭包不太熟悉的人可以将其作为更简单的方法或将消息传递作为黑手。 我将尝试使用带有自定义单元格的表格视图示例进行说明。 您可以在下方看到我们要实现的目标。 该视图控制器具有一个表视图,该表视图具有一些名称以及它们前面的一个按钮。 表格视图下方也有一个空白区域。 每次按下按钮,我们都会在此区域执行一项活动。 如您在下面看到的,我们在单击按钮时对名称进行了动画处理。 通常,我们在委托和协议的帮助下执行此操作。 为此,我们必须使用按钮操作方法定义协议。 这样,无需创建自定义协议和委托。 我们需要一个类型为闭包的变量。 你们都在想我在说什么😅。 是的,我们需要一个在其中包含闭包的变量。 见下文 这个名为buttonAction的变量将持有一个不带参数的闭包,并返回void。 我们将其作为可选变量,这样,如果任何一个单元格都没有动作,我们也将能够处理这种情况。 与往常一样,我们将在自定义单元格中为按钮创建IBAction 。 见下文 在表视图的类中,我们将闭包分配给每个单元格的闭包类型对象。 见下文 现在我们已经准备就绪,可以执行了。 但是在此之前,让我解释一下我们实际上在做什么。 在这里,我们正在做一个非常简单的活动来完成我们的任务。 我们正在定义一个变量,它将像通常定义的那样保留一个闭包 。 UILable,UIImage等 我们将为tableView_cellFOrRowAt_IndexPath中的每个单元格在此变量中传递一个可执行的闭包 。 同样,我们设置textLabel和detailTextLabel值。 在单元格类中,我们将发现buttonAction是否分配了闭包。 如果它有一个闭包,那么我们只需要执行那个。 我们已经做到了。 伙计们,这是我在关闭时传递的消息。 就像我一直说的那样,我还在学习,我相信学习与分享 。 您也可以从此链接下载演示项目 。 希望对您有所帮助。 我随时欢迎您提出建议,请至少放下其中一个。 非常感谢。