0

一部の操作をキャンセルする際にユーザーが確認するためにモーダルとして実行する NSAlert インスタンスがあります。ユーザーが応答せず、操作が完了したら、このモーダル ウィンドウを閉じる必要があります。そのため、アラートのデフォルト ボタンで performClick を呼び出しています。しかし、クリックの実行はすぐには実行されず、マウス移動イベントなどの外部イベントを待機することがわかりました。なぜこうなった?偽のイベントを投稿する以外に、他の解決策は何ですか?

4

2 に答える 2

3

これがあなたがする必要があることです。

Assumption:
1. IBAction is connect to NSButton Which will display the Alert View after clicking upon it.
2. It will perform Click operation by itself on the Second button of the Alert View.

以下のコードがお役に立てば幸いです....

- (IBAction)showAlert:(id)sender
{
    //display the alert
    self.myAlert = [NSAlert alertWithMessageText:@"Sample Test" defaultButton:@"OK" alternateButton:@"DO Nothing" otherButton:@"CANCEL" informativeTextWithFormat:@"TEST",nil];
    [self.myAlert beginSheetModalForWindow:[self window]
                         modalDelegate:self
                        didEndSelector:@selector(errorAlertDidEnd:returnCode:contextInfo:)
                           contextInfo:nil];

    NSArray *buttonArray = [self.myAlert buttons];
    NSLog(@"Button Arrays %@",buttonArray);

    //Close by itself without a mouse click by the user
    //Assuming the Default Button as the Second one "Do Nothing
    NSButton *myBtn = [buttonArray objectAtIndex:2];
    [myBtn performClick:self.myAlert];
}


- (void)errorAlertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{
    NSLog(@"TEST");
}
于 2013-05-28T06:42:52.703 に答える
1

どのボタンがクリックされたかを知るには、m を変更します。どのボタンがクリックされたかを知るには、メソッドerrorAltertDidEndを変更します。

- (void)errorAlertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo
{

   if(returnCode == NSAlertAlternateReturn)
   {
       NSLog(@"TEST Alternate %ld",returnCode);
   }

   if(returnCode == NSAlertDefaultReturn)
   {
       NSLog(@"TEST Default %ld",returnCode);
   }        
    if(returnCode == NSAlertOtherReturn)
    {
        NSLog(@"Test Other %ld",returnCode);
    }    
}

これについて詳しく教えてください。「しかし、(performClick から生成された) クリック イベント自体は、何らかの外部イベント (例: マウスの移動) を待機しています –」

于 2013-05-28T07:20:58.070 に答える