【发布时间】:2015-10-05 23:22:01
【问题描述】:
这与其他有关从 Swift 访问 ObjC 回调的问题高度相关。但我的研究还没有产生工作成果。
任何人都可以看到我是否可能在这里做一些错误的语法吗?
我已将以下 Objective-C 回调声明为:
#import <UIKit/UIKit.h>
@class KxMovieDecoder;
typedef void (^KX_FIRST_FRAME_CALLBACK)() ;
extern NSString * const KxMovieParameterMinBufferedDuration; // Float
extern NSString * const KxMovieParameterMaxBufferedDuration; // Float
extern NSString * const KxMovieParameterDisableDeinterlacing; // BOOL
@interface KxMovieViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> {
KX_FIRST_FRAME_CALLBACK firstFrameLoaded;
}
+ (id) movieViewControllerWithContentPath: (NSString *) path
parameters: (NSDictionary *) parameters;
@property (readonly) BOOL playing;
@property (nonatomic, copy) KX_FIRST_FRAME_CALLBACK firstFrameLoaded;
- (void) play;
- (void) pause;
@end
当我从 swift 代码中分配给它时,分配后它仍然为零:
public func startViewing() -> UIViewController {
kxMoviePlayer = KxMovieViewController.movieViewControllerWithContentPath(rtspURL, parameters: nil) as? KxMovieViewController
kxMoviePlayer!.firstFrameLoaded = {
self.onFirstFrameOfVideo()
}
【问题讨论】:
-
Objective-C 的实现是什么样的?只是
@synthesize声明?此外,您的代码目前看起来可能会创建一个保留周期。如果 self 保留 kxMoviePlayer,您可能会考虑将捕获列表添加到您的块中:kxMoviePlayer!.firstFrameLoaded = { [unowned self] () -> Void in self.onFirstFrameOfVideo() }。不过,这不会导致它成为nil。 -
谢谢你的提示,我会的。
标签: ios objective-c swift objective-c-blocks swift2