gpt4 book ai didi

ios - ReplayKit - 在 ObjectiveC 中保留对 RPPreviewViewController 的引用

转载 作者:行者123 更新时间:2023-11-29 00:39:14 25 4
gpt4 key购买 nike

我在使用 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 不再有效(它不是零,但当我试图引用它时它崩溃了)。

当我尝试在 stopRecordingWithHandler block 内运行 [self previewRecording] 时,在我传递引用之后 - 一切正常。

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

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

你知道这里出了什么问题吗?

最佳答案

我将假设您正在使用 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 仍然存在问题,并且还没有很多关于它的文档。

关于ios - ReplayKit - 在 ObjectiveC 中保留对 RPPreviewViewController 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39896300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com