You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:36:00