Как я могу передать значение int через метод селектора? - PullRequest
10 голосов
/ 26 октября 2011

Я хочу передать значение int из моего метода селектора, но метод селектора принимает только параметр типа объекта.

int y =0;
[self performselector:@selector(tabledata:) withObject:y afterDelay:0.1];

Выполнение метода здесь

-(int)tabledata:(int)cellnumber {
   NSLog(@"cellnumber: %@",cellnumber);
   idLabel.text = [NSString stringWithFormat:@"Order Id: %@",[[records objectAtIndex:cellnumber] objectAtIndex:0]];
}

но я не получаю точное целочисленное значение в моем методе, я получаю только значение идентификатора.

Ответы [ 3 ]

19 голосов
/ 26 октября 2011

Самое простое решение, если вы «владеете» целевым селектором, это заключить аргумент int в NSNumber:

-(int)tabledata:(NSNumber *)_cellnumber {
    int cellnumber = [_cellnumber intValue];
    ....
}

Для вызова этого метода вы должны использовать:

[self performselector:@selector(tabledata:) withObject:[NSNumber numberWithInt:y] afterDelay:0.1];
15 голосов
/ 16 января 2012

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

SEL sel = @selector(tabledata:);

NSMethodSignature *signature = [[self class] instanceMethodSignatureForSelector:sel];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.selector = sel;
// note that the first argument has index 2!
[invocation setArgument:&y atIndex:2];

// with delay
[invocation performSelector:@selector(invokeWithTarget:) withObject:self afterDelay:0.1];
1 голос
/ 15 января 2019

Вместо вашего executeSelector: withObject: afterDelay :, используйте NSTimer, таким образом:

int y = 0;
[NSTimer scheduledTimerWithTimeInterval:0.1 repeats:NO block:^(NSTimer *timer) {
    [self tabledata:y];
}];

Вы можете передать все, что захотите, в блоке таймера.

...