Posted at

[Objective-C] UIAlertViewを同期処理する

More than 5 years have passed since last update.

JavaScriptなどではアラートは同期処理になりますが、Objective-Cでは非同期処理になります。(デリゲートで処理するため)

ただ、場合によっては同期的に処理をしたい場合があるので、どうするかのメモです。

※ちなみに、viewDidLoad内でやっちゃうとちゃんとviewの描画処理が終わらなくなるのでうまく動きません。慣れてる人はそんなミスしないんだと思いますが、さっと処理を書いたらうまく動かなくてハマりました。


NSRunLoopを使って同期処理にする

@property (assign, nonatomic) BOOL finished;

- (void)anyMethod

{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"TItle"
message:@"message"
delegate:self
cancelButtonTitle:@"cancel"
otherButtonTitles:@"other", nil];

[alert show];

self.finished = NO;

while(!self.finished) {
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.5]];
}

NSLog(@"OK!");
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(UIInteger)buttonIndex

{
self.finished = YES;
}