2016-03-22 6 views
2

NSAlertを使用して、アプリケーションのメイン画面にエラーメッセージを表示しています。 は基本的には、NSAlertは私のメインビューコントローラNSAlertが現在表示されていることを確認してください

class ViewController: NSViewController { 

    var alert: NSAlert? 

    ... 

} 

のプロパティであり、私はいくつかの通知を受信したとき、私はいくつかの通知を取得した場合、アラートが現れ、いくつかのメッセージ今

func operationDidFail(notification: NSNotification) 
{ 
    dispatch_async(dispatch_get_main_queue(), { 

     self.alert = NSAlert() 
     self.alert.messageText = "Operation failed" 
     alert.runModal(); 
    }) 
} 

を表示します通知ごとにつまり、最初のメッセージが表示され、「OK」をクリックすると、それが消えて2番目のメッセージなどで再び表示されます。これは正常な動作です。

私が達成したいのは、この一連のエラーメッセージを避けることです。私は実際に最初のものだけを気にします。 アラートビューが現在表示されているかどうかを知る方法はありますか? iOSのUIAlertViewのような何かalert.isVisible

答えて

2

コードからは、通知がバックグラウンドスレッドでトリガーされている可能性があります。この場合、アラートが現在表示されていることを確認することは役に立ちません。 runModalメソッドがブロックされ、NSRunLoopをモーダルモードで実行しているため、最初のブロックが終了するまで、コードは次のブロック実行を開始しません。

問題を修正するには、アブソルートプロパティを導入し、dispatch_asyncの前にチェックしてください。

Objective-Cのソリューション:スウィフトを使用して

- (void)operationDidFail:(NSNotification *)note { 
    if (!self.alertDispatched) { 
     self.alertDispatched = YES; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      self.alert = [NSAlert new]; 
      self.alert.messageText = @"Operation failed"; 
      [self.alert runModal]; 
      self.alertDispatched = NO; 
     }); 
    } 
} 

同じコード:

func operationDidFail(notification: NSNotification) 
{ 
    if !self.alertDispatched { 
     self.alertDispatched = true 
     dispatch_async(dispatch_get_main_queue(), { 
      self.alert = NSAlert() 
      self.alert.messageText = "Operation failed" 
      self.alert.runModal(); 
      self.alertDispatched = false 
     }) 
    } 
} 
+0

私はそれが動作することを期待して動作します、ありがとう! – Randy

+0

@Randy、あなたは大歓迎です –

1

代わりの実行あなたが

- beginSheetModalForWindow:completionHandler: 

ソース試みることができる、モーダル:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSAlert_Class/#//apple_ref/occ/instm/NSAlert/beginSheetModalForWindow:completionHandler:完了ハンドラで

はnilに警告プロパティを設定します。 アラートプロパティがnil(アラートを解除した後に最初に表示される)である場合にのみアラートを表示します。 編集:私はあなたが探しているフラグの種類については何も書かれていません。

+0

おかげで、これも同様に動作します。私はBorisの答えを受け入れました。私は 'runModal'を使い続けたいと思っていました。 – Randy

関連する問題