0

ObjectiveCを使用してReplayKitのRPPreviewViewControllerへの参照を保持することに問題があり、何が間違っているのだろうかと思っています。ReplayKit - ObjectiveCのRPPreviewViewControllerへの参照を維持する

.hファイル:

@interface ReplayKitHelper : NSObject <RPPreviewViewControllerDelegate, RPScreenRecorderDelegate> 

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

@property(strong) RPPreviewViewController* previewViewControllerRef; 

@end 

.mmファイル:

@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 

私はそのためには、方法startRecording、stopRecordingとpreviewRecordingを起動する実行時に。 previewRecordingまで、すべてがうまくいっています。previewViewControllerRefはもはや有効ではありません(これは、nilではありませんが、参照しようとするとクラッシュします)。

リファレンスを渡した後、[self previewRecording]をstopRecordingWithHandlerブロック内で実行しようとすると、すべて正常に動作します。

ハンドブックの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

関連する問題