找不到 'ABPeoplePickerNavigationControllerDelegate' 的协议声明

Cannot find protocol declaration for 'ABPeoplePickerNavigationControllerDelegate'

在一个已经有 ObjC 的项目中,我添加了一个 Swift Class

import AddressBookUI
class MyVC : UITableViewController, ABPeoplePickerNavigationControllerDelegate {
}

MyApp-Swift.h:289:42:找不到 'ABPeoplePickerNavigationControllerDelegate' 的协议声明;你是说 'UINavigationControllerDelegate' 吗?

不,Swift,我的意思是ABPeoplePickerNavigationControllerDelegate。真的想知道我在这里做错了什么......

我需要添加

#import <AddressBookUI/AddressBookUI.h>

在我的 Briding-Header.h 中。人们可能会认为我的 Swift 文件中的 import 就足够了。不是。

也就是说,现在我在实施时遇到了一个新问题

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
}

出现下一个错误:

-Swift.h:297:110: 预期类型

中的 ABRecord 类型有问题
didSelectPerson:(ABRecord)

如果我还在 Briding Header 或 Swift 文件中导入 AddressBook 也无济于事。

你可以看看我用过的代码here

纯 Swift 项目,不涉及 Objective-C

对我来说,编译很好不使用任何 Bridging-Header

import UIKit
import AddressBook
import AddressBookUI

class ViewController: UITableViewController, ABPeoplePickerNavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, didSelectPerson person: ABRecord!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {


    }
}

我正在将相关框架(AddressBook、AddressBookUI)添加到 link 二进制文件 我的目标

阶段

Objective-C 项目,带有桥接头

我的桥接-Header.h:

#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
  • 确保在目标中正确引用了桥接头

  • swift VC代码同上

修复了我的 第二个 问题,感谢 @neonacho on Twitter。而不是 ABRecord 我不得不使用 ABRecordRef 来编译。不确定为什么 Diego 的代码有效而不是我的。于是就变成了

func peoplePickerNavigationController(peoplePicker: ABPeoplePickerNavigationController!, 
                                      didSelectPerson person: ABRecordRef!, property: ABPropertyID, identifier: ABMultiValueIdentifier) {
}

而且有效。

FWIW,这在纯 Swift 中与 ABRecord 一起使用但在 Objective-C 兼容性 header 中不起作用的原因是存在 typealias后者显然没有正确翻译回去:

typealias ABRecordRef = ABRecord

https://developer.apple.com/library/prerelease/ios/documentation/AddressBook/Reference/ABRecordRef_iPhoneOS/index.html#//apple_ref/c/tdef/ABRecordRef

可能值得提交雷达