iOS Delegate method not called in NSObject class

£可爱£侵袭症+ 提交于 2020-08-10 19:21:13

问题


I want to capture a picture from the camera with no preview.

Though I am able to do that with a UIViewController with the help of AVFoundation framework.

But now I have to do the same without the ViewController.

#Issue

When I trying to do the same with a NSObject class the AVCapturePhotoCaptureDelegate is not called.

TestingCamera.h

#import <AVFoundation/AVFoundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface TestingCamera : NSObject <AVCapturePhotoCaptureDelegate> {
    AVCaptureSession *captureSession;
    AVCapturePhotoOutput *photoOutput;
    AVCapturePhotoSettings *photoSetting;
    AVCaptureConnection *captureConnection;
}

@property(nonatomic, assign) id <AVCapturePhotoCaptureDelegate> delegate;
- (void) takePictureWithNoPreviewFrontFacingCamera;

@end

NS_ASSUME_NONNULL_END

TestingCamera.m


#import "TestingCamera.h"



@implementation TestingCamera

- (void) initCaptureSession {
    captureSession = [[AVCaptureSession alloc] init];
    
    if([captureSession canSetSessionPreset: AVCaptureSessionPresetPhoto] ) {
        [captureSession setSessionPreset:AVCaptureSessionPresetPhoto];
    }
    
    [captureSession startRunning];
}

-(void) setNewPhotoSetting {
    photoSetting = [AVCapturePhotoSettings photoSettingsWithFormat:@{AVVideoCodecKey : AVVideoCodecTypeJPEG}];
    [photoOutput setPhotoSettingsForSceneMonitoring:photoSetting];
}

-(void) takePictureWithNoPreviewFrontFacingCamera {
    [self initCaptureSession];
    [self initInputDevice:[self frontFacingCameraIfAvailable]];
    [self initOuput];
    [self setNewPhotoSetting];
    captureConnection = nil;
    for (AVCaptureConnection *connection in photoOutput.connections) {
        for (AVCaptureInputPort *port in [connection inputPorts]) {
            if ([[port mediaType] isEqual: AVMediaTypeVideo]) {
                captureConnection = connection;
                break;
            }
        }
        if (captureConnection) {
            break;
        }
    }
    [photoOutput capturePhotoWithSettings:photoSetting delegate:self];
}

-(void) initInputDevice: (AVCaptureDevice *) inputDevice {
    AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:inputDevice error:nil];
    
    if ([captureSession canAddInput:deviceInput]) {
        [captureSession addInput:deviceInput];
    }
    
}


-(void) initOuput {
    photoOutput = [[AVCapturePhotoOutput alloc] init];
    if ([captureSession canAddOutput:photoOutput]) {
        [captureSession addOutput:photoOutput];
    }
}


-(AVCaptureDevice *) frontFacingCameraIfAvailable {
    AVCaptureDeviceDiscoverySession *captureDeviceDiscoverySession = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:@[AVCaptureDeviceTypeBuiltInWideAngleCamera] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionFront];
    NSArray *captureDevices = [captureDeviceDiscoverySession devices];
    if (!captureDevices || !captureDevices[0]){
        return [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    } else {
        return captureDevices[0];
    }
}

- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error
{
    NSData *imageData = [photo fileDataRepresentation];
    NSString *base64 = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSLog(@"Encoded: %@", base64);
    
}

@end

I am calling the method from another ViewController like this

- (IBAction) testPicture:(id)sender {
    TestingCamera *noPreviewCamera = [[TestingCamera alloc] init];
    [noPreviewCamera takePictureWithNoPreviewFrontFacingCamera];
}

来源:https://stackoverflow.com/questions/62993370/ios-delegate-method-not-called-in-nsobject-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!