iPhone: выполнить выборку с параметром BOOL? - PullRequest
41 голосов
/ 16 августа 2011

Есть ли способ отправить BOOL в селектор?

[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];

Или я должен использовать NSInvocation? Может ли кто-нибудь написать образец, пожалуйста?

Ответы [ 14 ]

64 голосов
/ 04 января 2013

В случае, если вы не можете изменить сигнатуру целевого метода для принятия NSNumber вместо BOOL, вы можете использовать NSInvocation вместо performSelector:

MyTargetClass* myTargetObject;
BOOL myBoolValue = YES; // or NO

NSMethodSignature* signature = [[myTargetObject class] instanceMethodSignatureForSelector: @selector( myMethodTakingBool: )];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature];
[invocation setTarget: myTargetObject];
[invocation setSelector: @selector( myMethodTakingBool: ) ];
[invocation setArgument: &myBoolValue atIndex: 2];
[invocation invoke];
55 голосов
/ 16 августа 2011

вы можете использовать NSNumber для переноса типов bools:

BOOL myBool = YES;
NSNumber *passedValue = [NSNumber numberWithBool:myBool];
[self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5];

и в селекторе, чтобы получить значение bool, вы используете:

BOOL value = [recievedObject boolValue];
19 голосов
/ 25 января 2014

Самый простой способ выглядит следующим образом:

Если у вас есть метод

-(void)doSomething:(BOOL)flag

и вы хотите выполнить элемент с флагом = НЕТ использования

[object performSelector:@selector(doSomething:) withObject:nil];

В случаеflag = YES вы можете отправить любой объект, например, @YES - номер из bool

 [object performSelector:@selector(doSomething:) withObject:@YES];

Примечание: не используйте @NO!Только nil будет интерпретироваться как NO в вашем методе с аргументом bool.

14 голосов
/ 07 марта 2013

использовать dispatch_after в основном потоке следующим образом:

dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (_animationDuration+1) * NSEC_PER_SEC);
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
    [self completeAnimation:NO];
});
6 голосов
/ 29 июня 2012

если вы хотите передать NO и только NO, вы можете вместо этого поставить ноль

[self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];

Но помните, просто работать на ноль, не компилируется сARC, который запрещает неявное преобразование

5 голосов
/ 30 января 2015

Другой способ сделать это - передать nil для NO и anything else для YES

[self executeSelector: @selector (doSomething :) withObject: nil];

doSomething для параметра BOOL не будет иметь значения

-

[self executeSelector: @selector (doSomething :) withObject: [NSNumber numberWithBool: YES]];

doSomething для параметра BOOLбудет иметь значение YES

-

[self executeSelector: @selector (doSomething :) withObject: [NSNumber numberWithBool: NO]];

Параметр doSomething для BOOL будет иметь значение YES (даже если передано число с NO)

4 голосов
/ 26 февраля 2013

Возможно, это не самое элегантное, но я создал другую процедуру, чтобы вызывать процедуру с помощью bool.Это упрощает работу селектора и не требует доступа для изменения оригинальной процедуры.

[Добавлено Ash] Вот пример, который понижает альфа-значение получателя, когда установлено логическое свойство:

- (void) setVisible:(BOOL)visible
{
    _visible = visible;
    self.alpha = 0.0;
}

- (void) setVisibleUsingNSNumber:(NSNumber *)visible
{
    self.visible = [visible boolValue];
}

Затем вы можете запустить это после задержки следующим образом:

[self performSelector:@selector(setVisibleUsingNSNumber:)
           withObject:[NSNumber numberWithBool:YES]
           afterDelay:0.5];

Обратите внимание, что в эти дни также можно использовать Grand Central Dispatch, и в этом случае вы можете использовать стандартный метод установки внутриблокировать обход всего этого лишнего кода.Однако отменить вызов executeSelector намного проще, чем обнаружить отмену в отложенном выполнении блока.

2 голосов
/ 22 мая 2014

С литералами target-C это может быть выражено менее многословно.

[self performSelector:@selector(doSomething:) withObject:@(YES) afterDelay:1.5];

Обратите внимание на @(YES) iso YES

2 голосов
/ 29 июня 2012

видел этот трюк из другого поста, но передал ноль для НЕТ и себя для ДА.

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

Вы не можете отправлять аргументы селектору, как этот.

Возможно, вы захотите взглянуть на следующий ответ:

Создание селектора из имени метода с параметрами

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