Предупреждение. Попытайтесь представить <AdjustPhotoViewController> в <TakePhotoViewController> во время презентации

Я использую xcode 4.5.2 и создал свой собственный OverlayViewController для кнопок камеры.

Теперь, когда мой контроллер делегата - TakePhotoViewController получает действие didFinishWithCamera из OverlayViewController, я хотел бы перенести пользователя в AdjustPhotoViewController.

Однако я получаю следующее предупреждение, и оно не передается:

Внимание! Попытайтесь сделать презентацию во время презентации!

- (void)didFinishWithCamera
{
    [[self.overlayViewController.imagePickerController presentingViewController] dismissViewControllerAnimated:YES completion:nil];
    [self performSegueWithIdentifier:@"fromTakeToAdjust" sender:self];    
}

5 ответов

Решение

Проблема была в том, что в TakePhotoViewController у меня было:

- (void)viewDidAppear:(BOOL)animated{
   [self openImagePicker];
}

Это привело к открытию средства выбора изображений при попытке одновременно закрыть его.

Я добавил флаг, чтобы проверить это.

На самом деле, по моему опыту, это связано с вызовом segue и IBAction (который вызывает segue) с одной и той же кнопки - проверьте инспектор соединений в Интерфейсном Разработчике, чтобы увидеть, подключена ли ваша кнопка к обеим.

В вашей раскадровке это может выглядеть так:

введите описание изображения здесь

В вашем коде это может выглядеть так:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"pushToNewVC"]) {
        UIViewController *controller = (UIViewController *)segue.destinationViewController;
    }
}

=

- (IBAction)launchNew VC:(id)sender {
    [self performSegueWithIdentifier:@"pushToNewVC" sender:sender];
}

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

обычно 0.3 работает, но настроить его в соответствии с вашими потребностями

- (void)didFinishWithCamera
{
    [[self.overlayViewController.imagePickerController presentingViewController] dismissViewControllerAnimated:YES completion:nil];
    [self performSelector:@selector(showModel) withObject:nil afterDelay:0.3];
}

- (void)showModel {
    [self performSegueWithIdentifier:@"fromTakeToAdjust" sender:self];
}

Пожалуйста, используйте следующий код для оверлейного viewcontroller.

пожалуйста, подтвердите свой код.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
    [self.window addSubview:self.view];
    [self.window makeKeyAndVisible];

    return YES;
}

В событии viewdidload используется следующий код

- (void) viewDidLoad {
    self.picker = [[UIImagePickerController alloc] init];
    self.picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;

    self.picker.showsCameraControls = NO;
    self.picker.wantsFullScreenLayout = YES;

    // Insert the overlay
    self.overlay = [[Customview alloc] initWithNibName:@"Customview" bundle:nil];
    self.overlay.pickerRef = self.picker;
    self.picker.cameraOverlayView = self.overlay.view;

    [self presentModalViewController:self.picker animated:NO];
}

В представлении.h метод следующий код использования

   @interface CameraController : UIViewController {
        UIImagePickerController* __picker;
        Customview* __overlay;
    }

@property (nonatomic, retain) UIImagePickerController* picker;
@property (nonatomic, retain) Customview* overlay;

Надеюсь, приведенный выше код может помочь вам.

Оделя, вы должны выполнять все действия с пользовательским интерфейсом, которые должны выполняться ПОСЛЕ некоторой анимации (в этом увольнении контроллера cae) в блоке завершения! Он на самом деле создан для этих целей. Отредактируйте ваш код следующим образом:

- (void)didFinishWithCamera
{
    if(![[self.overlayViewController.imagePickerController presentingViewController] isBeingDismissed]) {
        [[self.overlayViewController.imagePickerController presentingViewController] dismissViewControllerAnimated:YES completion:^ {
            [self performSegueWithIdentifier:@"fromTakeToAdjust" sender:self];
        }];
    }   
}

РЕДАКТИРОВАТЬ: Я добавил заявление if, попробуйте сейчас.

Другие вопросы по тегам