Сбой UIImagePickerController с «[UIViewController _setCameraOverlayView:]: нераспознанный селектор» на iOS 11 - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать персонализированный UIImagePickerController со следующим кодом. ECPhotoPickerController.h

@interface ECPhotoPickerController : UIImagePickerController
@property (strong, nonatomic) void(^didFinishSavingPhoto)(NSURL* url, UIImage* image);
@property (strong, nonatomic) void(^didDismissed)(void);
@end

ECPhotoPickerController.m

...
- (void)viewDidLoad {
    [super viewDidLoad];

    self.sourceType = UIImagePickerControllerSourceTypeCamera;
    self.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
    self.showsCameraControls = false;

    [self setCameraOverlayView:self.overlayView];
    self.delegate = self;        
}
...

Настроенный контроллер средства выбора изображений будет представлен после нажатия кнопки,который вызвал бы следующий метод.

- (void)showImagePicker {

    ECPhotoPickerController* vc = [[ECPhotoPickerController alloc] init];
    vc.didFinishSavingPhoto = ^(NSURL *url, UIImage *image) {
        self.selectedImage = image;
    };
    vc.didDismissed = ^{
        // dismissed
    };
    [self presentViewController:vc animated:true completion:nil];
}

Но приложение будет only аварийно завершать работу на iOS 11 с журналом

[UIViewController _setCameraOverlayView:]: unrecognized selector sent to instance 0x108403dd0

, и до этого есть какой-то странный журналсбой.

[] <<<< AVOutputDeviceDiscoverySession (FigRouteDiscoverer) >>>> -[AVFigRouteDiscovererOutputDeviceDiscoverySessionImpl outputDeviceDiscoverySessionDidChangeDiscoveryMode:]: Setting device discovery mode to DiscoveryMode_None (client: ECalligraphy)

Настроенный класс средства выбора изображений явно наследуется от UIImagePickerController.
И когда я инициализировал его с помощью [[ECPhotoPickerController alloc] init], он должен вызвать инициализацию суперкласса, поскольку я не реализовалинициализация ECPhotoPickerController.

Я действительно запутался в этом сбое.Любой совет будет оценен.

1 Ответ

0 голосов
/ 03 июня 2018

Я окончательно нашел причину!
Необходимо указать sourceType до начала загрузки контроллера представления на iOS 11.

Это означает, что вы должны установитьзначение sourceType во время инициализации вашего настроенного контроллера представления или сделать это для экземпляра перед загрузкой.

- (instancetype)init { // `initFromNibName` etc. depends on the way you initialize it.
    if (self = [super init]) {
        self.sourceType = UIImagePickerControllerSourceTypeCamera;
        self.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
        self.showsCameraControls = false;
        self.delegate = self;
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
}

Или

- (void)showImagePicker {
    ECPhotoPickerController* vc = [[ECPhotoPickerController alloc] init];
    vc.sourceType = UIImagePickerControllerSourceTypeCamera;
    [self presentViewController:vc animated:true completion:nil];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...