用委托机制(delegation)来定制行为

article/2025/8/23 7:58:37

用委托机制(delegation)来定制行为

应用程序的委托是Cocoa最重要的设计模式——委托机制的一个例子。

委托机制的想法在于:一个对象能有单一的委托对象,可以在某些事件发生的时候调用它。从委托的角度来看,这就是某种回调或者通知机制:“在这件事发生时调用我”。从其委托的对象的角度来看,它更像是推卸责任:“我不知道在事件发生时有什么需要做的,所以你来对付它”。

就应用程序委托来说,UIApplicationMain中声明为应用程序委托的对象在各种影响整个应用程序的事件发生时得到回调:在应用程序从主屏幕上开始运行时,当它和一个URL一起被另一个应用启动时(见第26章),在应用程序被警告内存不足时等。这是正式委托安排的一个例子,而这个是由一种Objective-C协议——UIApplicationDelegate所定义的。这个协议像一个正式的Cocoa类那样有它自己的文档页面,但是不同的是它描述了什么时候委托方法会被调用,在被调用时作为这些方法的实现者能够或者应当做些什么,而不是描述一个类的方法怎么工作。对于一个成为应用程序委托的类来说,它需要在它的头文件中声明它实现了这个协议,然后实现所有没有被标记为“可选的(optional)”的方法。

有一些委托协议是我们可以加到Hello User中去的。这能使它的行为更像一个典型的iPhone应用程序。例如,你会注意到在运行应用程序时,在单击了“Say Hello”按钮之后,键盘不会消失,而且Return键什么都不做。这些对iPhone应用程序来说是常见的任务,并且后者需要我们给文本框提供一个委托。

要去掉键盘,你需要告诉文本框放弃它作为“第一响应对象”的角色。第一响应对象的意思是指这个组件能第一个接收到用户的输入。在按钮被触碰时很容易做这个,只须把下面这行代码加到sayHello:的最后。

但是在Return键被按下时,我们又该怎么做呢?这不是一个来自于任何GUI组件的按钮——键盘是由文本框自动提供的——因此似乎没法把一个事件处理方法跟它绑定。可是,如果你去翻阅一下UITextField的文档[8],就会看到它有一个delegate属性,这个delegate属性由UITextFieldDelegate协议所定义,而这个协议是由一组相关联的方法所定义的。查看一下这个协议,你会看到有许多方法用来提醒委托有文本框相关的事件发生。其中一个是textFieldShouldReturn,这个方法看上去像是我们需要的,因为它可以让我们知道用户什么时候按了Return键。

通过在@interface头上紧随本类所扩展的类名称之后的尖括号中指明委托的名称,你可以指明一个对象要实施部分或者全部委托的方法。[9]对我们来说,HelloUserViewController就是一个好的选择,这是因为它已经知道文本框了。因此,编辑HelloUserViewController.h头文件并在尖括号里增加协议声明到类定义上,就声明了该类要实现的委托协议,如下所示。

程序代码:HelloiPhone/HelloUser/Classes/HelloUserViewController.h

现在需要把视图控制器设置成为文本框的委托。可以用代码来做这个,但是既然GUI的其他部分都是在Interface Builder中定义的,同样在IB中设置委托也是有意义的。双击HelloUserViewConroller.xib,在IB中打开它。右键单击文本框,或者用其Connections Inspector,可以看到有一个空的连接叫做delegate。从圆圈连接点拖曳到File's Owner(因为它是被指派为拥有这个nib的对象,因此它代表HelloUser ViewController),这样就声明了HelloUserViewController作为文本框的委托。请在退出IB前确保已经保存。

在视图控制器设置成为文本框的委托后,它就能得到来自文本框的事件驱动回调。现在只须为感兴趣的回调提供实现就行了。

这里是一个简单的方法,用来去掉键盘,可以把它放在HelloUserViewController.m中@implementation和@end之间的任何位置。

程序代码:HelloiPhone/HelloUser/Classes/HelloUserViewController.m

这个方法的签名需要与委托协议中定义的签名完全一致,因此可能要养成从文档中复制并粘贴的习惯,或者如果选择去看头文件,从那里复制粘贴也一样。

如你所见,这个方法由textField(可以假定是nameField,因为这个应用只有一个文本框)被传送到我们常简单地用来传送消息的resignFirstResponder中去。这会通知文本框它不再接收文本输入了(至少在再次触碰之前不会),将使得文本框去掉虚拟键盘。然后我们返回YES,如同协议中规定的那样,按Return键时需要实现其默认行为。

在Xcode中构建并执行程序,输入一些文本,然后按Return键。你会看到键盘消失了(如果没有,请检查有没有在IB中把委托连接到File's Owner,以及方法签名是否完全符合上面的代码)。

这个动作不会更新Hello标签,因为更新的代码在sayHello:中,而它只在单击“Say Hello”按钮时才会被调用到。通常情况下想要同样的代码在按钮被单击和按Return键时都调用到的话,可以把这些公共的功能放入一个辅助方法并在两个事件处理方法中都调用它。

可能你已经注意到了,协议的一个好处是只需要定义感兴趣的那些方法就够了。UITextFieldDelegate的所有方法都是可选的(optional),因此可以忽略掉任何不感兴趣的事件。不过也不总是这样的,一些委托协议声明了必需的方法,编译器会强制你实现它们。但这仍是一种方便的模式,一个重要的东西,你会在Cocoa中一次又一次地看到。


http://chatgpt.dhexx.cn/article/4ktW5eb7.shtml

相关文章

设计模式--委托模式( Delegation)

1、模式定义 委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能。 假设我们有一个 TeamLead 类,将其既定任务委托给一个关联辅助对象 JuniorDeveloper 来完成&#x…

委托(delegation)的使用方法

1,组合和委托 委托是一个对象请求另一个对象的功能,是复用的一种常见形式。 2,委托和继承 3,使用委托的好处 从程序的角度来讲:你就可以把委托看成是用来执行方法(函数)的一个“指针” 通俗的…

线性代数:05 实对称矩阵与二次型

本讲义是自己上课所用幻灯片,里面没有详细的推导过程(笔者板书推导)只以大纲的方式来展示课上的内容,以方便大家下来复习。 本章是特征值与特征向量知识的延续,根据谱定理可知实对称矩阵可以正交对角化,对…

矩阵空间、秩1矩阵

今天要介绍一种新的向量空间,即矩阵空间,之前碰到的所有向量空间,都是n维的实数空间,现在我们将矩阵当成向量,比如说将3*3的矩阵看作向量,这相当于从原来的n维为扩展到n*n维,那么明明是矩阵为什…

【线性代数】详解正定矩阵、实对称矩阵、矩阵特征值分解、矩阵 SVD 分解

前言 本文主要针对线性代数中的正定矩阵、实对称矩阵、矩阵特征值分解以及矩阵 SVD 分解进行总结。 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 正定矩阵 1. 概念 首先正…

【线性代数】矩阵及其特性

【线性代数】矩阵及其特性 写在前面只拉伸不旋转的方向特征值和特征向量相似和对角化正交,对称矩阵 拉伸最大的方向二次型理论从曲线而来合同矩阵正定二次型 参考资料 写在前面 本文是笔者用于复习本科期间所学线性代数,试图用一种更易接受的方式加强记…

对称函数、半正定矩阵(核函数涉及)

一、对称函数 在对称函数中,函数的输出值不随输入变数的排列而改变。从函数的形式中可以看出若输入变数排列后,方程式不会改变。例如对于一个球体.若 φ 为其方位角,θ为其天顶角,r为半径,则大圆距离可以表…

矩阵的秩,特征值和特征向量 矩阵基础概念

矩阵是非常重要而基础的数学知识了。大学课上学线性代数基本就是在学矩阵的各种操作和运算。在深度学习里,几乎所有的参数也都是存放在矩阵中,并通过矩阵来做各种运算。大概把矩阵的基本知识点复习和总结一下。 行列式和矩阵的区别: 行列式和…

c++求矩阵的秩_常见的矩阵分解

矩阵的谱分解(可对角化矩阵——满秩可逆) 谱分解定理:设 为一个n阶可对角化矩阵,A的谱为 其中 的重数为 ,则存在唯一一组s个n阶方阵 ,满足(1) (2) (3) (4) (5) 这些矩阵 称为矩阵A的成分矩阵或主幂等矩阵。一般成分矩阵不一定是Hermite矩阵&a…

线性代数笔记15——矩阵空间和秩1矩阵

矩阵空间 矩阵空间是对向量空间的扩展,因为矩阵的本质是向量,所以与向量空间类似,也存在矩阵空间。 在向量空间中,任意两个向量的加法和数乘仍然在该空间内。类似的,所有固定大小的矩阵也组成了矩阵空间,在…

满秩矩阵与正定矩阵

满秩矩阵 设A是n阶矩阵, 若r(A) n, 则称A为满秩矩阵。但满秩不局限于n阶矩阵。 若矩阵秩等于行数,称为行满秩;若矩阵秩等于列数,称为列满秩。既是行满秩又是列满秩则为n阶矩阵即n阶方阵。 矩阵的秩: 用初…

矩阵转置与矩阵对称性的关系

对称矩阵的定义:对称矩阵是指以主对角线为对称轴,各元素对应相等的矩阵 即的方阵 用两种方式说明矩阵的转置与矩阵自身相乘的结果是一个对称矩阵(S为对称矩阵) 方法一: 假设有3 x 2的矩阵 根据矩阵乘法可知&#xf…

线性代数学习之对称矩阵与矩阵的SVD分解

完美的对称矩阵: 定义: 在上一次线性代数学习之特征值与特征向量 - cexo - 博客园学习了矩阵的特征值和特征向量相关的概念,这次则继续延展上一次的内容,这次则来学习对称矩阵,其标题上加了“完美”俩字,…

实对称矩阵的特征值求法_线性代数之实对称矩阵得相似对角化问题的方法总结...

对于一个实对称矩阵不仅可以通过一个可逆矩阵相似对角化,还可以通过一个正交矩阵来相似对角化。实对称矩阵的不同特征值所对应的特征向量正交,而且实对称矩阵的特征值全为实数。在考研中,我们一定要重点掌握会求一个正交矩阵来相似对角化,这里的正交矩阵是矩阵的彼此正交且…

三阶实对称矩阵的秩一分解(快速计算三阶矩阵特征值特征向量的方法)

定理:三阶实对称矩阵如果存在二重特征根一定可以写成如下形式 其中三个特征值为,,,其中一个特征向量是。根据定义,另一特征向量一定是与和正交的向量。 通过上述方法,可以快速计算出三个特征值和一个特征向…

为什么非零实对称矩阵一定是正定矩阵

从酉相似的角度证明实对称矩阵一定可以对角化,对角化之后对应的二次型一定大于0,因此实对称矩阵一定是正定矩阵。 第一张图说明了一个方阵A必定酉相似于一个上三角矩阵T,T的对角线元素就是A的特征值。且这里可以无论特征值重复与否。 第二张…

矩阵求秩

矩阵的秩怎么计算,这个问题一下子我居然不知道怎么下手。。虽然本科的时候学过线性代数,但是好久不用,很多东西都忘了。。今天略微梳理一下吧。 最简单直观的方法: 化成行最简形(或行阶梯形),然…

搜片源必备

1.入门级 一般的经典、大众类电影,在各大主流视频网站都有。如:腾讯、优酷、爱奇艺、搜狐、乐视等。 2.初级 冷门的、最新的电影,以及一些“非主流”电影,可以通过网盘搜索引擎和一些影视资源网站来获取。 个人推荐的网盘引擎 呆…

各种搜索

搜索 本校的Lazer2001 学长为我们讲了搜索(乱搞) 搜索 基础:位运算 超级基础感觉有点难度?bitset例题:位运算 & bitset 基础搜索 DFSBFS 特殊的搜索方式 双向DFS搜索双向BFS搜索哈希康托展开迭代加深搜索&#xff…

搜索APP

文章目录 目录 文章目录 概要 功能模块图 技术名词解释 架构设计 小结 概要 本项目系统整体实现了登录功能、注册功能,首页页面的搜索功能、首页内容,我的界面中个人信息的增删改查、浏览记录、退出登录功能。 在App中用到Activity、Service组件…