2011-02-10 2 views
1

Работа с программой, которая будет записывать некоторые вещи с веб-камеры, когда пользователь нажимает физические кнопки, подключенные к mac через фиджимы. Иметь методы вызова в других местах моего приложения, просто делая [self method: input], но на одном месте он не работает. Что может быть неправильным?Как вызвать мой метод в какао, сам не работает

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

Также я делаю - (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]; 
} 
} 

Код ниже дает мне результат, если imput от кнопок меняется. Здесь я просто не могу назвать reportbutton2.

Если я пытаюсь использовать [само reportButton2 ..] в дает мне «Использование необъявленной идентификатора" собственного»

int gotInputChange(CPhidgetInterfaceKitHandle phid, void *context, int ind, int val) { 

what to do here? 

return 0; 

} 
+0

Где полученоInputChange? – Mark

+0

У меня есть api из phidget, который вызывает это, когда он регистрирует ввод с устройства. Думаю, – tobros91

ответ

4

Проблема заключается в том, что gotInputChange функция C не объективный метод C и так не имеет удеи, что такое самость, поскольку оно не принадлежит классу.

для [само reportButton2 ... = работать он должен быть метод в классе

0

но не скорейшего Су хороший способ, чтобы сделать ваш класс одноэлементно и доступ к нему из функции gotInputChange.

0

ОК спасибо! Не знаю, что это C никогда бы не решила это сама. Был какой-то гусей, и этот сделал трюк для меня.

[(id)context performSelectorOnMainThread:@selector(reportButton2:)withObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:ind], [NSNumber numberWithInt:val], nil] waitUntilDone:NO]; 
2

Я обычно ставлю что-то вроде этого в верхней части обратных вызовов, как gotInputChange:

MyObject *self = (id)context; 

Тогда я могу использовать self по всей функции, как если бы это был метод.

Другая вещь, находящаяся в функции, усложняет условия. Макросы регулярного утверждения, такие как NSAssert и NSParameterAssert, требуют как неявных аргументов для каждого метода (self - один из них) для существования. В функции C вы должны использовать вместо этого NSCAssert, NSCParameterAssert и т. Д.

+0

+1 для упоминания NSCAssert ... Я искал поисковые запросы, чтобы попытаться найти «как я могу назвать NSAssert из функции C obj-c " – Adam

2

Вы также можете использовать своего делегата.

Он работает, как в примере, если ваш целевой метод в классе AppDelegate. Но когда у вас есть доступ к делегату, вы можете создать указатели на нужные классы и использовать их над делегатом.

Смежные вопросы