PresentViewController вызывается бесконечно в viewDidAppear

Я пытаюсь реализовать полноэкранный UIImagePickerController в своем приложении. Я не мог представить контроллер представления в viewDidLoad, потому что presenting view controllers on detached view controllers is discouraged. Однако мой viewDidAppear вызывается бесконечно, а контроллер средства выбора изображений добавляется, а затем исчезает с экрана при каждом вызове. Я попытался отправить в основную очередь, но это не решило проблему.

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    ipc = [[UIImagePickerController alloc] init];
    ipc.delegate = self;


    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
    {
        ipc.sourceType = UIImagePickerControllerSourceTypeCamera;
        ipc.showsCameraControls = NO;

        CGAffineTransform translate = CGAffineTransformMakeTranslation(0.0, 71.0); 
        ipc.cameraViewTransform = translate;

        CGAffineTransform scale = CGAffineTransformScale(translate, 1.333333, 1.333333);
        ipc.cameraViewTransform = scale;

        ipc.showsCameraControls = NO;
        ipc.tabBarController.tabBar.hidden = YES;
        ipc.allowsEditing = NO;
        [self presentViewController:ipc animated:YES completion:nil];

    }

}

#pragma mark - ImagePickerController Delegate
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage* theImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    if( picker.sourceType == UIImagePickerControllerSourceTypeCamera )
    {
        UIImageWriteToSavedPhotosAlbum(theImage, nil, nil, nil);
    }
    int height = -1;
    if([[NSUserDefaults standardUserDefaults] integerForKey:@"reduce_image"] == 0){
        height = 640;
    } else if ([[NSUserDefaults standardUserDefaults] integerForKey:@"reduce_image"] == 1) {
        height = 1024;
    } else {
        height = 1600;
    }

    UIImage* resizedImageForUpload = [UtilityFunctions scaleAndRotateImage:theImage maxResolution:height];
    NSData* imageDataForUpload = UIImageJPEGRepresentation(resizedImageForUpload, 1);   // reduced image! //

    NSString *userDataset = [UtilityFunctions retrieveFromUserDefaults:@"dataset"];

    [self didPickImage:imageDataForUpload atLocation:currentLocation
                     userDataset: userDataset];

    [picker dismissViewControllerAnimated:YES completion:nil];

    [mLocationManager stopUpdatingLocation];

}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
    /*navigate to home tab*/
    [picker dismissViewControllerAnimated:YES completion:nil];
    self.tabBarController.tabBar.hidden = NO;
    [self.tabBarController setSelectedIndex:0];

}

person maddie    schedule 06.12.2017    source источник
comment
Мне кажется, проблема в другом месте вашего кода. Что вы делаете в методах делегата ipc?   -  person onnoweb    schedule 07.12.2017
comment
обновлен с помощью методов делегата :)   -  person maddie    schedule 07.12.2017
comment
Это может помочь установить точку останова на ваших сборщиках dismissViewControllerAnimated. Я думаю, что он был уволен случайно.   -  person mschmidt    schedule 07.12.2017
comment
@mschmidt ты прав! Я отключил контроллер средства выбора изображений в viewWillDisappear, из-за чего мы попали в этот цикл!   -  person maddie    schedule 07.12.2017
comment
Не имеет отношения, но почему вы сначала создаете средство выбора изображений, а затем проверяете, доступен ли исходный тип? Это назад.   -  person rmaddy    schedule 07.12.2017
comment
@ Мэтт, хорошо, рад, что смог помочь!   -  person mschmidt    schedule 07.12.2017


Ответы (1)


Вы отклоняете контроллер представления средства выбора изображений в ответ на вызов его метода делегата, который, в свою очередь, вызывает ваш метод -viewDidAppear:, который просто представляет другой контроллер представления средства выбора изображений. Вам нужно как-то разорвать цикл, с кодом, который вы написали, поведение, которое вы описали, - это то, что я ожидаю.

Один из подходов состоит в том, чтобы установить ipc в экземпляр UIImagePickerController в -viewDidLoad (который вызывается только один раз), представить его, если он не-nil в -viewDidAppear:, затем nil в методах делегата средства выбора изображения, чтобы он не повторно представлял в следующий раз, когда будет вызван -viewDidAppear:.

person Tim Johnsen    schedule 07.12.2017
comment
обнулить его в imagePickerControllerDidCancel и didFinishPickingMediaWithInfo ? - person maddie; 11.12.2017