Предупреждение: попытайтесь представить ‹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];    
}

person Dejell    schedule 16.12.2012    source источник
comment
Дайте некоторое время между старыми переходами или просто отключите их с помощью анимации NO   -  person Inder Kumar Rathore    schedule 16.12.2012
comment
Анимация: Нет не помогает. Что вы имеете в виду под дать немного времени?   -  person Dejell    schedule 16.12.2012
comment
Давать какое-то время между старыми переходами — это совершенно неправильный подход. Смотрите мой ответ.   -  person Stas    schedule 16.12.2012
comment
@Стас мало того, что это неправильно, так еще и не работает.   -  person Dejell    schedule 16.12.2012


Ответы (5)


На самом деле, по моему опыту, это связано с вызовом перехода и IBAction (который вызывает переход) с одной и той же кнопки — проверьте инспектор соединений в Interface Builder, чтобы увидеть, подключена ли ваша кнопка к обоим.

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

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

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

-(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];
}
person jesses.co.tt    schedule 31.08.2013

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

обычно 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];
}
person Inder Kumar Rathore    schedule 16.12.2012
comment
Еще. Наверное, это что-то более глубокое - person Dejell; 16.12.2012

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

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

- (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;

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

person Nimit Parekh    schedule 16.12.2012
comment
didFinishLaunchingWithOptions — куда добавить этот метод? и что такое navigationController - person Dejell; 16.12.2012
comment
вы использовали навигационный контроллер в своем приложении? - person Nimit Parekh; 16.12.2012
comment
У меня есть 3 представления: TakePhoto, который является делегатом OverlayViewController и AdjustPhoto. Что вы подразумеваете под навигационным контроллером? - person Dejell; 16.12.2012
comment
didFinishLaunchingWithOptions -куда добавить? - person Dejell; 16.12.2012
comment
если у вас все еще есть проблемы, сообщите мне. - person Nimit Parekh; 16.12.2012
comment
давайте продолжим обсуждение в чате - person Dejell; 16.12.2012

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

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

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

person Stas    schedule 16.12.2012
comment
Я получаю несбалансированные вызовы, чтобы начать/завершить переходы внешнего вида для ‹UIImagePickerController› - person Dejell; 16.12.2012
comment
Еще. та же проблема. Мне кажется, пикер как-то не увольняется - person Dejell; 16.12.2012
comment
Я думаю, что проблема не в этом коде. Дайте нам знать, если вы решите проблему! - person Stas; 16.12.2012

Проблема заключалась в том, что в TakePhotoViewController у меня было:

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

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

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

person Dejell    schedule 16.12.2012