Как вызвать мой метод в какао, сам не работает - PullRequest
1 голос
/ 10 февраля 2011

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

Это метод, который я хочу запустить, если я получаю 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 ..] in, это даст мне «Использование необъявленного идентификатора« self »»

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

what to do here?

return 0; 

}

Ответы [ 5 ]

4 голосов
/ 10 февраля 2011

Проблема в том, что gotInputChange - это функция C, а не метод Objective C, и поэтому не имеет никакого представления о том, что такое self, поскольку оно не принадлежит классу.это должен быть метод в вашем классе

2 голосов
/ 17 августа 2011

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

SomeNameAppDelegate *delegate = (SomeNameAppDelegate *)[[NSApplication sharedApplication] delegate];
[delegate yourMethodName];

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

2 голосов
/ 12 февраля 2011

Я обычно помещаю что-то подобное в верхнюю часть обратных вызовов, таких как gotInputChange:

MyObject *self = (id)context;

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

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

0 голосов
/ 10 февраля 2011

Хорошо, спасибо! Я не имею ни малейшего понятия, что это был бы C, никогда бы не решил это сам. Я немного погуглил, и этот помог мне.

[(id)context performSelectorOnMainThread:@selector(reportButton2:)withObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:ind], [NSNumber numberWithInt:val], nil] waitUntilDone:NO];
0 голосов
/ 10 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...