我使用objc ++和Swift创建了一个openCV camera stream
,最后得到了一个有效的项目。
所以这些是我的文件:
1.openCVWrapper.h :
#import "myProjectDelegate.h"
@interface OpenCVWrapper : NSObject
- (void)setCameraDelegate: (id<OpenCVCamDelegate>) delegate;
@end
2.openCVWrapper.mm :
@implementation OpenCVWrapper : NSObject
- (void) setCameraDelegate: (id<OpenCVCamDelegate>) delegate {
myProject* camera = [myProject myProjectInstance];
camera.delegate = delegate;
}
@end
3.myProject.h :
@interface myProject : NSObject<CvVideoCameraDelegate>
@property CvVideoCamera* cam;
@property id<OpenCVCamDelegate> delegate;
+ (id) myProjectInstance;
- (void) initializeCamera;
@end
4.myProject.mm :
static void myStaticFunction() {
// How to call "CALL_THIS_FUNCTION" from !right! here
}
- (void)processImage:(cv::Mat &)image {
if (self.delegate != nil) {
image = doSomething(image);
[self.delegate callbackImage: MatToUIImage(image)];
}
}
5.myProjectDelegate.h :
@protocol OpenCVCamDelegate <NSObject>
- (void) callbackCameraFrame: (UIImage*) image;
@end
6.myProject.swift :
class ViewController: UIViewController, OpenCVCamDelegate {
var OpenCVWrapperInstance: OpenCVWrapper!
override func viewDidLoad() {
OpenCVWrapperInstance = OpenCVWrapper()
OpenCVWrapperInstance.setCameraDelegate(self)
}
func CALL_THIS_FUNCTION() {
print("Yeah, success!");
}
func callbackCameraFrame(_ image: UIImage!) {
// do some stuff with the image
}
}
我的问题:
因此摄像机流和Swift的委托工作得很好但现在我想从CALL_THIS_FUNCTION
中可以找到的静态方法调用Swift函数4.myProject.mm:
。无论我已经尝试过什么似乎都不是正确的方法,因为到现在为止我还是无法正常工作。
我的第一个想法是在.myProject.mm
中使用委托但是它是否发生了任何错误,也没有调用swift函数。看看我的代码:
id<OpenCVCamDelegate> myDelegate;
static void myStaticFunction() {
// How to call "CALL_THIS_FUNCTION" from !right! here
[globalDelegate CALL_THIS_FUNCTION];
}
注意:真的很感谢:)
答案 0 :(得分:0)
我必须这样做一段时间,但这是工作流程:
使用@objc
标记要展示的Swift类和相关函数。 (例如:@objc class ViewController: UIViewController, OpenCVCamDelegate {...}
)
在您的Obj-C .m文件中添加:#import <YourProductModuleName>-Swift.h
在.h中添加:@class ViewController
(或其他Swift文件名)
您可以Command
+ Option
点击@class ViewController
查看Xcode为您生成的-Swift.h标头。
您希望确保您使用Obj-C可以使用的对象类型。