У меня есть, на мой взгляд, довольно простое на данный момент приложение, основанное на нескольких выложенных вместе уроках. Я использую XCode 3.2.3 в OSX 10.6.4. Это началось как стандартное iPhone "Window Based Application". Используя конструктор интерфейса, я добавил контроллер панели вкладок, используя видеоурок O'Reilly здесь:
http://broadcast.oreilly.com/2009/06/tab-bars-and-navigation-bars-t.html
В первой вкладке у меня есть стандартный UIView с двумя кнопками. Оба вызывают одну и ту же функцию для отображения UIImagePickerController:
-(IBAction) btnPhotoClicked:(id)sender {
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
if((UIButton *)sender == btnChoosePhoto)
{
imagePicker.allowsEditing = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
} else {
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
}
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
Я запускаю код внутри эмулятора, поэтому нажимаю только кнопку «Выбрать фото». Когда диалог открывается с выбранной фотографией, эта функция запускается:
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSURL *mediaUrl;
mediaUrl = (NSURL *)[info valueForKey:UIImagePickerControllerMediaURL];
if (mediaUrl == nil)
{
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerEditedImage];
if(imagePuzzle == nil)
{
//--- Original Image was selected ---
imagePuzzle = (UIImage *) [info valueForKey:UIImagePickerControllerOriginalImage];
}
else {
//--- Get the edited image ---
//--- If it was successful the above valueForKey:UIImagePickerControllerEditedImage
//--- would have assigned it already.
}
}
else {
//--- Muppet selected a video
}
// Animate the picker window going away
[picker dismissModalViewControllerAnimated:YES];
ImageViewController *imageViewController = [[ImageViewController alloc] init];
imageViewController.delegate = self;
[self presentModalViewController:imageViewController animated:YES];
[imageViewController release];
}
Вот где моя проблема. Я пробовал много разных хаков и итераций, но приведенный выше код является самым простым, чтобы представить проблему. Когда imageViewController отображается как модальный диалог, выдается следующее исключение:
2010-07-09 15:29:29.667 Golovomka[15183:207] *** Terminating app due to uncaught
exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal
transition from <NewViewController: 0x5915f80> to <ImageViewController: 0x594a350>
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear
to know the current transition has completed'
Как мне это вылечить? Я пробовал задержки и другие приемы, но не совсем понимаю, как мне использовать viewDidAppear или viewDidDisappear, чтобы помочь мне. Также следует отметить, что очень простое приложение с одним представлением, загружающим средство выбора и затем отображающее другое представление с изображением, не выдает ошибку. Любая помощь с благодарностью получена.