0

У меня проблема с сохранением ссылки на RPPreviewViewController в ReplayKit с ObjectiveC, и мне интересно, что я делаю неправильно.ReplayKit - ссылка на RPPreviewViewController в ObjectiveC

заголовочный файл:

@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, в таком порядке. Все будет хорошо, пока не будет анонсирована запись, где будет выглядеть previewViewControllerRef (это не ноль, но он падает, когда я пытаюсь обратиться к нему).

Когда я пытаюсь запустить [self previewRecording] внутри блока stopRecordingWithHandler, после передачи ссылки - все работает нормально.

Похоже, что previewViewController от обработчика освобождается сразу после того, как приложение покидает блок.

Большинство примеров написано в Swift, к сожалению, я обречен на ObjectiveC. В примерах Swift ссылка на previeViewController просто передается переменной, но в ObjectiveC она, похоже, не работает.

У вас есть идеи, что здесь не так?

ответ

1

Я предполагаю, что вы используете ARC, если нет необходимости синтезировать свойства.

Изменения RPPreviewViewController в файл интерфейс к:

@property (неатомический, сильный) 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 все еще глючит и там не много документации об этом.

+0

Спасибо за ответ, он работал как шарм! Атомный и никакой синтез не сделал трюк. Кроме того, я обнаружил, что на iOS9 вы должны всегда запускать предварительный просмотр в основном потоке. – zompi