0

ユーザーがiPhoneアプリページの画像をタップすると、最初にカスタムポップアップ(「リクエストが処理されています」というユーザーメッセージ)を表示したい、画像タッチの処理を開始する「前に」 . しかし、どういうわけか処理が開始され(ポップアップを表示することさえありませんが、処理コードの「前に」ポップアップを表示するコードを記述しました)、ほぼ終了し、ポップアップが表示されます。助けていただけますか?

これはコード スニペットです:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    int emotionChosen = -1;
    [self showUserNote:msg];
    ...
    ...
    // This then calls a method to process the touch event
    ...
    ...
}

-(void) showUserNote:(NSString *)note {

    if ((self.viewCtrlrUserNote == nil) || (self.viewCtrlrUserNote == NULL)) {
        self.viewCtrlrUserNote = (ViewController_NoteToUser *) [((com_AppDelegate *) [[UIApplication sharedApplication] delegate]).storyboard instantiateViewControllerWithIdentifier:kNameViewCtrlrUserNote];
    }
    [self.viewCtrlrUserNote.view setFrame:CGRectMake(70.0,150.0,170.0,170.0)];
    [self.viewCtrlrUserNote initializeViewWithNote:note];
    [self.view addSubview:self.viewCtrlrUserNote.view];
    [self.view bringSubviewToFront:self.viewCtrlrUserNote.view];
}

showUserNote (ポップアップ/ダイアログ ボックスを表示する必要があります) への呼び出しを行っていますが、「最初に」、「次にのみ」タッチを処理するメソッドを呼び出しています。しかし、タッチを処理するメソッドが最初に実行を開始し、ダイアログ ボックスは処理メソッドの最後の近くにしか表示されないため、目的そのものが破壊されます!

私の開発環境:XCode 4.3.3、iPad、iOS 5

タッチイベントの処理を開始する「前に」iOSが「最初に」ユーザーダイアログを表示することを「義務付ける」にはどうすればよいですか?

4

2 に答える 2

2

描画コマンドと UI コマンドは、通常、CocoaTouch では同期していません (実際、3D アクセラレーションと合成を使用する最新のグラフィックス API では)。すべての作業を実行するときは-showUserNote:、実際に実行するのではなく、次にイベントを処理するときにそれらすべてを実行するために、ビュー サブシステムへのコマンドをキューに入れています。

あなたが望むものを達成するための標準的なパターンは、デリゲートを使用して、ビューが描画されたらデリゲートにコールバックすることです。Apple は UIAlert クラスでこのパターンを使用します。カスタム ビューの代わりにそれを使用してコードを動作させ、カスタム ビューを変更してデリゲートを作成し、表示されたらコールバックします。

イベント処理や遅延処理などを理解できるように、ランループについて読むことを強くお勧めします。

于 2012-09-30T17:37:20.080 に答える
0

ダイアログの後に実行したいコードを別のメソッドにバンドルし、NSTimer で呼び出すことを試みます (ダイアログが動作していることを確認することもお勧めです // 後でコードをチェックしてください)。

[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(myTouchEvent) userInfo:nil repeats:NO];

myTouchEvent は作成するメソッドです。

@Lois Bergargは、これはおそらくうまくいかないだろうと指摘しました。これが私の最初の考えでした....

  NSDate *future = [NSDate dateWithTimeIntervalSinceNow: 0.5];
  [NSThread sleepUntilDate:future];
于 2012-09-30T17:35:57.593 に答える