Tag: 代表

第一次感动-Swift代表

星期一,Peter Pan的iOS Swift类的新主题是如何使用委托。 今天,我将向您展示如何使用“ UITextFieldDelegate”中的函数来处理事件。 今天的挑战是设置一个文本字段,规则是我们只能在文本字段中插入10个字符。此外,必须有一个标签来显示我可以插入多少个字符。 因为今天的要点不在情节提要上,所以我直接跳到viewController。 首先,我让类实现UITextFieldDelegate,以便可以在委托中使用函数来处理insert事件。 类ViewController:UIViewController,UITextFieldDelegate { 然后转到情节提要,右键单击鼠标并将委托拖到viewController。 这是我在练习中使用的功能。 func textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replaceString字符串:String)-> Bool {} 现在回到viewController并开始插入代码。 您可以在每一行上看到这些注释。 导入UIKit 类ViewController:UIViewController,UITextFieldDelegate { @IBOutlet弱var countDownLabel:UILabel! @IBOutlet弱var insertTxt:UITextField! let limitCHTs = 10 //设置字符数限制 func textField(_ textField:UITextField,shouldChangeCharactersIn范围:NSRange,replacementString字符串:String)-> Bool { let oldLength = textField.text?.characters.count //在交互之前获取文本长度 let insertLength = string.characters.count //获取插入的文字长度 让newLength = oldLength! + insertLength-range.length //插入后计算文本长度 let isWithinLimit = […]

代表– chandrakant kaski –中

代表 基本上,一个协议,无论谁实现此协议,即授权对象,都将代表另一个对象。 这有助于分离逻辑部分,使其更模块化,而又不违反SRP(单一责任原则),从而使我们的代码更具意义。 例子 : 在不谈太多技术的情况下,我想举一个简单的委托示例,以使问题说明更具意义。 在迅速的世界中也会有一个技术实例。 一般:- 假设您在口渴的同时正在忙于编程,现在您想从厨房取水。 现在考虑可用的选项: 我认为的基本选择是 1-下桌子,带上自己的水。 2-请他人为您带来水。 委托部分到了,这两个都是代表的例子。 现在,根据定义,您将认为第二个意义就是我们已经将给他人供水的工作委托给他人,而现在另一个人将为我做这件事。 我会说是的,委托人的意思是对的,但是现在让我们考虑一下,就像我也可以将工作委托给我自己一样。 为什么更先也可以成为代表团更有意义? 我们应该首选: 好吧,像往常一样,我想说这取决于在某些情况下是否可以使用自我授权,但对于代表团的身份而言却没有意义。 就像我会做的一切。 因此,我宁愿选择第二个人,即我会做我的工作,并告诉另一个人为我做一些工作,而我本可以那样做,但是这就像在打扰自己做需要做的实际工作一样。

TableView / CollectionView单元格的索引

获取选定单元格的索引是一件容易的事,但是我已经看到很多实现都使用非常奇怪的方法来获取选择的实现,特别是在单元格具有许多按钮/动作来获取其索引的情况下。 让我们回到基础,如何获取选定单元格的索引? 通过简单地实现tableview / collection视图委托 func collectionView(_ collectionView:UICollectionView,didSelectItemAt indexPath:IndexPath){}或:func tableView(_ tableView:UITableView,didSelectRowAt indexPath:IndexPath){} 这些是从用户那里进行选择的基本方法,但是如果我在单元格中只有一个按钮该怎么办? 我认为不必担心按钮,使其对触摸没有反应并让上述选择代表为您处理该按钮是不值得的! 但是,如果我想要该特定按钮怎么办? 如果我有多个按钮可以触发业务逻辑中的多个操作? 这就是处理视图中的触摸并将通知它的两种方法的地方:委托和闭包! 我自己发现,闭包是将视图连接到其父级的一种非常不好的方式,而且开发人员往往会忘记使用弱的或未使用的方式,以阻止两个类相互引用,从而容易导致内存泄漏。 因此,我相信代理人提供了更方便,更清晰的方式来轻松显示交互,更易于阅读,修复甚至通过您的应用进行通用。 要使用委托,人们会将indexPath作为变量发送到单元格,因此它知道它在其控制器内的位置,这是一个后果,因为现在视图知道的内容比其应了解的更多。 通过一个简单的函数调用就可以很容易地从管理它的集合/表视图中获取该信息: tableView.indexPath(for:UITableViewCell) 因此,我们为此目的编写一个协议:通过用户交互通知控制器。 协议TableViewCellDelegate:类{func didSelect(_ cell:UITableViewCell,_ button:UIButton)} 集合怎么样? 协议CollectionViewCellDelegate:类{func didSelect(_ cell:UICollectionViewCell,_ button:UIButton)} 这个功能是您在不同单元格中所需的全部功能,现在它返回对单元格的引用以及在其中单击的按钮! 我们添加了类,因此可以在单元格中将其削弱: 弱var委托:TableViewCellDelegate? 将其添加到您的按钮操作中: @IBAction buttonTapped(_ sender:UIButton){委托?.didSelect(自己,sender) } 就是这样,现在使单元格委托引用您的控制器,并由您的控制器进行确认,现在您已经拥有所有选项卡并与表/集合单元格进行了交互! 扩展UIViewController:TableViewCellDelegate {func didSelect(_ cell:UITableViewCell,_ button:UIButton){保护let index = tableView.indexPath(for:cell)else {return} let tag = button.tag}} 在这里,我们确认它的viewController,获取索引,并获取按钮的标签以知道单击了哪个按钮,标签可以轻松地设置为0、1、2,具体取决于您单元格中有多少个按钮/动作。 […]

Swift:委托和协议

与Swift在一起待了将近10天,即将到来的项目。 一切工作都很好,直到出现了“委托和协议”之类的内容,才真正使我难受。 这就是为什么此注释旨在揭示后续回调的基本原理的原因。 由于本文仅供个人使用和注意,因此本文内容非常密集,请随时向我询问详细说明。 1.什么是委托和协议? 简而言之,这是iOS应用程序开发中的一种设计模式,用于处理从一个视图控制器到另一个视图控制器的数据传递。 期。 2.为什么我们在地球上需要委托和协议? 这是一个非常大的问题。 让我们首先回顾一下在Swift中传递数据的传统方法,以掌握全局。 为第一个视图控制器和第二个视图控制器设置两个设置: 第一视图控制器: // ViewController.swift // Segues // //由VuNguyen创建于2018/11/17。 //版权所有©2018 VuNguyen。 版权所有。 // 导入UIKit 类ViewController :UIViewController {var textFromSecondView:字符串? @IBOutlet弱var firstLabel:UILabel! @IBOutlet var textField:UITextView! 覆盖func viewDidLoad(){ super.viewDidLoad() //加载视图后进行其他任何设置,通常是从笔尖进行。 firstLabel.text = textFromSecondView } @IBAction func sendDataForward(_ sender:UIButton){ performSegue(withIdentifier:“ goToSecondScreen”,发送者:self) } 覆盖func prepare(用于segue:UIStoryboardSegue,发送者:Any?){如果segue.identifier ==“ goToSecondScreen” { 让destinationVC = segue.destination作为! […]

Swift中的委托是什么?

5分钟内了解 作为面试中的一个常见问题,委托是一种重要的设计模式,已广泛用于iOS开发中。 但是,它的概念对于初学者可能有点抽象。 您可能已经使用过UITableViewDelegate多次,但仍然不知道如何创建自己的委托协议。 或者,您已经阅读了许多文章和示例代码,但仍然不知道何时实施。 在本文中,我将尝试用通俗易懂的语言来解释这个概念,并帮助您立即理解它。 定义 根据Apple的官方文件, 委托是一种设计模式,使类或结构可以将其某些职责移交给(或委托)其他类型的实例。” 您可以将其与“老板/雇员”关系进行比较。 老板注意到产品中的一些问题,而不是自己解决问题,而是将任务委托给员工来解决。 这就是委托模式的工作方式。 例 因此,让我给您一个简单的示例,说明如何使用它。 想象一下,您有一台智能家居设备,可以控制您的家庭照明系统。 即使您不在家,也可以使用遥控器打开房屋的灯。 这是一个视频,显示我们将要做的事情: 让我引导您完成整个过程。 我假设您已经知道每条步骤说明,并跳过了那些基本内容(按钮,约束设置等)。 OutsideViewController 第11-13行:在其中声明一个名为LightControlDelegate的协议,其中包含函数名称func lightChanged(lighted:Bool) 。 注意,我们不在这里编写函数体。 协议就像老板发送给员工的清单,上面只有命令。 员工是实施它的人; 即,我们将在HomeViewController中编写函数主体。 您将在后面的部分中看到它。 第17行:在OutsideViewController类中,您必须声明一个变量来保存委托。 就像您创建一个接受订单的员工一样。 有人会这样简单地将其命名为“ delegate”: weak var delegate :LightControlDelegate ,但是我更喜欢在其中添加协议名称以使其更具体。 注意:您需要在声明中使用weak var以避免保留循环问题。 此外,您必须将协议类型设置为AnyObject否则编译器会大喊大叫以警告错误。 第24行,第30行:老板决定员工何时开始工作。 在我们的情况下,就是用户点击两个按钮中的每个按钮。 当用户点击“ 打开”时 ,我们将向lightChanged函数发送一个真实值。 另一方面,当用户单击“关闭”按钮时,我们传递错误的值。 HomeViewController 第25行:符合协议。 我们在这里使用扩展来使代码更加井井有条,可读性强。 第25–39行:编写函数体。 我们评估布尔值确实决定了该控制器上应显示哪种背景色和文本。 就像智能家居设备接收到该消息并决定是否应打开灯一样。 Line20:请记住将委托设置为self。 这意味着HomeViewController将成为在LightControlDelegate中接受订单的员工。 包起来 […]

iOS初学者代表

iOS开发的大多数初学者在理解委托人时都有问题。 苹果公司说,委托是一个对象,当另一个对象遇到程序中的事件时,该对象代表另一个对象或与另一个对象协同工作。 为简化起见,委托是一个对象,它允许对象A和对象B使用函数或变量相互通信。 代表由程序中的事件触发(例如,按下按钮)。 让我在一个将数据从自定义视图传输到视图控制器的简单示例中为您解释一下。 让我们从创建一个新的Xcode项目开始; 所以打开Xcode,选择Create a new Xcode project 选择Single View App,然后按Next。 在产品名称字段中,输入DelegateExample,然后按下一步->创建。 好的,现在我们已经建立了一个项目,可以开始了。 现在我们需要创建一个代表对象B的自定义视图。我们的对象A将是View Controller,并且已经由Xcode创建。 因此,要创建自定义视图,请导航到Xcode窗口左侧的项目树,右键单击Delegate Example文件夹,然后单击“新建文件”。 选择Swift文件,然后单击Next。 在另存为字段中输入CustomView,然后按创建 现在,我们将为CustomView创建一个.xib文件。 为此,再次右键单击Delegate Example文件夹,然后选择New File…,但是这次选择View并按Next。 再次将文件命名为CustomView,然后单击“创建”。 现在,您应该在项目树中看到一个CustomView.xib文件,并且应该有一个类似于以下内容的屏幕。 好的,进入代码。 打开您的CustomView.swift文件并为我们的自定义视图创建一个类。 为此,只需在文件中键入此代码即可。 进口基金会 导入UIKit 类CustomView:UIView { } 现在,我们需要在.xib文件的视图中添加一个类。 导航到CustomView.xib,然后在“检查器”选项卡的顶部选择“身份检查器”。在“类”字段中,输入CustomView,然后按Enter。 现在,在屏幕上的某处添加一个按钮和文本字段。 我将像这样将它们添加到屏幕的中央。 现在回到代码,我们需要为文本字段和按钮创建出口。 为此,请将此代码添加到CustomView类。 @IBOutlet弱var textField:UITextField! @IBOutlet弱变量按钮:UIButton! 现在,将插座与.xib文件中视图内部的文本字段和按钮相连。 为此,请再次导航到“检查器”,然后选择“连接”检查器。 您将看到我们刚刚创建的两个出口。 要连接它们,只需在插座名称旁边的圆圈上按文本框和按钮,然后将它们拖放到视图中的文本框和按钮即可。 现在,让我们以相同的方式在View Controller中添加标签。 转到ViewController.swift文件,并将此代码添加到ViewController类中。 @IBOutlet弱var标签:UILabel! 转到Main.storyboard,向ViewController添加标签和按钮,然后使用检查器连接标签出口。 太好了,现在我们已经设置了对象A和对象B。我们的对象A将是ViewController,而我们的对象B将是CustomView。 […]

从封装到协议扩展

假设我们要在Swift中定义一个简单的服务类,如果某些输入为正,则只输出一些输出。 (哇:要求跨度少于2行!) 对象封装 简单地说-容易完成吗? 是的,如果我们不在乎客户端的可扩展性: 使用这种方法,客户端类可以简单地实例化服务,并将doSomething工作委托给它。 非常简单(这很好),但是非常令人讨厌的是,当服务实例本身正在执行工作时,客户端无法干预要执行的输入数据和输出操作。 继承-不错的尝试! 不,继承并不总是我们的敌人。 它确实有(两个?)有效的用例。 但是恕我直言,这不是我们最好的朋友(即使代码确实更短!): 通过仅覆盖需要的内容,客户端可以将实现注入所需的位置。 每当定义时,服务将调用客户端替代而不是其自身的实现。 而且一切都会很顺利,例如,客户端现在不能是自定义的NSView (或UIView ),因为在这种情况下,有必要从所需的Cocoa基类而不是我们的服务中继承它…… 功能编程 哦! 我们正在变得现代化,是吗? 尽管如此,对于Swift而言,我也不认为这也是服务开发人员应该遵循的最佳方法-仅仅是因为这将(可能)需要在客户端开发人员级别上过多的基础设施意识。 确实,我们服务的用户需要执行一些“技巧”(例如,如果要在该处使用客户端状态,则捕获弱者或无主的 自我 ),以确保当他们将自定义闭包传递给我们时,不会在应用程序中引入内存泄漏: 代表和协议扩展 现在我们在说话! 我们最终将有一个真正的解决方案。 不需要继承,也不需要客户端开发人员的ARC知识! 我们只需要: 具有可选扩展名的服务委托协议,以提供我们要使用纯Swift公开的默认实现(即,没有@objc可选成员); 在服务中托管此类委托对象的弱实例或无主实例(尽管要求客户端类型为类,但无需我们的客户端开发人员处理内存管理问题); 并在适用时最终调用委托的(属性和)方法: 一体 最后,让我们看一看适用于我们所有类型客户的服务解决方案:如果喜欢继承,则接受; 否则,人们可以使用函数式编程并传递(设计良好)闭包; 或者,他们可以仅仅依靠(弱)聚集的代表来完成工作;或者 当然,所有这些都是为了防止默认情况下首先出现以下问题: 现在轮到你了。 您不需要上面的(我承认,很丑)多合一解决方案,但是至少您现在可以根据自己项目的需要对其进行调整。 无论如何,我想补充一点,我通常发现它足以支持继承和具有(部分或全部)默认实现的委托,但是有时功能样式也可以很好地工作(当您不希望客户需要在转义它们将通过的闭包)。

协议深入故事

按照苹果的定义, 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 然后,该协议可以由类,结构或枚举采用,以提供这些要求的实际实现。 满足协议要求的任何类型都被称为符合该协议。 作为工作的一部分,我接受了iOS开发人员的面试。 什么是协议? 是我在面试中问的一个常见问题。 许多候选人试图记住上面的定义,并重复一遍。 尽管他们对此进行了努力,但许多人仍无法正确解释。 如果我问一些交叉问题,许多人将无法回答。 在刚开始的日子里,尽管我在应用程序中大量使用协议,但我在向某人解释时也难以正确解释协议。 因此,我正在写此博客,以从最基本的角度讨论协议。 在讨论协议之前,让我们假设Swift中没有协议。 通常我们将如何从一个班级交流到另一个班级? 我们需要为该类创建一个对象。 通过使用该对象,我们可以在该类中调用函数。 这很简单。 现在,让我们从一个示例开始,您已经创建了一个名为Stepper的UIVIew子类,我们需要在项目的多个视图控制器中使用该Stepper。 棘手的是,Stepper需要将视图中发生的更改通知给视图控制器。 因此,如果没有协议,Stepper应该具有视图控制器的对象。 假设有三个控制器使用步进器。 因此,对于所有这些人,Stepper应该具有对象。 然后,只有Stepper才能将消息传递到控制器。 而且,如果您想在另一个项目中使用此Stepper,则再次需要在Stepper中进行更改以兼容新项目中的视图控制器。 实际上,它将非常难以管理。 这就是协议帮助我们在项目中避免这种无意义的代码的地方。 协议有何帮助? 为了通知计数值变化,我们将创建一个带有函数的协议,该函数将通知计数值变化。 现在,我们只需要在Stepper类中为此协议创建一个对象。 var委托:StepperDelegate? 现在,我们将研究视图控制器的实现。 上面的代码指示FirstViewController是UIViewController的子类。 因此,根据继承,通过使用FirstViewController对象,我们还可以调用在UIViewController中声明的public / open函数。 现在,我们将在FirstViewController中添加StepperDelegate协议。 通过在类声明中添加StepperDelegate,我们告诉Stepper该FirstViewController也将包含在StepperDelegate协议中声明的函数的定义。 (在某种程度上,协议是继承的一部分)。 最后,每当计数更改时,Stepper都会使用StepperDelegate协议发送该消息。 协议是应用程序开发中非常有用的东西,如果我们不知道它是如何工作的,也很难解释。 希望您喜欢这篇文章。 编码愉快。

在Swift 3中使用代理的简单示例

当我需要快速学习如何使用委托/协议时,我就了解了他们的高级工作(帮助两个对象相互通信),但是却不了解内部工作原理以及如何在代码中创建它们跟我一样容易 对我来说,我决定做一个简单的项目,用一个视图中的textField中的文本更新一个视图上的标签。 如果您想从头开始,则设置非常简单: 两个ViewController(我将其中一个称为SenderVC,将一个称为ReceiverVC) ReceiverVC是初始视图控制器,顶部带有导航栏,一个导航项和一个UILabel位于视图中心。 导航项应该是SenderVC的序号,SenderVC仅具有文本字段和按钮。 而已! 如果您对此有疑问或想直接委托它,我已经创建了主项目的一个分支作为外壳,其中包含所有UI元素: https://github.com/almusto/GoodOleDelegate/tree/Shell 创建协议: 在我们的SenderVC中,我们要创建如下协议: 在此协议中,我声明了一个函数,任何想要成为我的代理人(在本例中为SenderVC的代理人)都必须实现,并且还要创建一个名为UpdateLabelTextDelegate类型的变量? 它将存储要成为我的委托并遵守我的协议的对象。 之所以将委托设置为可选,是因为如果没有人希望成为SenderVC的委托,则该值将为nil。 成为代表: 现在,我们已经创建了协议,让我们转到ReceivingVC并设置我们的视图以成为SenderVC的委托。 让我们从上到下进行检查。 首先,我们在UIViewController旁边添加了UpdateLabelTextDelegate。 所有这些说明我(ReceiveVC)将遵守UpdateLabelTextDelegate(协议)。 现在,ReceiveVC已经做到了这一点,它现在必须实现功能updateLabelText,您可以看到我们正在执行。 回到开始。 此处的目标是使用SenderVC中的textField文本更新ReceiveVC上的标签。 为此,SenderVC希望在委托者上调用协议函数,并将其textField文本作为参数传递。 有道理吧? 因此,如果进入函数的参数将是SenderVC的textField,我们希望将ReceiverVC上的标签文本设置为该参数。 这是您在上面的updateLabelText函数中看到的。 我们在这里做的最后一件事实际上是当我们选择SenderVC时将ReceiverVC设置为委托。 发送文字: 我们要做的最后一件事实际上是发送文本。 的代码如下: 正如我在一开始所提到的,我们在SenderVC上有一个按钮可以返回到ReceiverVC。 按下按钮是发生魔术的地方,它在代码方面没有太多意义,但是让我们逐步介绍一下它以帮助我们了解发生了什么。 通常,您需要在此处添加一些代码以检查是否确实存在委托,并且textField中是否确实存在文本,但是对于这个简单的示例,我们不需要这样做。 如果您回想起我们连接到SenderVC的最后一步,则将ReceiverVC设置为委托。 因此,我们知道ReceiverVC已经实现了updateLabelText函数。 在这里,我们只是调用委托的(ReceiverVC)的updateLabelText函数,并将该参数传递给textField的文本。 代码的最后一行只是关闭了视图,因此我们可以回到ReceiverVC。 就是这样! 现在,ReceiverVC上的标签应该具有您在SenderVC上的textField中输入的文本。 完成的项目位于此处: https://github.com/almusto/GoodOleDelegate

在您的ViewController中使用多个tableView或CollectionView

曾几何时,我为一个项目编写代码,该项目的第一页中有很多表和集合视图。 我记得我曾经用“容器视图”解决了这个问题,但这是一个错误的决定……。 另一个好用的选择是“滚动视图” ,它很容易实现,但操作起来又费时。 由于委托是一个协议,我认为有一个好的方法…… 协议和代表示例 协议和委托示例–在一个ViewController中使用多委托 github.com 首先创建一个NSObject类,以减少自定义,然后添加要用作超类的所有委托方法。 将Model属性添加到您的类中以进行设置并获取所有要显示的信息。 在我的情况下,数据模型名称为ItemManager。 创建一个dataModel类,并将其分配给您的DataProvider的Model。 自定义所有方法并设置DataModel之后,是时候将类设置为UITableView或UICollectionView的协议了。 使用Techniq的好处还在于您可以在应用程序中使用单元测试,我真的建议您阅读使用Swift 4进行测试驱动的iOS开发–第三版作者:Dominik Hauser博士 使用Swift 4进行测试驱动的iOS开发–第三版– PDF电子书| 现在只要$ 5 使用测试驱动的方法通过Swift 4和Xcode 9开发功能强大的iOS应用 www.packtpub.com