2015-03-25 9 views
0

Dans un projet ayant déjà ObjC, j'ajouter une classe SwiftVous ne trouvez pas la déclaration de protocole pour 'ABPeoplePickerNavigationControllerDelegate'

import AddressBookUI 
class MyVC : UITableViewController, ABPeoplePickerNavigationControllerDelegate { 
} 

MyApp-Swift.h: 289: 42: Vous ne trouvez pas la déclaration de protocole pour 'ABPeoplePickerNavigationControllerDelegate' ; Vouliez-vous dire 'UINavigationControllerDelegate'?

Non, Swift, je veux vraiment dire ABPeoplePickerNavigationControllerDelegate. se demander vraiment ce que je fais mal ici ...

+0

vérifier cette https://developer.apple.com/library/ios/documentation/AddressBookUI/Reference/ABPeoplePickerNavigationControllerDelegate_Protocol/ – Ajumal

+0

Vous pensez que je n'ai pas? J'ai travaillé avec AB Framework depuis 2008 ... Quelque chose est un peu différent dans Swift - et cela n'a probablement rien à voir avec AB mais en général je ne comprends pas quelque chose avec Swift/ObjC. –

+0

il suffit d'importer un nom de fichier rapide MyVC et utilisez simplement votre code ci-dessus et ne mettez pas votre code ci-dessus dans le fichier d'en-tête. –

Répondre

1

je dois ajouter

#import <AddressBookUI/AddressBookUI.h> 

dans mon Briding-Header.h. On pourrait penser que le import dans mon fichier Swift était suffisant. Ce n'était pas.

Cela dit, maintenant j'ai un nouveau problème lors de la mise en œuvre

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

Voici l'erreur suivante:

-Swift.h: 297: 110: un type attendu

Il a un problème avec le type ABRecord en

didSelectPerson:(ABRecord) 

Ne aide pas si j'importe également AddressBook dans l'en-tête de liaison ou le fichier Swift.

+0

whay est-ce que vous ajoutez tout ce stuf dans votre fichier d'en-tête –

1

Vous pouvez vérifier le code que je l'ai utilisé here

projet Swift pur, pas Objective-C impliqué

Pour moi, ce compile bien sans utiliser Bridging-tête

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) { 


    } 
} 

J'ajoute des frameworks pertinents (AddressBook, AddressBookUI) au binaire de liens avec les bibliothèques phase de ma cible

adding relevant frameworks

Objective-C Projet, avec en-tête Bridging

Mon Bridging-header.h:

#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 
  • assurez-vous que votre Bridging-tête est correctement référencé dans votre cible

Bridging-Header

  • code VC rapide est le même que ci-dessus
+0

Avez-vous ObjC dans votre projet ou est-ce directement Swift? –

+0

Ceci est juste un pur exemple de projet Swift que j'ai créé pour tester votre problème. Avez-vous ce problème avec un projet Objective-C? –

+0

Oui. Je mettrai à jour mon post original pour refléter cela. –

0

fixe mes deuxième problème grâce à @neonacho on Twitter.Au lieu de ABRecord j'ai dû utiliser ABRecordRef pour compiler. Je ne sais pas pourquoi le code de Diego fonctionne et pas le mien. Il est donc devenu

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

et cela fonctionne.