首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我必须使用协议/委派来让ViewController执行在另一个类中创建的UIButton的操作吗?

在iOS开发中,使用协议/委派来让ViewController执行在另一个类中创建的UIButton的操作是一种常见的做法,但并不是唯一的方法。除了协议/委派,还可以使用闭包(Closure)或通知(Notification)等方式来实现类似的功能。

协议/委派是一种设计模式,通过定义协议(Protocol)来规定一组方法,然后让其他类遵循该协议并实现这些方法。在这种情况下,可以定义一个协议,其中包含一个用于执行UIButton操作的方法。然后,在另一个类中创建UIButton,并将该类设置为委派对象,使其遵循该协议并实现相应的方法。当UIButton被点击时,通过委派将操作传递给ViewController执行。

以下是一个示例代码:

首先,定义一个协议,包含一个用于执行UIButton操作的方法:

代码语言:swift
复制
protocol ButtonDelegate: class {
    func buttonTapped()
}

然后,在另一个类中创建UIButton,并将该类设置为委派对象:

代码语言:swift
复制
class ButtonCreator {
    weak var delegate: ButtonDelegate?
    
    func createButton() -> UIButton {
        let button = UIButton()
        button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
        return button
    }
    
    @objc private func buttonTapped() {
        delegate?.buttonTapped()
    }
}

接下来,在ViewController中遵循ButtonDelegate协议,并实现buttonTapped方法:

代码语言:swift
复制
class ViewController: UIViewController, ButtonDelegate {
    let buttonCreator = ButtonCreator()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = buttonCreator.createButton()
        view.addSubview(button)
        
        buttonCreator.delegate = self
    }
    
    func buttonTapped() {
        // 在这里执行UIButton的操作
    }
}

通过以上代码,当UIButton被点击时,会调用ViewController的buttonTapped方法,从而实现在另一个类中创建的UIButton的操作。

除了协议/委派,还可以使用闭包(Closure)来实现类似的功能。通过在另一个类中创建UIButton时,将一个闭包作为参数传递进去,并在UIButton被点击时调用该闭包。在ViewController中,可以通过闭包来执行UIButton的操作。

另外,还可以使用通知(Notification)来实现类似的功能。在另一个类中创建UIButton时,可以在UIButton被点击时发送一个通知,然后在ViewController中监听该通知,并执行相应的操作。

总之,协议/委派是一种常见且灵活的方式,用于实现在另一个类中创建的UIButton的操作。但在实际开发中,根据具体情况可以选择适合的方式来实现相同的功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS开发·runtime原理与实践: 关联对象篇(Associated Object)(应用场景:为分类添加“属性”,为UI控件关联事件Block体,为了不重复获得某种数据)

本文中,第一节将介绍关联对象及如何关联对象,第二节将介绍关联对象最常用一个实战场景:为分类添加属性,第三节将介绍关联对象另一个很重要实战场景:为UI控件(比如,UIAlertView以及UIButton...因为在分类 @property 并不会自动生成实例变量以及存取方法,所以一般使用关联对象为已经存在添加 “属性”。...当用户按下按钮关闭该视图时,需要用委托协议(delegate protocol)来处理此动作,但是,要想设置好这个委托机制,就得把创建警告视图和处理按钮动作代码分开。...3.2 UIButton 除了上述UIAlertView,这节以UIButton为例,使用关联对象完成一个功能函数:为UIButton增加一个分类,定义一个方法,使用block去实现button点击回调...关联对象:为了不重复执行 有时候OC中会有些方法是为了获取某个数据,但这个获取过程只需要执行一次即可,这个获取算法可能有一定时间复杂度和空间复杂度。那么每次调用时候就必须得执行一次

2.6K20

Protocol与Delegate 使用方法详解你要知道KVC、KVO、Delegate、Notification都在这里

、Notification 区别及相关使用场景 Protocol与Delegate 使用方法详解 protocol协议类似于Java接口,规定一系列实现应该遵守方法,OCprotocol协议远没有...,所以如果有必须要子类实现方法应当使用protocol协议来定义,举个协议例子: #import @protocol Flyable <NSObject...Java一样,不支持多重继承,只支持单继承,OC协议protocol与Javainterface接口一样,支持多重继承,在定义protocol协议时最好其继承NSObject协议,否则无法使用...,类似于泛型语法,在定义协议时,支持required关键字标识遵守协议必须要实现方法,而optional关键字标识遵守协议可选实现方法。...接下来就叫介绍代理模式也称为委托模式delegate,代理模式顾名思义就是其他代理当前来执行一些任务,实现方式就是要依托协议protocol,定义一系列方法,如果某个对象想成为其代理则需要去实现该协议方法

1K90

Swift基础语法(四)

,用于协议(protocol)限制相关类型: //限定遵循该协议代理者必须是UIView或者其子类类型 protocol TestProtocol { func eat() -> Self...Swift没有原生KVC概念,但是可以利用KeyPath来间接地实现KVC。 如果要使用KeyPath,则必须继承自NSObject,否则不能用。...我们在使用OC时候可以使用KVC、NSJSONSerialization实现JSON转Model;在Swift4之后,我们使用Codable协议,通过编解码操作实现JSON与Model之间互相转换。...这个提示大意是:添加这个文件会创建一个Swift和OC混合项目,你是否希望Xcode自动配置一个桥接头文件来两种语言文件相互可见?...Swift完整形式是:“命名空间+名”,我们可以尝试在打印当前来查看一下完整名字: class ViewController: UIViewController { override

3.9K20

自定义转场详解(一)

这里有两个注意点: 因为此处使用了segue,所以在ViewController按钮点击时候,我们只需要这样调用就行。...创建一个叫做PresentAnimation继承于NSObject并且实现了UIViewControllerAnimatedTransitioning协议。...开发者在做自定义切换效果时大部门代码会是用来实现这个协议,这个协议只有两个方法必须要实现: // 返回动画时间 - (NSTimeInterval)transitionDuration...所以,一个比较好地方是直接在主控制器ViewController实现这个协议。...外部类可以看到传入手势dismissVC入口。 既然传入了这个需要手势dismissVC,我们就需要保存一下,方便当前在其他地方使用,所以我们新建一个属性来保存这个传入VC。

91620

iOS block结构简单用法 原

: void (^myBlock)(); 其中第一个void是返回值,可以是任意类型,中间括号^后面的是这个block变量名字,把它命名为myBlock,最后一个括号是参数,如果多参数,可以写成如下样式...,会访问到block自己拷贝那一份变量,它是在block创建时候创建,而访问加了这个关键字变量,则会访问这个变量地址所对应变量。...3、一点点扩展 由此,我们可以理解,如果block操作对象是指针,那么直接可以进行修改,这包括OC对象,如果不是,则需要用__block关键字修饰。...而添加__block对象不会被retain; 注意:如果我们访问成员变量,或者通过方法来访问对象,那么这些对象不会被retain,而对象会被return,最常见时self: typedef ...,ViewController2,ViewController3; 1、在ViewController1创建一个按钮,跳转ViewController2 2、在ViewController2: #import

56330

【 iOS 应用开发 】 UIKit 控件 ( UIView 属性 | storyboard 设置 | 模拟器 | 拖线关联 | tag | 软键盘操作 | 颜色值 | 代码生成控件 | 动画设置 )

: 选中界面 View Controller 元素, 然后去 属性面板 对应 面板, 其中 Class 属性就是设置其对应 代码, 这里是 ViewController.h 和 ViewController.m..., 一个现实 Main.storyboard 界面, 另一个现实 ViewController.h 代码界面, ② 将鼠标指针移动到 ViewController.h 界面按钮点击方法前圆圈...属性并关联界面 : 同上面的操作, 在创建第二个属性, 关联 ViewController.h 属性与 Main.storyboard 属性; 4.创建 Label 属性 并关联界面 :...为 1 和 2 ; 5.方法关联 : 将两个按钮都关联到同一个方法上 , 注意这个方法必须能获取到按钮才可以 ; 6.获取 tag : 使用 sender.tag 即可获取 UIButton...] 创建一个按钮, 同时指定按钮类型为 Custom 类型, 一般我们使用按钮类型都是 该类型 ; 每个控件必须设置 frame 属性, 这里使用 CGRectMake 方法创建一个 CGRect

4.7K30

【IOS开发基础系列】UIViewController专题

3 loadView 进行如下操作:         a) 如果你重载了这个函数,你应该自己创建必要views并且将一个非nil值赋给view属性         b) 如果你没有重载这个函数,默认实现会使用...,而是带有一个弹性效果(这里虽然是弹性,但是仅指使用UIView模拟动画,而不设计iOS 7另一个重要特性UIKit Dynamics。...使用其中方法可以为UIView动画添加关键帧动画)     5.在动画结束后我们必须向context报告VC切换完成,是否成功(在这里动画切换,没有失败可能性,因此直接pass一个YES过去)。...但是在初级实际使用我们其实可以不太理会它们,而是使用iOS 7 SDK已经给我们准备好一个现成转为交互式切换而新加:UIPercentDrivenInteractiveTransition。...,这样使用这个(一般是其子类)的话就会非常方便。我们在手势识别只需要告诉这个实例当前状态百分比如何,系统便根据这个百分比和我们之前设定迁移方式为我们计算当前应该UI渲染,十分方便。

41030

Swift:静态工厂方法

同样,这是许多开发人员选择子类化并创建内置视图自定义变体地方,就像这里UILabel一样,我们将使用它来渲染标题: class TitleLabel: UILabel { override...尽管子类化是一项重要语言功能,即使在面向协议编程时代,也很容易将自定义设置与自定义行为混淆。我们并没有在上面的UILabel真正添加任何新行为,我们只是在设置一个实例。...(暂时), //以免将此功能添加到我们应用程序全局使用UIButton。...特别是如果与"Swift:将子视图控制器用作插件" 便捷API稍加修改版本结合使用,我们现在可以在执行异步操作时轻松添加预先配置加载视图控制器: class ProductListViewController...如果您想了解有关此类对象以及通常使用工厂模式其他方式更多信息,请查看"Swift:使用工厂模式以避免共享状态","Swift:使用工厂进行依赖注入"和"Swift: 使用懒加载属性"。

2.4K10

Container ViewController自定义转场控制器。

前言 最近接触到新公司老项目改版。自从来了之后一直在忙另一个项目,也没有看老项目的实现逻辑。 看到设计稿时候,并不是普通树形标签导航样子。大致效果如FaceU主页: ?...第一步,创建项目: 创建一个空demo project,怎么创建就不说了。其他任何选项都不用修改,run下应该有个黑色空白页面。...打开viewController.m创建两个UIButton: @interface ViewController () @property (nonatomic, strong) UIButton *...在`viewcontroller.m引入,并添加如下属性方法: // 记录当前是哪个vc @property (nonatomic, strong) UIViewController *currentVC...到这,大致实现逻辑都已经讲明了。只是代码有点乱。如果要再项目中使用,第一个ViewController就相当于我们主页,然后再主页里写这些逻辑就会把主页弄很臃肿。

69910

KVO简单使用及其实现原理

前言 在应用开发,我们经常需要使用到,观察者模式,能监听某些对象属性变化,进行相应操作。在iOS,OC为我们提供了一套更加简洁优雅观察方式——KVO。...KVO全称Key Value Observing,键值监听机制,由NSKeyValueObserving协议提供支持,NSObject继承了该协议,所以NSObject子类都可使用该方法。...KVO使用 KVO使用非常简单,我们只需要给对象指定属性绑定监听,并设置监听类型。每当我们对指定属性进行读写操作时,就会,OC就会调用observeValueForKeyPath方法。...KVO原理概述 那么,系统是如何实现KVO呢? 其实,每当我们使用KVOaddObserver时,系统会默默地创建一个。我们估且把它叫作:KVO_Person。...然后,系统动态地其继承Person,并添加方法:setName和getName。

1.3K30

对象、消息、运行期--10:runtime关联对象

object身上一个键就对应一个关联对象,所以我们可以给object关联多个对象。类似字典,把关联到object值理解为字典value,这些value通过key来存取。...设置关联对象时用键是个“不透明指针”,在设置关联对象时,若想俩个键匹配到同一个值,则二者必须是完全相同指针才行。鉴于此,存取关联对象用key通常是一个静态全局变量。...添加getter和setter 在category使用 @property添加属性 ,不会生成带下划线成员变量,也不会有setter和getter方法实现,所以我们通过runtime关联对象技术为已经存在添加...,copy) NSString *name; @end #import "Phone+Info.h" #import //定义常量 必须是C语言字符串 static..." #import "UIButton+Base.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad

17710

Runtime再理解

2,实例方法存在于methodList方法存在于元methodList。 实例对象是实例,对象是元实例。...实际上,当你真正理解了Runtime之后,你会发现:“原来真的可以用Runtime解决很多实际问题~” (1)Runtime——使用类目给某个添加属性 (2)通过消息转发防止程序崩溃:Runtime...NSDictionary传入nil时候程序崩溃:当NSDictionary遇见nil 除了上面几种应用,接下来再为大家介绍一种应用——万能跳转。...并不是说在ViewControllerself就是ViewController或者其实例, *该消息给谁发送,也就是说,该消息接收者是谁,那么self就是谁 */ [self...,这个时候,我们进行判断,当在工程找不到对应时候,我会手动新建一个控制器,如下: //1,获取或者创建 const char *clsName = [dataDic[@"class

61820

100行代码搞定短视频App,终于可以和美女合唱了。

之前做本地视频上传时候有一个叫Join是用来前后拼接视频,没想到里面竟然还有个分屏接口,研究了一番终于弄清楚了他使用方法。在此记录方便回顾,也和大家一起分享下。...大概思路是这样 在界面上放两个View, 一个用来播放,一个用来录制 再放一个按钮和进度条来开始录制和显示进度 录制与源视频相同时长后停止 把录好视频与源视频左右合成 预览合成好视频 先来开始工程创建...[1创建工程]按照文档里工程配置加上需要库[4配置Framework] 因为要录像,所以我们需要相机和麦克风权限,在Info配置一下增加以下两项 Privacy - Microphone Usage...UIView, 配置宽度为superview0.5倍,长宽比16:9 [5放View] 然后加上进度条,在ViewController.m设置IBOutlet绑定界面,并设置好按钮IBAction...这三个协议声明。

34.1K4742

iOS SEL理解与使用

有很多人,认为block推广可取代代理设计模式,其实block并不能取代代理,代理模式可以代码逻辑性更强,更整洁,也会有更高可读性和可扩展性。...相比之下,觉得block更多是取代了选择器@selector。    @selector是什么?...我们要首先明白SEL,SEL并不是一种对象类型,我们通过xCode字体颜色就可以判断出来,它是一个关键字,就像int,long一样,它声明了一种类型:方法指针。其实就可以理解为一个函数指针。...至于SEL应用,相信最广泛便是target——action设计模式了。...我们来简单模拟一下系统button工作原理: 我们先创建一个继承于UIButton: .h文件: #import  @interface Mybutton : UIButton

78740

【 iOS 应用开发 】 UIKit 控件 ( 代码生成控件 | UIView 属性方法 | Storyboard | Bundle | Property List | 动画 | 图片内存优化 )

View 层次 : 注意 该 步骤 必须在虚拟机运行之后才能操作 , 点击下方 Debug View Hierarchy 按钮 , 即可查看 View 层次 ; 3.查看 层次 : 鼠标...代码区域 , 在弹出对话框 输入方法名称 , 选择控件类型 , 选择触发操作 , 选择传入参数 即可生成点击方法 ; // 上一张 图片 - (IBAction)lastImage:(UIButton..., 名不要与其它 文件 重名 , 点击 Next 进行下一步设置 ; 4.设置文件路径 : 在 弹出 对话框 设置代码路径 , 这里直接使用默认值即可 ; 点击 Create 按钮 ,... 作用 : 获取了 NSBundle , 就相当于获取了 Bundle 目录内容 ; 如 下图 内容 ; 2.获取 NSBundle 对象 : 通过 调用 NSBundle mainBundle...PList Root 类型 必须是 Array 类型 ; // 8.

3.6K40
领券