iOS开发 - 委托(Delegates)
封面图
•
2025-11-27
•
iOS开发
0
0
0
0
在 iOS 开发中,**委托(Delegate)** 是一种非常常见的设计模式,用于实现对象之间的通信。它允许一个对象将某些任务或事件的处理交给另一个对象(即“委托”),从而实现松耦合的设计。 --- ## 📌 一、什么是委托(Delegate)? **委托** 是一种通过接口(协议)来实现对象之间通信的方式。一个对象可以定义一个委托属性,当某个特定事件发生时,它会调用这个委托对象的方法。 > ✅ 举个例子:`UITableView` 的数据源和代理就是典型的委托使用场景。 --- ## 📌 二、委托的基本结构 ### 1. 定义协议(Protocol) ```swift protocol MyDelegate: AnyObject { func didSomething() } ``` - `AnyObject` 表示该协议只能被类类型遵循(避免值类型问题)。 - `func didSomething()` 是委托方法,供其他对象调用。 --- ### 2. 声明委托属性 在需要使用委托的对象中声明一个 `delegate` 属性: ```swift class MyClass { weak var delegate: MyDelegate? func doSomething() { // 执行一些操作... delegate?.didSomething() } } ``` - 使用 `weak` 避免强引用循环(retain cycle)。 - `delegate?` 表示如果 delegate 为 nil,不会 crash。 --- ### 3. 实现协议 在另一个类中遵循协议并实现方法: ```swift class MyViewController: UIViewController, MyDelegate { let myClass = MyClass() override func viewDidLoad() { super.viewDidLoad() myClass.delegate = self myClass.doSomething() } func didSomething() { print("Delegate method called!") } } ``` --- ## 📌 三、常用场景(iOS 中的委托) | 控件/类 | 委托协议 | 功能 | |--------|----------|------| | `UITableView` | `UITableViewDelegate`, `UITableViewDataSource` | 管理表格视图的显示和交互 | | `UITextField` | `UITextFieldDelegate` | 处理文本输入事件 | | `UIImagePickerController` | `UIImagePickerControllerDelegate` | 处理图片选择结果 | | `UIScrollView` | `UIScrollViewDelegate` | 监听滚动事件 | --- ## 📌 四、委托 vs 闭包(Closure)的区别 | 特性 | 委托(Delegate) | 闭包(Closure) | |------|------------------|-----------------| | 语法 | 协议 + 强类型 | 函数式编程,灵活 | | 可读性 | 更清晰,适合大型项目 | 简洁,适合小逻辑 | | 复用性 | 可复用多个对象 | 每个对象独立 | | 适用场景 | 通用接口、多对象共享行为 | 一次性回调、简单逻辑 | --- ## 📌 五、Swift 中的委托写法(推荐) ```swift // 定义协议 protocol MyDelegate: AnyObject { func didAction() } // 使用委托 class MyClass { weak var delegate: MyDelegate? func triggerAction() { delegate?.didAction() } } // 实现协议 class ViewController: UIViewController, MyDelegate { let myObject = MyClass() override func viewDidLoad() { super.viewDidLoad() myObject.delegate = self myObject.triggerAction() } func didAction() { print("Delegate method called.") } } ``` --- ## 📌 六、常见错误与注意事项 1. **忘记设置 delegate**:导致方法不执行。 2. **强引用循环(Retain Cycle)**:使用 `weak` 关键字修饰 delegate。 3. **协议未正确继承**:确保遵守了 `AnyObject` 或使用 `class` 关键字限定协议。 4. **nil 值判断**:使用 `delegate?` 调用方法,避免 crash。 --- ## 📌 七、总结 | 内容 | 说明 | |------|------| | 委托 | 一种对象间通信机制,常用于 iOS 开发 | | 协议 | 定义委托方法的接口 | | 优点 | 松耦合、可复用、易维护 | | 缺点 | 代码量略多,不如闭包简洁 | --- 如果你正在学习 iOS 开发,理解委托是掌握 MVC 架构和高级控件(如 `UITableView`、`UICollectionView`)的关键之一。欢迎继续提问!
上一篇:
iOS开发 音频和视频(Audio & Video)
标题录入,一次不能超过6条
留言
评论