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

在Swift中使用委托模式重构CNContactPicker UI代码

是通过将代码分离成可重用的组件,以提高代码的可维护性和可扩展性。委托模式是一种设计模式,它允许一个对象在特定事件发生时通知另一个对象,并允许后者对事件做出响应。

在重构CNContactPicker UI代码时,可以使用委托模式来处理联系人选择的结果。以下是一个示例:

首先,创建一个委托协议,用于定义联系人选择结果的回调方法:

代码语言:txt
复制
protocol ContactPickerDelegate: AnyObject {
    func contactPickerDidSelectContact(_ contact: CNContact)
    func contactPickerDidCancel()
}

然后,在CNContactPicker的实现中,添加一个委托属性,并在适当的地方调用委托方法:

代码语言:txt
复制
class ContactPickerViewController: UIViewController {
    weak var delegate: ContactPickerDelegate?

    func showContactPicker() {
        let contactPicker = CNContactPickerViewController()
        contactPicker.delegate = self
        // 显示联系人选择器
        // ...
    }
}

extension ContactPickerViewController: CNContactPickerDelegate {
    func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
        delegate?.contactPickerDidSelectContact(contact)
    }

    func contactPickerDidCancel(_ picker: CNContactPickerViewController) {
        delegate?.contactPickerDidCancel()
    }
}

接下来,在使用联系人选择器的地方,实现委托方法来处理选择结果:

代码语言:txt
复制
class MainViewController: UIViewController {
    // ...

    func showContactPicker() {
        let contactPicker = ContactPickerViewController()
        contactPicker.delegate = self
        contactPicker.showContactPicker()
    }
}

extension MainViewController: ContactPickerDelegate {
    func contactPickerDidSelectContact(_ contact: CNContact) {
        // 处理选择的联系人
    }

    func contactPickerDidCancel() {
        // 处理取消选择
    }
}

通过使用委托模式,可以将联系人选择的逻辑从主视图控制器中分离出来,使代码更加清晰和可维护。此外,委托模式还可以方便地扩展和修改联系人选择的行为,例如添加额外的处理逻辑或者改变选择结果的处理方式。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

如何使用FindFuncIDA Pro寻找包含指定代码模式的函数代码

关于FindFunc  FindFunc是一款功能强大的IDA Pro插件,可以帮助广大研究人员轻松查找包含了特定程序集、代码字节模式、特定命名、字符串或符合其他各种约束条件的代码函数。...简而言之,FindFunc的主要目的就是二进制文件寻找已知函数。  使用规则过滤  FindFunc的主要功能是让用户指定IDA Pro代码函数必须满足的一组“规则”或约束。...格式将规则存储/加载到文件; 6、提供了用于实验的单独选项页; 7、通过剪贴板选项页之间复制规则(格式与文件格式相同); 8、将整个会话(所有选项页)保存到文件; 9、指令字节的高级复制;  工具要求...文件拷贝到IDA Pro的插件目录即可。...可用规则 代码模式匹配 mov r64, [r3*2 * 8 + 0x100] mov r, [r * 8 - 0x100] mov r64, [r*32 * 8 + imm

4K30

代码重构(二):类重构规则

在上篇博客《代码重构(一):函数重构规则(Swift版)》,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace...在对类进行重构时,也是有一些章法可寻的,本篇博客就结合着相关示例,对类的重构进行相关的介绍。当然本篇博客中使用的实例,还是延续上一篇文章的风格,仍然采用Swift语言进行编写。...说白了就是另一个类创建一个相同的功能的新函数,将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。搬移后,我们可以再使用函数的重构规则对新组的函数进行重构。...关于这两个函数重构的规则的具体细节请参见《代码重构(一):函数重构规则(Swift版)》的介绍。下方截图是对BookCustomer类的charge()函数进行重构后的结果,如下所示: ?...2.使用Hide Delegate进行重构 使用Hide Delegate进行重构的方式是比较简单的,就是People中封装一个方法,方法返回经理的对象即可,这样就隐藏掉了委托关系。

1.3K100

委托与回调函数

这里其实使用了一个同样稀疏平常却广为流传的设计模式——delegate模式。Delegate模式Cocoa开发随处可见的一种设计模式,几乎贯穿于整个Cocoa框架。...尤其是我们最常使用的UIKit,控制各类UI组件的最常用手段就是delegate跟Target-action(目标-动作,类似于一个监听事件)。...虽然Swift委托实现跟协议息息相关,但我在这里不准备过多讨论协议的细节内容,只要知道它类似于其他语言的interface(接口)就可以了,只是Swift的protocol不仅可以被class遵守,...然后ScrollViewCtrl写了一个scrollViewDidScroll方法。这样在这个scrollView滑动的时候就会执行scrollViewDidScroll里面的代码了。...这其实就是一个完整的委托模式了,当然真实的情况下,一般doSomethingWithAdditionalInfo会在某个特定的时机运行delegate.delegateMethod这方法,譬如它可能会是个发送异步网络请求取数据的方法

1.7K30

代码重构(五):继承关系重构规则

当然还是延续前几篇博客的风格,我们博客代码实例依然使用Swift语言来实现,当然还是那句话,使用什么语言无所谓,关键是看重构的场景以及重构的思想。...重构往往伴随着设计模式使用重构系列的博客结束后,我想系统的给大家分享一下关于设计模式的东西。当然是结合着各种实例。...所谓一名Coder,重构和设计模式是必须涉猎的部分,因为这两者可以让你写出更漂亮的代码,当然要想真正的掌握设计模式以及各种重构手法,还得结合不同的实例来进行实践。...将模板函数放到两个类的父类,然后相应的子类只给出实现细节即可。下方代码段是重构后的代码,父类多出的方法就是我们提取的模板函数,而子类只给出相应的实现细节即可。 ?...在这种情况下我们就可以将这种继承关系修改成委托的关系。具体做法就是修改这种继承关系,原有子类添加父类的对象字段,子类创建相应的方法,方法中使用委托对象来调用原始父类相应的方法。

13.5K61

成为一名优秀 Swift 开发人员的 10 个小技巧

使用 Protocol Protocol Swift 可以做很多事情。使用协议,我们可以设计软件组件的行为,使其符合特定的实现。...使用标记 从 Objective-C 开始,我就一直很喜欢标记。当控制器有成百上千行代码时,标记就显得很重要了。使用标签来分割和管理代码非常重要,可以代码快速导航。...开发文档,通知是控制器与模型或服务之间实施通信可同步模式的正确方法,我项目中经常使用 Notification Center,基本上实现了观察者模式,并让应用程序带有更多响应式的元素。...可以使用观察者模式实现许多关键功能,我发现它非常有用。该方法非常简单,且大多数操作都可以用一行代码进行编码,使用 target 和 user info 来传递所有数据。...此外, UI 元素上使用 tag 来标识它们,而不是使用其标题或其它内容来区分。 结论 我没有提到所有基本的 OOP 原则。显然,您必须以正确的方式实现类,封装,抽象和设计模式

2.3K40

平面检测-搜索真实世界的表面

本节,我们将学习如何激活平面检测。我们将熟悉锚点以及如何使用它们将对象放置锚点上。此外,我们将能够现实生活中看到我们发现的飞机锚。从现在开始,我们将更多地投入到代码。...在编程委托是一种设计模式,允许类将其职责委托给另一个对象。换句话说,就像要求别人为你做一份工作。...为了更多地了解Swift的委派,我邀请您访问或查看本书第4章委托部分。 扩展课程 为了保持井井有条,让我们创建一个新文件来托管与ARSCNViewDelegate相关的所有代码。...那是因为我们已经同一个类采用了ARSCNViewDelegate。ViewController.swift文件,将其删除。...公式和图表 重构控制流程 我们继续之前,我想重构if else语句。有一种更好的方式来编写它。我想从这种方式开始,使其更容易理解。另一种选择是使用guard语句。

2.9K30

解锁安卓超能力,丰富插件为所欲为! | 开源日报 No.159

提供了硬件组装教程和快速入门指南 支持 Ubuntu 18.04 + ROS 1 noetic 和 Ubuntu 20.04 + ROS 1 noetic 等系统 包含了用于远程操纵和数据收集的 Python 代码...以及 Fireworks 和 Replicate 支持 Node.js,Serverless 和 Edge Runtime 回调函数可将完成的流式响应保存到数据库(同一请求) vanjs-org/...UI 应用程序。...它只提供了足够使 DOM 操作和状态绑定变得像 React 一样舒适 (甚至更好) 所需功能,并将大部分工作委托给浏览器本身实现的标准 API。...TypeScript 支持:VanJs 对 TypeScript 提供完美支持,只需下载相应 .d.ts 文件即可享受类型检查、智能感知以及你喜欢使用 IDE 环境下进行规模化重构等各种强力辅助功能。

13110

全新Swift从入门到进阶实战探探iOS APP

红/绿/重构循环:遵循红/绿/重构的循环模式14。这意味着你将编写一个不工作的测试(红色),然后使其通过(绿色),最后通过重构简化代码。这个过程有助于保持代码的清晰度和简洁性。...设计有机地发展:决策过程使用运行代码提供反馈14。这种方法允许你开发过程逐步完善设计,而不是一开始就进行彻底的设计和分析。...开发iOS应用程序时,有效地使用Swift和UIKit框架进行用户界面设计(UI设计)是提高开发效率和产品质量的关键。我们可以总结出一些策略和建议。...通过定期进行代码审查和优化,开发者可以确保他们的UI不仅看起来美观,而且运行高效。...同时,利用现有的框架和工具来辅助开发过程,也是提高UI设计质量的重要策略。iOS应用开发,有哪些高级技巧可以提高Swift编程语言的性能?

23910

代码重构(一):函数重构规则

接下来的几篇博文中,我想与大家一块去窥探一下代码重构的美丽,学习一下代码重构的一些规则。当然每个规则中都有小的Demo, 本篇博客以及相关内容的博客是使用Swift语言实现的。...当然,和设计模式相同,重构重要的是手法和思想,和使用什么样的语言关系不大。...有的小伙伴说了,我没有Mac,怎么对你写的Swift代码进行编译呢?这个问题好解决,你可以看我之前发表的这篇博客《窥探Swift使用Web浏览器编译Swift代码以及Swift的泛型》。...下方将会通过一个示例来直观的感受一下Extract Method,当然这些示例不是我原创的,是《重构:改善既有代码的设计》Java示例演变的Swift版,Swift代码时,对原有的示例进行了一些修改...该委托代理对象是为了Discount类访问Account类依赖的数据,下方是第一次重构后的代码。 ?

1.5K50

窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

协议与委托代理回调在之前的博客也是经常提到和用到的《Objective-C委托(代理)模式》和《iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流...说到协议,Objective-C也是有协议的,并且Swift的协议和Objc的协议使用起来也是大同小异的,Java等现代面向对象编程语言中有接口(Interface)的概念,其实和Swift或者...上面使用委托回调主要是使用Swift的协议(Protocol)来实现的。那么如何使用协议来实现你自己的委托回调呢?这将是下面将要介绍的内容。   二....(2)UI就如数所示,为EditViewController关联EditViewController.swift源文件后,再对其上面的使用到的控件进行关联即可。...紧接着我们要实现一个协议,这个协议我们用来所委托回调使用。这个协议可以定义EditViewController.swift源文件协议定义之前,先对什么是协议简单的提上一嘴。

3.3K80

一文读懂Xcode 9 所有更新:全新模拟器,兼容Swift低版本等

代码重构功能增强 这次 Xcode 9 对代码重构功能有较大的提升,首先是重命名功能,在编辑器中点击类名,然后选择 Refactor -> Rename: 这时,重命名的预览界面会直接显示在编辑器:...Swift 低版本兼容 XCode 9 使用 Swift 4 编译器。 这次新的编译器同时可以支持 Swift 3, 这样就不用立即修改项目的 Swift 代码了。...可以项目设置中选择当前 target 使用Swift 版本: Main Thread Checker 顾名思义, Xcode 9 的调试器现在可以检测 UI 操作是否主线程中了。...以往开发的一个常遇到的问题,就是非主线程操作 UI 元素。...,也会高亮显示相应的代码行: 以往这种非主线程操作 UI 的问题很难发现,而且我相信这类问题是大家都会常常遇到的。

1.8K70

Swift 周报 第九期

Swift 服务器上更加强大。...多年来,这已经通过引起混乱上升到主动危害的程度,导致程序员走上错误的道路,一旦他们遇到值级抽象[11]的基本限制[12],通常需要他们重新编写代码。该提案通过使用 any 明确存在类型的巨大影响。...该提案是一系列通过分布式 actor的概念扩展 Swift 的 actor 运行时的提案的第一个,让开发人员不仅可以本地环境,还可以分布式环境利用 actor 模型。...这是问题描述和建议的解决方案 1 类型的存储属性的默认值非隔离上下文中进行评估。这是问题描述和建议的解决方案 不再需要定义一个 actor 的委托初始化器时候加上 convenience 关键字。...使用此功能,用户可以 --static-swift-stdlib 调用 SwiftPM 命令(或长格式 -Xswiftc -static-stdlib)时设置标志,以便将 Swift 运行时库静态链接到程序

85620

肘子的 Swift 周报 #027 | 苹果助你成为一日“百万富翁”

前一期内容|全部周报列表 原创 @State 魅影:一个多窗口模式下 SwiftUI 应用的 Bug 分析[4] Fatbobman( 东坡肘子 )[5] 本篇文章,我们将探讨一个影响多窗口模式下...近期推荐 SwiftLog 和 OSLog:选择、使用以及坑[6] 王巍 (onevcat)[7] 日志工具对开发者至关重要,它们调试和维护上线应用扮演着提供即时且精确信息的角色。...本文中,Ryan Ashcraft 详细介绍了他如何将一个单体架构重构为超过二十五个 Swift 包的过程,包括这一过程遇到的挑战和必须作出的权衡。...重构的结果令 Ryan 非常满意,尽管应用的包大小有所增加,但构建性能和 SwiftUI 预览方面均获得了显著提升。他希望这篇文章能为其他开发者进行类似重构时提供启示和帮助。...通过分享其 IronIQ 项目中的亲身经历,作者详细阐述了为支持使用 Swift 包管理器(SPM)和复杂的数据堆栈配置 Xcode 预览环境的步骤和策略。

10210

iOS基于协议的路由设计

一、背景 前段时间对我们自己的App做了结构上的重构,抛弃了之前简单的MVC开发模式,原因是随着App的业务线越来越多,单个页面的功能越来越复杂,MVC开发模式导致整个Controller-layer的代码越来越多...本文将分享重构的Router模块。...: //注册某个页面路由的url地址 [URLRouter registURL:@“Desination” handler:^(NSDictionary * userDic){ }; //使用路由 [...findService:@protocol(***service)]; 这种设计方案安全性比较高,在编译阶段就可以检测出问题,更适合于swift的设计思想,任何模块都可以使用,包括功能模块,不仅仅局限于...以上就是我们程序实行组件化的一步,随着App容量的增大,组件化是必不可少的一步,它可以让我们的App更规范,模块的重用性更高。 作者:崔晓迪

1.1K20

Swift 项目 - Xib | StoryBoard 多人协作技巧

Storyboard不利图片 一个Storyboard,大量的Controller控制器和Segue连线彰显着错综复杂的UI关系,使人望而生畏或者难以维护。...VC处置 视图的初始样式应尽量Storyboard上属性面板设置,非极特殊情况,布局也应在Storyboard上使用各种约束配合完成。...对于圆角,背景色,阴影等CALayer的样式,应该使用扩展或子类化实例的形式,使用@IBInspectable属性关键字,Storyboard属性面板设定初始样式。...这时可以全局搜素一下 搜出来的结果可以看到,是Main.storyboard上绑定了HomeController,Test.swift文件定义了该类,但是因为改名所以无法找到。...这个方法找不到对应的属性时,就会抛出异常, 这里就是指找不到featuresController属性,通过全局搜索可以发现,代码改了名字, 解决的方法同样是删掉对应的连线或者修改变量名时使用重构 由此可见

2K20

一次炫技差点引发的惨案

),这些 Pod 库中有不少引用 OC(Objective-C,苹果系之前的主流开发语言)的代码 之前的 Xcode ,工程是可以跑起来的,但是最新的 Xcode 15 对编译器等做了大量的的修改导致这些...」 Swift 作为一种新技术,其实还是存在不少坑的,手淘也是 ABI 稳定后才开始项目中引入 Swift 的,这就好比 JDK 22 出来了,但国内大部分还是使用的 Java 8 为什么会出现这种..., 抓主线,跑通主流程,细枝末节之后再看 老项目无法最新的 Xcode 15 上跑主要原因是 Pod Swift 引用了 OC 的类,那我可以先注释这些逻辑,等跑通后再看看怎么优化 再比如有个防反编译的第三方库...我发现这个页面其实并不是每个 UI 都是错乱的,只是少数几个 UI 的渲染有问题,那就可以分析一下这几个出问题的 UI 和其他正常显示的 UI weex 的写法有哪些区别,于是经过分析发现是三元运算符还有...text 的写法有区别,经过改造,问题就解决了,相比于使用 H5 来重构的时间,这点时间几乎可以忽略不计

10710

浅谈iOS架构的技能栈

Objective-C Swift 工具使用 IDE 编译调试 版本管理 产品设计 SDK使用 常用模块 基础组件 常用业务模块 编译打包 版本适配 第三方SDK...代码优化 架构和重构 组件化和模块化 UML基本功 设计模式 接口设计 架构模式选型 重构 质量和稳定 质量稳定性指标 CI和代码监控 Crash 测试 兼容性测试...设计模式、接口设计、架构模式 设计模式是指,实现业务逻辑时,代码逻辑的目标和实现模式,例如:MVP,MVVM,MVC等....推荐书籍: 设计模式精解-GOF23种设计模式机械 设计模式:可复用面向对象软件的基础 大话设计模式 重构 重构分为两种:代码重构和架构重构,大家可以参考重构:改善既有代码的设计进行学习. ---- 代码质量...你是否有想过,你到底是开发一款应用,还是像一名流水线员工搬运代码,完成绩效?

2.3K71

代码重构(三):数据重构规则

代码重构(一):函数重构规则(Swift版)》和《代码重构(二):类重构规则(Swift版)》详细的介绍了函数与类的重构规则。...本篇博客延续之前博客的风格,分享一下Swift语言中是如何对数据进行重构的。对数据重构是很有必要的,因为我们的程序主要是对数据进行处理。...本篇博客中将会结合着Swift代码实现的小实例来分析一下数据重构的规则,并讨论一下何时使用那些重构规则进行数据重构。...这和单例模式又有一些区别,单例就是一个类只能生成一个对象,而“将值对象改变成引用对象”面临的就是类可以创建多个对象,但是这多个对象程序是唯一的,并且某一个引用点修改对象的属性时,其他引用点的对象值也会随之改变...在上述UI代码,我们很清楚的看到后两个函数,也就是calculate()与stringToInt()函数是数据处理的部分,只依赖于数据,与UI关系不是很大,所以我们可以使用复制“被监测数据”规则将该段业务逻辑代码进行提取重构

1.2K60
领券