Представить еще один модальный вид из UIImagePickerController - PullRequest
7 голосов
/ 27 сентября 2010

Я хочу добавить представление подтверждения после того, как пользователь сделает фотографию или выберет сохраненную фотографию.В представлении подтверждения просто отобразится выбранное изображение с кнопкой отмены и загрузки на панели инструментов.

Мой UIImagePickerController представлен модально с одного из моих контроллеров представления, который управляется контроллером навигации, который, в свою очередь, находится в очереди.управляется контроллером панели вкладок.

Как мне представить мой вид подтверждения модально, чтобы он занимал полный экран (например, вид средства выбора изображений), когда пользователь выбирает фотографию?В идеале я хочу что-то вроде этого:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    [picker dismissModalViewControllerAnimated:YES];
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
}

Однако, это приводит к сбою приложения.Должен ли я представлять представление подтверждения модально из PICKER?Если да, то как мне убедиться, что при отклонении представления подтверждения сборщик также не будет отображаться?

РЕДАКТИРОВАТЬ:

Исправлена ​​ошибка в опубликованном мною коде.Вот что происходит, когда я пытаюсь печатать из памяти, а не копировать + вставлять :( В любом случае, предложения пока что не помогают.

Если я представлю модальный контроллер, ТО откажемся от средства выбора, ничего не произойдет, предположительно, так каквпоследствии оба контроллера увольняются.

Если я отклоняю сборщик, ТОГДА представляю модальный контроллер, я получаю исключение о модальных переходах:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempting to begin a modal transition from <UINavigationController: 0x6b33940> to <UIViewController: 0x6b62b00> while a transition is already in progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

Ответы [ 5 ]

3 голосов
/ 27 сентября 2010

Нашел решение.Действительно, сборщик должен быть отклонен, и хитрость заключается в том, чтобы отключить анимацию для этого отклонения, чтобы это произошло немедленно, и затем представить второй модальный вид.хочу.Когда вы закрываете средство выбора, исходный вид отображается на долю секунды, а затем модальный вид становится анимированным.Это выглядит немного странно.

Я также пытался держать сборщик рядом, а не сбрасывать его со счетов.Вместо этого я звоню [picker presentModalViewController:modal animated:YES].Это позволяет мне плавно переходить от выбора к представлению подтверждения.Однако, когда я закончу с представлением подтверждения, мне нужно позвонить [self dismissModalViewControllerAnimated:YES] с исходного контроллера.Это приводит к тому, что сначала отображается средство выбора изображений, а затем все отклоняется.Опять же, не совсем то, что я хочу.

В идеале, я хочу тот же эффект, который приложение Facebook iPhone использует для загрузки фотографий.После того, как вы выбрали фотографию, она легко переходит в режим подтверждения.Отмена или подтверждение из этого представления будет плавно переходить к исходному, основному виду.Похоже, что представление подтверждения является частью средства выбора изображений, когда, вероятно, это просто другое пользовательское представление.

Как мне это сделать?

1 голос
/ 14 августа 2011

Попробуйте это ...

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    picker.navigationController pushViewController:modal animated:YES];
    [modal release];
}
0 голосов
/ 08 мая 2012

Это сработало для меня:

[myViewControllerA presentModalViewController:myViewControllerB];
//... let myViewControllerB do its job
[myViewControllerB presentModalViewController:myViewControllerC];
//... let myViewControllerC do its job
[myViewControllerA dismissModalViewControllerAnimated:YES];

То есть вы представляете контроллеры вида как этот A => B(modal) => C(modal), а затем вызываете dismiss из контроллера контроллеров A, чтобы пропустить одновременно B и C.

0 голосов
/ 27 сентября 2010

Ах.Похоже, что вы не можете представить и отклонить модальный контроллер вида одним и тем же методом.

Вы можете использовать свойство (чтобы помочь с управлением памятью) для хранения информационного словаря и ивар для хранения чего-то вроде"didSelectImage".Затем в viewDidAppear: вашего контроллера представления, если didSelectImage == YES, представьте свой контроллер представления модально, используя данные в информационном словаре.

Обязательно сбросьте didSelectImage обратно в NO и установите свойство словаря информации равным nilкогда они больше не нужны.

0 голосов
/ 27 сентября 2010

Вы выпускаете модал перед тем, как его представить. Попробуйте это:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIViewController *modal = [[UIViewController alloc] init];
    modal.view = confirmationView;
    [self presentModalViewController:modal animated:YES];
    [modal release];
    [picker dismissModalViewControllerAnimated:YES];
}
...