45

BOOLin selectorを送信する方法はありますか?

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

または私は使用する必要がありますNSInvocationか?誰かサンプルを書いてくれませんか?

4

14 に答える 14

69

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];
于 2013-01-04T17:25:17.637 に答える
56

NSNumberを使用してboolsタイプをラップできます。

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

セレクターでbool値を取得するには、次を使用します。

BOOL value = [recievedObject boolValue];
于 2011-08-16T08:51:19.327 に答える
14

次のようにメインスレッドで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];
});
于 2013-03-07T06:07:35.167 に答える
6

NOだけを渡したい場合は、代わりにゼロを入れることができます

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

ただし、ゼロで動作するだけで、暗黙的な変換を許可しない ARC でコンパイルされないことを覚えておいてください

于 2012-06-29T13:08:23.490 に答える
4

これは最もエレガントではないかもしれませんが、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呼び出しをキャンセルする方がはるかに簡単です。

于 2013-02-26T17:50:55.943 に答える
2

このトリックが別の投稿を形成するのを見ましたが、NOの場合はnilを、YESの場合はselfを渡します。

于 2012-06-29T00:28:41.790 に答える
2

このようなセレクターに引数を送信することはできません。

次の回答をご覧ください。

パラメーターを使用してメソッド名からセレクターを作成する

于 2011-08-16T08:47:57.183 に答える
2

Objective-C のリテラルを使用すると、これをより簡潔に表現できます。

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

@(YES)isoに注意してくださいYES

于 2014-05-22T13:45:26.873 に答える
1

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
于 2015-09-02T00:54:36.240 に答える
1

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");
}

ここで 、ログに「何かをする」が表示されます。


于 2013-12-11T08:08:06.227 に答える
0

ブール値をNSNumberでラップしてみてください。[NSNumber numberWithBool:myBool]

そして、あなたはそれを取り戻すことができます[myNumber boolValue]

于 2011-08-16T08:45:35.163 に答える
0

私はこのようにします:

[_button performSelector:@selector(setUserInteractionEnabled:) withObject:[NSString stringWithFormat:@"YES"] afterDelay:nil];
于 2013-05-28T09:06:03.850 に答える