0

ReplayKit에서 ObjectiveC로 RPPreviewViewController에 대한 참조를 유지하는 데 문제가 있으며 무엇이 잘못되었는지 궁금합니다.ReplayKit - ObjectiveC의 RPPreviewViewController에 대한 참조 유지

.H 파일 :

@interface ReplayKitHelper : NSObject <RPPreviewViewControllerDelegate, RPScreenRecorderDelegate> 

-(void)startRecording; 
-(void)stopRecording; 
-(void)previewRecording; 

@property(strong) RPPreviewViewController* previewViewControllerRef; 

@end 

.mm 파일 : 나는 순서대로 방법 startRecording, stopRecording 및 previewRecording를 시작 런타임 동안

@implementation ReplayKitHelper 

@synthesize previewViewControllerRef; 

-(void)startRecording 
{ 
    RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder; 

    recorder.delegate = self; 

    [recorder startRecordingWithMicrophoneEnabled : true handler :^(NSError *error) 
    { 
    }]; 
} 

-(void)stopRecording 
{ 
    RPScreenRecorder* recorder = RPScreenRecorder.sharedRecorder; 

    [recorder stopRecordingWithHandler :^(RPPreviewViewController * previewViewController, NSError * error) 
    { 
     if (error == nil) 
     { 
      if (previewViewController != nil) 
      { 
       previewViewControllerRef = previewViewController; 
      } 
     } 
    }]; 
} 

-(void)previewRecording 
{ 
    if (previewViewControllerRef != nil) 
    { 
     previewViewControllerRef.modalPresentationStyle = UIModalPresentationFullScreen; 
     previewViewControllerRef.previewControllerDelegate = self; 
     [[IOSAppDelegate GetDelegate].IOSController presentViewController : previewViewControllerRef animated : YES completion : nil]; 
     // IOSController is my main UIViewController 
    } 
} 
@end 

. previewRecording 때까지는 previewViewControllerRef가 더 이상 유효하지 않습니다 (아무 것도 아니지만 참조하려고 할 때 충돌합니다).

stopRecordingWithHandler 블록 내에서 [self previewRecording]을 실행하려고하면 참조를 전달한 후 모든 것이 정상적으로 작동합니다.

핸들러의 previewViewController가 앱이 블록을 떠난 직후에 출시 된 것처럼 보입니다.

예제는 대부분 Swift로 작성되었으며 유감스럽게도 ObjectiveC에 대한 비난을 받았습니다. Swift 예제에서 previeViewController에 대한 참조는 변수로 전달되지만 ObjectiveC에서는 작동하지 않는 것처럼 보입니다.

여기에 무슨 문제가 있습니까?

답변

1

저는 ARC를 사용한다고 가정하고, 더 이상 속성을 합성 할 필요가 없습니다.

가 인터페이스 파일에 RPPreviewViewController을 변경

:

@property (비 원자 강한) RPPreviewViewController * RPPreviewViewController;

@synthesize를 삭제하십시오.

다음 stopRecording 처리기에서 당신과 같이 사용할 수있는 RPPreviewViewController에 대한 참조를 유지할 수 있습니다 :

내 경험 ReplayKit에서
- (void)stopScreenRecording { 
RPScreenRecorder *sharedRecorder = RPScreenRecorder.sharedRecorder; 
[sharedRecorder stopRecordingWithHandler:^(RPPreviewViewController *previewViewController, NSError *error) { 
    if (error) { 
     NSLog(@"stopScreenRecording: %@", error.localizedDescription); 
    } 

    if (previewViewController) { 
     self.previewViewController = previewViewController; 
    } 
}]; 
} 

는 여전히 버그가 그것에 대해 많은 문서가 아직 없습니다.

+0

답변을 주셔서 감사합니다. 원자와 합성이없는 트릭. 또한 iOS9에서는 항상 기본 스레드에서 미리보기를 실행해야한다는 것을 알았습니다. – zompi