无法找到' ABPeoplePickerNavigationControllerDelegate'的协议声明。

时间:2015-03-25 10:35:57

标签: ios swift delegates addressbook peoplepicker

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

import AddressBookUI
class MyVC : UITableViewController, ABPeoplePickerNavigationControllerDelegate {
}

MyApp-Swift.h:289:42:无法找到' ABPeoplePickerNavigationControllerDelegate&#39 ;;你的意思是' UINavigationControllerDelegate'?

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

4 个答案:

答案 0 :(得分:1)

我需要添加

#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,那么

没有帮助。

答案 1 :(得分:1)

您可以查看我使用的代码here

Pure 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)添加到链接二进制文件中,并使用库我的目标

阶段

adding relevant frameworks

Objective-C项目,带有桥接标题

My Bridging-Header.h:

#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
  • 确保您的目标
  • 中正确引用了您的Bridging-Header

Bridging-Header

  • swift VC代码与上面相同

答案 2 :(得分:1)

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

typealias ABRecordRef = ABRecord

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

可能值得提交雷达

答案 3 :(得分:0)

通过@neonacho on Twitter解决了我的第二次问题。而不是ABRecord我必须使用ABRecordRef来编译。不确定为什么迭戈的代码可以工作而不是我的代码。所以它变成了

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

它有效。