web-dev-qa-db-ja.com

遅延して表示されているUIAlertController

アプリのUIAlertControllerで問題が発生しています。現在、日付ピッカーが内部にあるiOS8に移行しています。

以下はコードです。

UIAlertController *AlertView = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleActionSheet];

 UIAlertAction *ok = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[AlertView dismissViewControllerAnimated:YES completion:nil];
}];

 UIAlertAction *set = [UIAlertAction actionWithTitle:NSLocalizedString(@"Set to today", nil) style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[self set_to_today:nil];
[AlertView dismissViewControllerAnimated:YES completion:nil];
[self.tableView reloadData];
}];

 UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action)
{
[AlertView dismissViewControllerAnimated:YES completion:nil];
}];


 UIDatePicker *datePicker = [[[UIDatePicker alloc] init] autorelease];
 datePicker.datePickerMode = UIDatePickerModeDate;
[datePicker setDate:data_appo];
[datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];

[AlertView.view addSubview:datePicker];
[AlertView addAction:ok];
[AlertView addAction:set];
[AlertView addAction:cancel];
[self.view bringSubviewToFront:datePicker];
[self presentViewController:AlertView animated:YES completion:nil];

ユーザーがUITableViewControllerから行を選択すると、UIAlertControllerと日付ピッカーが表示されます。

問題は次のとおりです。ユーザーが最初に行を選択すると、すべてが正常に機能します...しかし、ユーザーが[キャンセル]を選択してからもう一度選択を選択すると、UIAlertControllerが表示されるまでに2〜3秒かかります...これは、シミュレータ...

頭がおかしくなってしまいます...これにより、アプリのユーザーエクスペリエンスが低下します。

どんな助けも強く感謝されます

アレックス

40
user3197643

UITableViewから行を選択して表示されるUIAlertControllerで同じ問題が発生していました。初めてすべてが正常に機能し、ユーザーがアラートを再度トリガーしたとき、実際にアラートが表示されるまでに数秒の遅延がありました。

回避策として、GCDを使用しました。

_    dispatch_async(dispatch_get_main_queue(), ^{
        [self presentViewController:AlertView animated:YES completion:nil];
    });
_

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPathはすでにメインスレッドで実行されているため、おそらくバグです。

Appleにバグレポートを提出しました: rdar:// 19285091

91
Tomusm
    DispatchQueue.main.async {
        self.present(alertView, animated: true, completion:nil)
    }

Swift 3.0バージョン。または、animationed:falseを設定しても問題は解決しました。

26
Mikrasya