如何在Swift类相邻方法中访问回调函数以返回联系人选择结果
你需要先在类内定义存储属性保存回调函数,再在代理方法内调用,完整修改逻辑如下:
修改步骤
- 第一步:在
ContactsPicker类中声明可选类型的回调存储属性,用来暂存open方法传入的回调 - 第二步:在
open方法接收回调参数时,将参数赋值给类的回调属性 - 第三步:在
contactPicker代理方法中拿到选中的联系人后,调用存储的回调回传结果,调用完成后将回调属性置空避免内存问题 - 补充:需要额外实现用户取消选择的代理方法,同样触发回调回传空值或错误提示
完整修改后的代码
import Foundation import UIKit import ContactsUI @objc(ContactsPicker) class ContactsPicker : NSObject, CNContactPickerDelegate { // 新增:定义存储回调的可选属性 private var contactSelectCallback: RCTResponseSenderBlock? @objc static func requiresMainQueueSetup() -> Bool { return false } @objc func open(_ options: NSDictionary, callback: @escaping RCTResponseSenderBlock) -> Void { // 把传入的回调存到类属性里 self.contactSelectCallback = callback DispatchQueue.main.async { self._presentContactPicker(options: options) } } func _presentContactPicker(options: NSDictionary) -> Void { let contactPickerVC = CNContactPickerViewController() contactPickerVC.delegate = self let controller = RCTPresentedViewController() controller?.present(contactPickerVC, animated: true) } func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) { print("+++++++++++++++++++++++++++") print(contacts) print("+++++++++++++++++++++++++++") // 调用存储的回调回传结果,按照RN原生模块回调规范,第一个参数传错误(无错误传nil),第二个参数传选中的联系人数据 contactSelectCallback?([nil, contacts]) // 回调用完置空,避免循环引用 contactSelectCallback = nil picker.dismiss(animated: true) } // 新增:处理用户取消选择的情况 func contactPickerDidCancel(_ picker: CNContactPickerViewController) { // 回传取消提示,也可按业务需求自定义返回值 contactSelectCallback?([NSError(domain: "ContactsPicker", code: -1, userInfo: [NSLocalizedDescriptionKey: "用户取消选择联系人"]), nil]) contactSelectCallback = nil picker.dismiss(animated: true) } }
注意点
- 你之前尝试赋值不生效大概率是没有在类内提前声明
callback对应的存储属性,局部赋值不会被类保留到代理方法调用的时机 - RN的原生回调
RCTResponseSenderBlock默认接收一个数组作为参数,数组第一个元素是错误对象,第二个是返回的业务数据,遵循该格式才能在JS侧正常接收结果
内容的提问来源于stack exchange,提问作者Trevor
相关产品推荐
相关产品推荐

