0

オブジェクトを作成してから、それを使用してコントローラーを開きたいです。ビルドには最大 5 秒かかる場合があり、処理中にメッセージを表示したいと考えています。
私は次の実装を持っていますdidSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    // Some methods

    Controller *ctrl = [Controller new];
    [self.navigationController pushViewController:ctrl animated:YES];
}

すべて問題ありませんが、問題がありmessageViewます。プッシュ アニメーションの開始時にのみ表示されます。それを修正するにはどうすればよいですか?

4

5 に答える 5

1

ジョナサンの答えと同様に、プッシュを少し遅らせて、messageViewが表示される時間を与えます。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    int64_t oneMillisecond = NSEC_PER_MSEC;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, oneMillisecond), dispatch_get_main_queue(), ^(void){
        // Some methods

        Controller *ctrl = [Controller new];
        [self.navigationController pushViewController:ctrl animated:YES];
    });
}
于 2012-07-02T20:23:09.403 に答える
1

オブジェクトのビルド中にメイン スレッドをブロックしているため、表示されません。

制御を実行ループに戻すまで、ユーザー インターフェイスは更新されません。

解決策は、バックグラウンド スレッドでオブジェクトをビルドすることです。これを行う最も簡単な方法は、次のように libdispatch を使用することです。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    messageView.hidden = NO;

    // you may want to disable user interaction while background operations happen

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

        // Perform your lengthy operations here

        Controller *ctrl = [[Controller alloc] init];

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.navigationController pushViewController:ctrl animated:YES];
        }
    });
}
于 2012-07-02T20:20:25.423 に答える
0

これで試すことができますか:

[UIView animateWithDuration:0.5f delay:0.0f options:UIViewAnimationCurveLinear animations:^(void)
{
    messageView.hidden = NO;
}
completion:^(BOOL finished)
{
    Controller *ctrl = [Controller new];
    [self.navigationController pushViewController:ctrl animated:YES];
}];
于 2012-07-02T20:11:03.453 に答える
0

必要な場合は、次のUIAlertViewコードを使用できます。

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Title..." message:@"More?" delegate:nil cancelButtonTitle:nil otherButtonTitles:nil];
    [alert show];

完了したら、これを呼び出して閉じることができます:

[alert dismissWithClickedButtonIndex:0 animated:YES];
于 2012-07-02T19:53:47.497 に答える
0

didSelectRowAtIndexPath 呼び出し中にビューが再描画されない可能性があります。

だから...ブロックで長期実行メソッドを実行してみます。次に、messageViewアニメーションでメインスレッドをブロックし、ブロックに通知または何かを投稿してシャットダウンさせます。

messageView が一定時間後にシャットダウンするための何らかの条件が必要になる場合があります。

于 2012-07-02T20:21:00.437 に答える