Я имею то, чему я верю, довольно простое приложение в данный момент на основе нескольких починенных учебных руководств. Я использую 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 для помощи мне. Также знаменитый то, что очень простое приложение с одним представлением, загружающим средство выбора, затем отображающее другое представление с изображением в, не производит ошибку. Любая справка с благодарностью получена.
Чтобы решить конкретную проблему, описанную здесь, вы можете добавить метод 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. :) Аплодисменты!