0

我在使用 ObjectiveC 在 ReplayKit 中保留对 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,但是当我试图引用它时它会崩溃)。

当我尝试在 stopRecordingWithHandler 块内运行 [self previewRecording] 时,在我通过引用后 - 一切正常。

看起来处理程序中的 previewViewController 在应用程序离开块后立即释放。

大多数示例都是用 Swift 编写的,不幸的是,我注定要使用 ObjectiveC。在 Swift 示例中,对 previeViewController 的引用只是传递给变量,但在 ObjectiveC 中它似乎不起作用。

你有什么想法吗?

4

1 回答 1

1

我将假设您正在使用 ARC,如果是这样,则不再需要合成属性。

将接口文件中的 RPPreviewViewController 更改为:

@property (nonatomic, strong) RPPreviewViewController *RPPreviewViewController;

删除@synthesize。

然后在 stopRecording 处理程序中,您可以保留对可用 RPPreviewViewController 的引用,如下所示:

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

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

根据我的经验,ReplayKit 仍然存在问题,并且还没有很多关于它的文档。

于 2016-10-21T09:29:42.747 回答