我正在Swift中构建一个导入一些.h文件的应用程序。我有这些定义:
RTCEAGLVideoView.h
@interface RTCEAGLVideoView : UIView <RTCVideoRenderer>
@property(nonatomic, weak) id<RTCEAGLVideoViewDelegate> delegate;
@end
RTCVideoRenderer.h
@protocol RTCVideoRenderer<NSObject>
// The size of the frame.
- (void)setSize:(CGSize)size;
// The frame to be displayed.
- (void)renderFrame:(RTCI420Frame*)frame;
@end
现在,在ViewController中,我有一个类型为RTCEAGLVideoView的对象,我想调用renderFrame方法。
@IBOutlet weak var remoteView: RTCEAGLVideoView!
...
self.remoteView.renderFrame(nil)
但是我收到了这个错误:
Value of type 'RTCVideoRenderer' has no member 'renderFrame'
任何帮助都将不胜感激。
编辑: RTCI420Frame.h
#import <Foundation/Foundation.h>
// RTCI420Frame is an ObjectiveC version of cricket::VideoFrame.
@interface RTCI420Frame : NSObject
@property(nonatomic, readonly) NSUInteger width;
@property(nonatomic, readonly) NSUInteger height;
@property(nonatomic, readonly) NSUInteger chromaWidth;
@property(nonatomic, readonly) NSUInteger chromaHeight;
@property(nonatomic, readonly) NSUInteger chromaSize;
// These can return NULL if the object is not backed by a buffer.
@property(nonatomic, readonly) const uint8_t* yPlane;
@property(nonatomic, readonly) const uint8_t* uPlane;
@property(nonatomic, readonly) const uint8_t* vPlane;
@property(nonatomic, readonly) NSInteger yPitch;
@property(nonatomic, readonly) NSInteger uPitch;
@property(nonatomic, readonly) NSInteger vPitch;
- (BOOL)makeExclusive;
#ifndef DOXYGEN_SHOULD_SKIP_THIS
// Disallow init and don't add to documentation
- (id)init __attribute__((
unavailable("init is not a supported initializer for this class.")));
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
@end
答案 0 :(得分:0)
我试图复制你的问题,但它对我来说很好用虚拟文件。我怀疑你的问题并没有弥合所有依赖的标题。
以下是适合我的文件:
RTCEAGLVideoView.h
----
#import <UIKit/UIKit.h>
#import "RTCEAGLVideoViewDelegate.h"
#import "RTCEAGLVideoView.h"
#import "RTCVideoRenderer.h"
@interface RTCEAGLVideoView : UIView <RTCVideoRenderer>
@property(nonatomic, weak) id<RTCEAGLVideoViewDelegate> delegate;
@end
RTCEAGLVideoView.m
----
#import "RTCEAGLVideoView.h"
@implementation RTCEAGLVideoView
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
- (void)renderFrame:(RTCI420Frame*)frame {
NSLog(@"Render frame was called");
}
- (void)setSize:(CGSize)size {
NSLog(@"Size set");
}
@end
RTCEAGLVideoViewDelegate.h
----
#import <Foundation/Foundation.h>
@protocol RTCEAGLVideoViewDelegate <NSObject>
@end
RTCI420Frame.h
----
#import <Foundation/Foundation.h>
@interface RTCI420Frame : NSObject
@end
RTCI420Frame.m
----
#import "RTCI420Frame.h"
@implementation RTCI420Frame
@end
RTCVideoRenderer.h
----
#import <Foundation/Foundation.h>
#import "RTCI420Frame.h"
@protocol RTCVideoRenderer <NSObject>
// The size of the frame.
- (void)setSize:(CGSize)size;
// The frame to be displayed.
- (void)renderFrame:(RTCI420Frame*)frame;
@end
RenderThing-Bridging-Header.h
----
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import <UIKit/UIKit.h>
#import "RTCEAGLVideoViewDelegate.h"
#import "RTCEAGLVideoView.h"
#import "RTCVideoRenderer.h"
ViewController.swift
----
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var remoteView: RTCEAGLVideoView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.remoteView.renderFrame(nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
请特别注意RenderThing-Bridging-Header.h
文件