Исключение в приложении для iPhone: Модальный переход уже происходит

Я имею то, чему я верю, довольно простое приложение в данный момент на основе нескольких починенных учебных руководств. Я использую XCode 3.2.3 в OSX 10.6.4. Это запустилось как стандартный iPhone "Приложение Оконное". Используя интерфейсного разработчика я добавил Контроллер Панели вкладок с помощью учебного руководства по видео 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];
}

Я работаю, код в эмуляторе поэтому только когда-либо нажимают кнопку под названием, Выбирают Photo. Когда диалог выпущен с фотографией, выбранной эта функция выполнения:

-(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  to      
while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear
to know the current transition has completed'

Как я исправляю это? Я попробовал задержки и другие приемы, но действительно не понимаю, как я, как предполагается, использую viewDidAppear или viewDidDisappear для помощи мне. Также знаменитый то, что очень простое приложение с одним представлением, загружающим средство выбора, затем отображающее другое представление с изображением в, не производит ошибку. Любая справка с благодарностью получена.

7
задан Diziet 9 July 2010 в 14:47
поделиться

1 ответ

Чтобы решить конкретную проблему, описанную здесь, вы можете добавить метод viewDidAppear в свой класс:

-(void)viewDidAppear:(BOOL)animated
{
    if (/*just visited ImagePicker*/)
    {
        ImageViewController *imageViewController = [[ImageViewController alloc] init];
        imageViewController.delegate = self;    
        [self presentModalViewController:imageViewController animated:YES];
        [imageViewController release];
    }
}

Удалите эти строки из-под вашего вызова:

[picker dismissModalViewControllerAnimated:YES];

Таким образом, всякий раз, когда появляется (отображается) ваш класс self, он будет вызывать viewDidAppear... Поскольку это, скорее всего, не really то, что вы хотите все время, вы можете добавить некоторые переменные для установки/очистки, которые определяют, следует ли немедленно представлять imageViewController при отображении self. Что-то вроде «Если исходит от средства выбора изображений, покажите imageViewController, в противном случае ничего не делайте».

Тем не менее, имхо, проталкивание модальных взглядов, как правило, должно осуществляться в ответ на действие пользователя, и я, возможно, переосмыслил бы пользовательский опыт здесь - например.добавьте подвид вместо того, чтобы проталкивать модальное представление, которое вы могли бы сделать там, где у вас в настоящее время есть код, но если вы просто играете с некоторыми учебниками, которые должны решить исключение NSInternalInconsistencyException. :) Аплодисменты!

9
ответ дан 6 December 2019 в 12:46
поделиться