Проблема с открытием нового ViewController после UIImagePickerController - PullRequest
1 голос
/ 15 февраля 2011

Я пытаюсь открыть новое представление (UnprocessedPhotoViewController) сразу после того, как функция делегата для моего UIImagePickerController возвращает «didFinishPickingImage».

К сожалению, похоже, что я могу либо открыть модальное представление UIImagePickerController, либо переключиться на UnprocessedPhotoViewController как модальное, но не оба одновременно.

В приведенном ниже коде нажатие кнопки активирует PicPhoto IBAction. Этот код успешно активирует UIImagePickerController. После того как пользователь выбирает изображение, вызывается функция делегата didFinishPickingImage, которая сохраняет изображение в переменной, пытается закрыть модальный UIImagePickerController и открыть UnprocessedPhotoViewController в новом модальном режиме.

Примечание. Если я закомментирую ImagePicker и запустлю «showPhoto» напрямую, UnprocessedPhotoViewController будет отображаться успешно. Кроме того, если я создаю новую кнопку для запуска любого вида, он работает успешно, но я не могу запустить виды последовательно. Я ожидаю, что после того, как пользователь выберет изображение, будет запущено новое представление, которое позволит пользователю обрабатывать изображение.

Как правильно гарантировать, что модальный режим ImagePicker закрывается, а затем открывается UnprocessedPhotoViewController?

Спасибо !!!

Код:

- (IBAction)pickPhoto:(id)sender{

//TODO: To be replaced with the gallery control launching code

// Load Image Selection Code    
self.imgPicker = [[UIImagePickerController alloc] init];
self.imgPicker.delegate = self;
self.imgPicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:self.imgPicker animated:YES];

}



// Dummy function assumes you either picked (or took a picture =D) of Angie and moves you right to the unprocessed viewing screen.
- (void) showPhoto{

// Start new view controller
[self dismissModalViewControllerAnimated:YES];
UnprocessedPhotoViewController *upViewController = [[UnprocessedPhotoViewController alloc] initWithNibName:@"UnprocessedPhotoViewController" bundle:nil];
upViewController.imageView.image = selectedImage;
upViewController.delegate = self;
upViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:[upViewController animated:YES]];
[upViewController release];

}


- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img {
selectedImage = img;
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
[self dismissModalViewControllerAnimated:YES];

[self showPhoto];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}

Ответы [ 2 ]

4 голосов
/ 15 февраля 2011

Реализуйте viewDidAppear в вашем корневом контроллере представления и на основании данных участника решите вызвать showPhoto или нет.Следующий пример просто повторно представляет UIImagePicker, но любой новый модальный вид будет работать.viewDidAppear вызывается каждый раз, когда появляется представление вашего корневого контроллера представления, поэтому вы должны убедиться, что контекст известен при его вызове.Но это детерминированный способ узнать, что модальный контроллер представления исчез.

- (IBAction) showPicker: (id) sender
{
    UIImagePickerController* picker = [[[UIImagePickerController alloc] init] autorelease];
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    picker.delegate = self;
    picker.allowsEditing = YES;

    [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    imageChosen = YES;

    [self dismissModalViewControllerAnimated:YES];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
    imageChosen = NO;

    [self dismissModalViewControllerAnimated:YES];
}

- (void) viewDidAppear: (BOOL) animated
{
    if ( imageChosen )
    {
        [self showPicker: self];
    }
}
3 голосов
/ 30 ноября 2011

Еще один способ сделать это - обернуть встроенную анимацию отклонения своей собственной анимацией, а затем перехватить «событие» animationDidStop. Это создает комбинированную анимацию, поэтому, когда встроенная анимация будет завершена, ваша (пустая) анимация оболочки завершит вас и предупредит вас, что вы сделали.

Это немного чище, чем другой ответ, IMO, так как вам не нужно сохранять переменную состояния или переопределять viewDidAppear: (в моем приложении контроллер представления, представляющий средство выбора, представляет собой довольно много объектов, удаленных из код утилиты, который управляет управлением выбора, и это будет означать, что любой контроллер представления, использующий мою общую утилиту, должен будет переопределить viewDidAppear:, иначе он не будет работать):

-(void)dismissalAnimationDone:(NSString*)animationID 
                     finished:(BOOL)finished context:(void*)context
{
    UIImage* image = (UIImage*) context;
    // present controllers as you please
}

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    [UIView beginAnimations:@"dismissal wrapper" context:image];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(dismissalAnimationDone:finished:context:)];

    [self.delegate dismissModalViewControllerAnimated:YES];

    [UIView commitAnimations];
}
...