2009-09-06 10 views
1

Mon application est composée de 2 vues. La MainView et ResultsView. MainView contient un UITextField qui doit être rempli et si un bouton est touché, la vue devient ResultsView. Voici la partie juteuse du code qui gère cela.Problème lors du rejet d'un ABUnknownPersonViewController. Affiche bien, mais l'application se bloque lors du rejet

// In CallerIDAppDelegate.h 
@class MainViewController; 
@class ResultsViewController; 

@interface CallerIDAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 

    IBOutlet MainViewController *mainViewController; 
    IBOutlet ResultsViewController *resultsViewController; 

    NSString *phoneNumber; 

    NSMutableArray *parsingResults; 

    BOOL isSearchingForSaved; 
} 
[...] 

// In CallerIDAppDelegate.m 
[...] 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    /* Set up and display MainView */ 
    MainViewController *mainController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:[NSBundle mainBundle]]; 
    self.mainViewController = mainController; 
    [window addSubview:mainController.view]; 

    // Override point for customization after application launch 
    [window makeKeyAndVisible]; 
} 

-(void)switchViews{ 
    if(self.resultsViewController == nil){ 
     ResultsViewController *resultsController = [[ResultsViewController alloc] initWithNibName:@"ResultsViewController" bundle:nil]; 
     self.resultsViewController = resultsController; 
     [resultsController release]; 
    } 

    if(self.mainViewController.view.superview == nil){ 
     [resultsViewController.view removeFromSuperview]; 
     [window insertSubview:mainViewController.view atIndex:0]; 
    } else { 
     [mainViewController.view removeFromSuperview]; 
     [window insertSubview:resultsViewController.view atIndex:0]; 
    } 
} 

Maintenant dans ResultsView J'ai un tableview avec un certain contenu. Ce que je veux faire est, quand une rangée de cette vue de table est choisie, je veux appeler le ABUnknownPersonViewController ainsi l'utilisateur peut enregistrer un contact au carnet d'adresses.

Ainsi, dans ResultsViewController.m:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [...] 
    ABUnknownPersonViewController *unknownPersonView = [[[ABUnknownPersonViewController alloc] init] autorelease]; 

    [unknownPersonView setUnknownPersonViewDelegate:self]; 

    [unknownPersonView setDisplayedPerson:personRecord]; 
    [unknownPersonView setAllowsAddingToAddressBook:YES]; 

    UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:unknownPersonView] autorelease]; 


    [self presentModalViewController:navigationController animated:YES]; 
} 

- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person { 
    CallerIDAppDelegate *delegate = (CallerIDAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    DLog("Called!"); 
    [self dismissModalViewControllerAnimated:YES]; //caused crash 

    // Caused crash too 
    //[delegate.resultsViewController dismissModalViewControllerAnimate:YES]; 
} 

Le ABUnknownPersonViewController est affiché correctement lorsque la ligne est sélectionnée. Il contient également toutes les informations correctes qui ont été envoyées via personRecord et enregistre le contact correctement dans le carnet d'adresses lorsque le bouton "Ajouter aux contacts" est activé. MAIS, lorsque le bouton fait (ou annuler) est pressé dans la dernière étape, il se bloque assez mauvais! Le problème est, je ne peux rien comprendre du débogueur, puisque, quand lancé, il dit, "chargeant 43453 cadres de pile ...", quelle procédure je m'arrête. Le haut de la trace de la pile est:

[CALayer sublayers]; 

puis il y a BEAUCOUP de

[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] 

S'il vous plaît me éclairer. Je suis sûr que c'est probablement une petite chose stupide que je fais mal. J'ai essayé pendant des heures de régler ça, mais je ne peux pas. . :(

Répondre

4

Fix it ..... il était en effet stupide

Il devrait être:

- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person { 
CallerIDAppDelegate *delegate = (CallerIDAppDelegate *)[[UIApplication sharedApplication] delegate]; 
DLog("Called!"); 
[unknownPersonView dismissModalViewControllerAnimated:YES]; 

}

+0

Les solutions que vous apprenez le plus de sont celles que vous vous trouvez Bienvenue à Stack Overflow :) – h4xxr

Questions connexes