@mackworth Что вы имеете в виду дальнейшие мысли? Разве проблема не решается удалением контроллеров навигации в том порядке, в котором вы их представляете? Я прочитал ваш комментарий о документации Apple, но думаю, что вы, возможно, захотите отправить им электронное письмо по этому конкретному вопросу. Я уверен, что они помогут вам.

ечание. Ранее я задавал этот вопрос в контексте своего проекта, но теперь воссоздаю сбой в тестовом проекте. Любая помощь в объяснении того, что я делаю неправильно, будет принята с благодарностью.)

Сбой происходит при вызове ABPeoplePicker из другого модального viewcontroller. В частности, в главном окне есть NavController, который загружает myVC. Затем myVC загружает модальный NavController, содержащий мой контроллер, который затем вызывает ABPeoplePicker. В этой демонстрационной программе вмешательство пользователя не требуется до запуска ABPeoplePicker.

Сбой происходит, если вы используете окно поиска в средстве выбора людей, а затем выбираете одного из получающихся людей. (Если вы используете симулятор, вам нужно добавить человека в «Контакты», прежде чем запускать программу.) Программа возвращается, но во время закрытия двух модальных ВК я получаю ошибку ошибки утверждения. Это происходит каждый раз на iphone, ipad и симуляторах для обоих. Это кажется нормальным делом, поэтому мне трудно поверить, что это настоящая ошибка. Сообщение о сбое:

Ошибка подтверждения в - [ABMembersSearchDisplayController setActive: animated:], /SourceCache/UIKit_Sim/UIKit-1448.69/UISearchDisplayController.m:589 2011-01-31 13: 51: 11.903 testcrasher2 [26044: 207]* Завершение работы приложения из-за неперехваченного исключения NSInternalInconsistencyException, причина: «Контроллер навигации по поисковому содержимому не должен изменяться между -setActive: YES и -setActive: NO»

Итак, чтобы продемонстрировать, в новом приложении Xcode iPhone Window я модифицирую didFinishLaunchingWithOptions для вызова моего контроллера. Затем я создаю два VC следующим образом. (Обратите внимание, что вам нужно добавить платформы адресной книги к цели.) Вот и вся программа ...

AppDelegate.didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    myViewController *detailViewController = [[myViewController alloc] init];

    // Set the navigation controller as the window's root view controller and display.
    UINavigationController * navController = [[UINavigationController alloc] initWithRootViewController: detailViewController];

    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];

    [detailViewController release];
    [navController release];

    return YES;
}

myViewController.h:

@interface myViewController :  UIViewController<addDelegate>{
 }
@end

myViewController.m:

#import "myViewController.h"
#import "AddNewViewController.h"        

@implementation myViewController

- (void)controllerDidFinish:(addNewViewController *)controller  {
    [self dismissModalViewControllerAnimated:YES];
}

-(void) viewWillAppear:(BOOL)animated  {
    [super viewWillAppear: animated];

    addNewViewController *addController = [[addNewViewController alloc] init];
    addController.delegate = self;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addController];
    [self presentModalViewController:navController animated:YES];

    [navController release];
    [addController release];
}

@end

AddNewViewController.h:

#import <AddressBookUI/AddressBookUI.h>

@protocol addDelegate;

@interface addNewViewController : UIViewController  < ABPeoplePickerNavigationControllerDelegate> {
    id <addDelegate> delegate;  
}
    @property(nonatomic, assign) id <addDelegate> delegate;
@end


@protocol addDelegate <NSObject> 
    - (void)controllerDidFinish:(addNewViewController *)controller ; 
@end

AddNewViewController.m:

#import "AddNewViewController.h"

@implementation addNewViewController

@synthesize delegate;

-(void) viewDidAppear:(BOOL)animated {  
    ABPeoplePickerNavigationController * peoplepicker =  [[ABPeoplePickerNavigationController alloc] init] ;    
    peoplepicker.peoplePickerDelegate = self;
    [self presentModalViewController:peoplepicker animated:YES];
    [peoplepicker release];
}

#pragma mark AddressBook delegate methods

- (void)peoplePickerNavigationControllerDidCancel: (ABPeoplePickerNavigationController *)peoplePicker { 
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    [self.delegate controllerDidFinish:self ];  
    return NO;   //EDIT:  This MUST be YES or it will crash (see answer below)
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
      property:(ABPropertyID)property 
      identifier:(ABMultiValueIdentifier)identifier {
    return NO;
}

@end

Ответы на вопрос(1)

Ваш ответ на вопрос