BOOLin selectorを送信する方法はありますか?
[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];
または私は使用する必要がありますNSInvocationか?誰かサンプルを書いてくれませんか?
BOOLin selectorを送信する方法はありますか?
[self performSelector:@selector(doSomething:) withObject:YES afterDelay:1.5];
または私は使用する必要がありますNSInvocationか?誰かサンプルを書いてくれませんか?
NSNumberaの代わりに aを受け入れるように target-method シグネチャを変更できない場合は、代わりに次BOOLを使用できます。NSInvocationperformSelector
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];
NSNumberを使用してboolsタイプをラップできます。
BOOL myBool = YES;
NSNumber *passedValue = [NSNumber numberWithBool:myBool];
[self performSelector:@selector(doSomething:) withObject:passedValue afterDelay:1.5];
セレクターでbool値を取得するには、次を使用します。
BOOL value = [recievedObject boolValue];
次のようにメインスレッドで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];
});
NOだけを渡したい場合は、代わりにゼロを入れることができます
[self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];
ただし、ゼロで動作するだけで、暗黙的な変換を許可しない ARC でコンパイルされないことを覚えておいてください
これは最もエレガントではないかもしれませんが、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];
最近ではGrandCentralDispatchを使用することも可能であることに注意してください。その場合、この余分なコードをすべてバイパスして、ブロック内で標準のsetterメソッドを使用できます。ただし、遅延ブロック実行内でキャンセルを検出するよりも、performSelector呼び出しをキャンセルする方がはるかに簡単です。
このトリックが別の投稿を形成するのを見ましたが、NOの場合はnilを、YESの場合はselfを渡します。
Objective-C のリテラルを使用すると、これをより簡潔に表現できます。
[self performSelector:@selector(doSomething:) withObject:@(YES) afterDelay:1.5];
@(YES)isoに注意してくださいYES
NSInvocation に依存したり、NSNumber を使用するようにメソッドを変更したりする代わりに、ビューを作成することで、よりエレガントに行うことができます。
@interface CLLocationManager(CompatibleView)
@property (nonatomic) BOOL allowsBackgroundLocationUpdates;
@end
@implementation SampleClass
- (void)sampleFunc:(CLLocationManager *)locationManager {
if ([locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
locationManager.allowsBackgroundLocationUpdates = YES;
}
}
@end
BOOL パラメータを静的に渡す場合は、次を使用できます。
------> 'NO' を渡すには:
[self performSelector:@selector(doSomething:) withObject:0 afterDelay:1.5];
TimeInterval の後に結果を取得します。
-(void)doSomething:(BOOL)isDoSomething
{
NSLog(isDoSomething?@"Do Something":@"Don't Do Any Thing");
}
ここで 、ログに「 Don't Do Any Thing 」が表示されます。
------> 'YES' を渡すには:
[self performSelector:@selector(doSomething:) withObject:@"1" afterDelay:1.5];
TimeInterval の後に結果を取得します。
-(void)doSomething:(BOOL)isDoSomething
{
NSLog(isDoSomething?@"Do Something":@"Don't Do Any Thing");
}
ここで 、ログに「何かをする」が表示されます。
ブール値をNSNumberでラップしてみてください。[NSNumber numberWithBool:myBool]
そして、あなたはそれを取り戻すことができます[myNumber boolValue]
私はこのようにします:
[_button performSelector:@selector(setUserInteractionEnabled:) withObject:[NSString stringWithFormat:@"YES"] afterDelay:nil];