0

これはおそらくクレイジーですが、セレクター内に実際のメソッドを記述できるかどうか疑問に思っています。理由は、私のメソッドには単純な1ライナーしかないからです。

-(void)doThat {
    loadedPhoto.alpha = 1.0;
}

-(IBAction)revealPickers:(id)sender {

    loadedPhoto.alpha = 0.7;
    [self performSelector:@selector(doThat) withObject:nil afterDelay:1.0];
}

だから私が知りたいのは、これへのショートカットがあることです(明らかにこれは機能しません):

[self performSelector:@selector(^(void){loadedPhoto.alpha=1.0;}) withObject:nil afterDelay:1.0];

可能ですか、それとも単にばかですか?

4

2 に答える 2

1

私のコメントを拡張して修正します:

私のコメントは間違っています。あなたのコードを読み間違えて、あなたがやっていると思ってい[self performSelectorOnMainThread:etc:]ました。

私の実際の解決策(簡単なグーグルの後-見つけるのはそれほど難しくありませんでした):

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_current_queue(), ^(void){
    loadedPhoto.alpha = 1.0;
});

それが役に立てば幸い!

于 2013-03-29T11:40:17.357 に答える
0

最も簡単な解決策は使用することですが、ブロック アダプターを使用しdispatch_afterてメソッドを定義することもできます。NSObject

@interface BlockAdapter

@property (nonatomic, copy, readwrite) void (^block)();

- (void)call;

@end

@implementation BlockAdapter

- (void)call {
    self.block();
}

@end
@interface NSObject (PerformBlocks)

- (void)performBlock:((void)^())block afterDelay:(NSTimeInterval)delay;

@end

@implementation NSObject (PerformBlocks)

- (void)performBlock:((void)^())block afterDelay:(NSTimeInterval)delay {
   BlockAdapter* adapter = [[BlockAdapter alloc] init];
   adapter.block = block;

   [adapter performSelector:@selector(call) withObject:nil afterDelay:delay];
}

@end
于 2013-03-29T11:51:03.590 に答える