iOS. Можно ли представить модальный контроллер представления из модально представленного контроллера представления?

Я работаю над приложением, которое представляет экран «редактировать профиль». Затем с этого экрана я хочу иметь возможность представить другой контроллер модального представления, UIImagePickerController. Однако я не могу этого сделать и продолжаю получать следующую ошибку:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Приложение пыталось представить контроллер модального представления на себе. Представляющий контроллер — UIImagePickerController: 0x13d077000.'

В моем приложении на экране моего профиля у меня есть кнопка верхней правой панели, которая модально отображает экран «редактировать профиль» следующим образом:

//  MyProfileViewController.m
// ...

- (void)rightBarButtonItemTapped:(id)sender
{
    EditMyProfileViewController *editMyProfileVC = [[EditMyProfileViewController alloc] init];
    editMyProfileVC.delegate = self;
    UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:editMyProfileVC];
    navVC.navigationBar.translucent = NO;
    [self presentViewController:navVC animated:YES completion:^{}];
}

Затем из контекста модально представленного экрана «редактировать профиль» я хочу иметь возможность модально представить UIImagePickerController. Я пытаюсь сделать это так:

//  EditMyProfileViewController.m
// ...

#pragma mark - UIActionSheetDelegate

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if ([actionSheet isEqual:self.profilePicActionSheet])
    {
        if (buttonIndex == 0) // Camera
        {
            [self.profilePicActionSheet dismissWithClickedButtonIndex:0 animated:YES];
            [self showPhotoPickerUsingSourceType:UIImagePickerControllerSourceTypeCamera];
        }
        if (buttonIndex == 1) // Photo Library
        {
            [self.profilePicActionSheet dismissWithClickedButtonIndex:0 animated:YES];
            [self showPhotoPickerUsingSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
        }
        if (buttonIndex == 2) // Saved Photos Album
        {
            [self.profilePicActionSheet dismissWithClickedButtonIndex:0 animated:YES];
            [self showPhotoPickerUsingSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
        }
    }
}

- (void)showPhotoPickerUsingSourceType:(UIImagePickerControllerSourceType)sourceType
{
    ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];
    if (status != ALAuthorizationStatusAuthorized)
    {
        // ...
    }
    else // status == ALAuthorizationStatusAuthorized
    {
        UIImagePickerController *imagePicker = [[UIImagePickerController alloc] initWithRootViewController:self];
        imagePicker.sourceType = sourceType;
        imagePicker.delegate = self;
        imagePicker.allowsEditing = YES;
        if ([UIImagePickerController isSourceTypeAvailable:sourceType])
        {
            [self presentViewController:imagePicker animated:YES completion:^{
                NSLog(@"imagePicker is on screen..."); // <-- App crashes before we get here
            }];
        }
        else
        {
            [Helper helperShowAlertWithTitle:@"Selected Source Type Not Available"];
        }
    }
}

Любая помощь высоко ценится. Спасибо.


person John Erck    schedule 03.11.2015    source источник
comment
Что такое self, когда вы пытаетесь представить средство выбора изображений?   -  person rmaddy    schedule 03.11.2015
comment
self — это модально представленный контроллер представления, EditMyProfileViewController. EditMyProfileViewController находится внутри UINavigationController, и это то, что на самом деле представлено в rightBarButtonItemTapped.   -  person John Erck    schedule 03.11.2015
comment
@matt Я добавил больше деталей кода. Надеюсь, это поможет.   -  person John Erck    schedule 03.11.2015


Ответы (1)


Изменять

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] initWithRootViewController:self];

to

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
person beyowulf    schedule 03.11.2015
comment
Хороший улов. Я недостаточно прокрутил, чтобы заметить, что используется неправильный инициализатор. - person rmaddy; 03.11.2015