2009-08-08 8 views
0

Je suis un développeur de logiciels expérimenté (principalement C et C++ dans les systèmes embarqués, Linux et Qt pour les interfaces utilisateur). J'ai récemment fait le saut au développement de l'iPhone et j'ai rencontré un problème confus avec UIViewController et presentModalViewController. J'essaye de présenter une boîte de dialogue modale ABPeoplePickerNavigationController mais elle n'apparaît pas.presentModalViewController ne s'exécute pas?

Mon application principale est contrôlée par un objet appelé Controller, une sous-classe de NSObject. J'ai récemment ajouté une sous-classe de UIViewController appelée AddressBookController (à la fois Controller et AddressBookController sont déclarés dans ma NIB).

J'ai cette fonction dans le contrôleur qui utilise un IBOutlet pour appeler une fonction dans AddressBookController (Juste une note de côté, je suis conscient que passer 'expéditeur' n'est probablement pas correct - quelle est la bonne façon d'appeler une fonction qui cherche (id) expéditeur comme param):

- (IBAction)addressPressed:(id)sender 
{ 
    [addressViewController showContactPicker:sender]; 
} 

Voilà ma déclaration d'interface pour AddressBookViewController:

#import <UIKit/UIKit.h> 
#import <Foundation/Foundation.h> 
#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

@interface AddressBookViewController : UIViewController <ABPeoplePickerNavigationControllerDelegate> 
{ 
} 

@end 

La fonction showContactPicker à AddressBookController ressemble à ceci:

#import "AddressBookViewController.h" 

@implementation AddressBookViewController 

- (void) showContactPicker:(id)sender 
{ 
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

... 

Je l'ai vérifié à l'aide du débogueur que le [auto presentModalViewController: Préparateur animé: OUI] est appelé, mais rien n'apparaît à l'exécution de l'écran et le code procède juste [libération du sélecteur]. Quelqu'un at-il une idée de la raison pour laquelle cet appel ne fait rien? Je ne vois aucun message d'erreur, aucun avertissement, etc. pendant que je parcours ce code.

Merci d'avance!

Répondre

1

Vous ne spécifiez pas ce que nib/xib à utiliser dans votre fichier init:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 

Modifier à:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] [email protected]"ABPeoplePickerNavigationController" bundle:nil]; 

en vous assurant que vous utilisez tout ce que votre fichier nib est nommé, moins la Extension .xib.

+0

Merci, j'ai donné un coup de feu mais ça n'a rien changé; il n'affiche toujours pas le sélecteur de carnet d'adresses. Je n'ai qu'un seul fichier .xib dans mon projet, MainWindow.xib, alors j'ai changé la ligne à ceci: \t ABPeoplePickerNavigationController * sélecteur = [[ABPeoplePickerNavigationController alloc] initWithNibName: @ paquet "MainWindow": nil]; Qu'est-ce que cela fait? J'ai lu la documentation sur initWithNibName mais tout ce qu'il dit est "Renvoie un contrôleur de vue nouvellement initialisé avec le fichier nib dans le paquet spécifié." Merci encore pour votre aide. Jason – Maha

+0

Nous sommes désolés de vous tromper ici. Je n'ai pas utilisé l'API du carnet d'adresses et je ne l'ai pas reconnu au début. Vous ne devriez pas avoir besoin de spécifier le xib lorsque vous initialisez le ABPeoplePickerNavigationController. J'ai mis en place un exemple de projet et mis en œuvre le ABPeoplePickerNavigationController et a réussi à le faire fonctionner très bien (http://www.matthew-long.com/download/AddressBook.zip). Avez-vous implémenté toutes les méthodes du protocole formel ABPeoplePickerNavigationControllerDelegate? –

+0

Merci pour l'exemple. Je vais le comparer à mon code et essayer de déterminer ce qui ne va pas. – Maha

Questions connexes