Предупреждение. Попытайтесь представить <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, попробуйте сейчас.