当用户通过控件按下连接到mac的物理按钮时,处理将从网络摄像头录制一些内容的程序。在我的应用程序的其他地方调用方法只是做[自我方法:输入],但在一个地方它不起作用。可能有什么不对?
如果我在程序中获得inputchange,这是我想要运行的方法。
我也这样做 - (void)reportButton2:(NSInteger)inputVal:(NSInteger)inputInd;在我的.h文件中。
-(void)reportButton2:(NSInteger)inputVal:(NSInteger)inputInd {
//NSLog(@"phidget för port = %%d med signal %%d", ind, val);
if(inputVal == 1)
{
NSError* error;
NSFileManager* deleteMgr = [NSFileManager defaultManager];
NSString* path = @"/Users/Shared/tempFile.mov";
[deleteMgr removeItemAtPath:path error:&error];
[mCaptureMovieFileOutput recordToOutputFileURL:[NSURL fileURLWithPath:@"/Users/Shared/tempFile.mov"]];
}
else if(inputVal == 0)
{
[mCaptureMovieFileOutput recordToOutputFileURL:nil];
}
}
如果按钮的输入发生变化,下面的代码会给出结果。在这里,我似乎无法调用reportbutton2。
如果我尝试使用[self reportButton2 ..]给我“使用未声明的标识符'self'”
int gotInputChange(CPhidgetInterfaceKitHandle phid, void *context, int ind, int val) {
what to do here?
return 0;
}
答案 0 :(得分:4)
问题是gotInputChange是一个C函数而不是Objective C方法,所以没有udea是什么自己,因为它不属于一个类。
对于[self reportButton2 ... =要工作,它需要是你班级的方法
答案 1 :(得分:2)
我通常把这样的东西放在gotInputChange
之类的回调顶部:
MyObject *self = (id)context;
然后我可以在整个函数中使用self
,就像它是一个方法一样。
在函数中的另一件事情更难以断言条件。常规断言宏(例如NSAssert
和NSParameterAssert
)要求每个方法(self
都是其中之一)的隐式参数都存在。在C函数中,您必须改为使用NSCAssert
,NSCParameterAssert
等。
答案 2 :(得分:2)
您也可以使用您的代表。
SomeNameAppDelegate *delegate = (SomeNameAppDelegate *)[[NSApplication sharedApplication] delegate];
[delegate yourMethodName];
如果您的目标方法在AppDelegate类中,它就像在示例中一样。但是当你有权访问委托时,你可以创建一个指向必要类的指针,并将它们用于委托。
答案 3 :(得分:0)
最快但不太好的方法是让你的类成为一个单例并从get Input Change函数访问它。
答案 4 :(得分:0)
好的,谢谢!没有任何线索,C本来就不会解决它。做了一些谷歌搜索,这个为我做了伎俩。
[(id)context performSelectorOnMainThread:@selector(reportButton2:)withObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:ind], [NSNumber numberWithInt:val], nil] waitUntilDone:NO];