web-dev-qa-db-ja.com

ボタンなしでUIAlertControllerをプログラムで閉じる方法は?

アップロードが進行中であることをユーザーに通知するだけであるため、ボタンなしのUIAlertViewControllerを提示しています。アプリはいくつかのファイルをAmazon S3にアップロードすることになっています(パラレルスレッドで発生することがあります)。

何が間違っているのだろうか?デバッグ領域にエラーがないので、これをデバッグする方法さえ知りませんか?

クラスレベルのプロパティがあります:var uploadInProgressAlert = UIAlertController()

このコードを使用して、ボタンなしでアラートを表示します(動作します):

_self.uploadInProgressAlert = UIAlertController(title: "Uploading", message: "Please wait.", preferredStyle: .Alert)
self.presentViewController(self.uploadInProgressAlert, animated: true, completion: nil)
_

このコードは、アラートを却下します(アラートは却下されません):self.uploadInProgressAlert.dismissViewControllerAnimated(false, completion: nil)

このスレッドでは: iOSはイベントへの応答でUIAlertControllerを却下します 誰かが「参照を保持する」ことについて話しました。 「参照を保持する」ことの意味がわかりませんが、これが問題の原因である可能性があると思います。

EDIT:上記のコードを簡単なテストアプリに配置しましたが、動作します。しかし、いくつかの並列スレッドで事態が複雑になると、アラートを却下する方法が見つかりません。

_var delay4s = NSTimer()
var delay8s = NSTimer()
var alert = UIAlertController()

func showAlert() {
    if NSClassFromString("UIAlertController") != nil {
        alert = UIAlertController(title: "Uploading", message: "Please wait! \n\n", preferredStyle: UIAlertControllerStyle.Alert)
        self.presentViewController(alert, animated: true, completion: nil)
    }
}

func dismissAlert(){
    self.alert.dismissViewControllerAnimated(true, completion: nil)
}

override func viewDidLoad() {
    super.viewDidLoad()
    delay4s = NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: "showAlert", userInfo: nil, repeats: false)
    delay8s = NSTimer.scheduledTimerWithTimeInterval(8.0, target: self, selector: "dismissAlert", userInfo: nil, repeats: false)
}
_
31
Andrej

通常、親View Controllerは、モーダル表示されたView Controller(ポップアップ)を閉じる責任があります。 Objective-Cでは、親View Controllerで次のようなことを行います。

[self dismissViewControllerAnimated:YES completion:nil];

Swiftバージョン<3の同じコードは次のようになります。

self.dismissViewControllerAnimated(true, completion: nil)

Swift 3.0:

self.dismiss(animated: true, completion: nil)
53
JiuJitsuCoder

for Swiftあなたができること:

nameOfYourAlertController.dismiss(animated: true, completion: nil)

trueは消失をアニメーション化し、falseはアラートを突然削除します

9
sandeep jaglan

短時間表示された後、自動的に終了するアラートを投稿する場合は、次の方法を使用できます。

  func postAlert(title: String, message: String) {
    let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
    self.present(alert, animated: true, completion: nil)

    // delays execution of code to dismiss
    DispatchQueue.main.asyncAfter(deadline: .now() + 2.0, execute: {
      alert.dismiss(animated: true, completion: nil)
    })
  }
7
Adrian

AlertControllerの独自のメソッドを使用して、自身を破棄します。

UIAlertController *alertController = [UIAlertController 
alertControllerWithTitle:...];

[alertController dismissViewControllerAnimated:YES completion:nil];
5
ylgwhyh

上記の機能は何も動作していないように見えますが、ここで完璧に動作します(xcode 10、Swift 5)。

手順1:これをviewControllerクラスに配置します

    var newQuestionAlert:UIAlertController?

ステップ2:アラートを表示する関数を作成する

  func ShowNewQuestionPopup() {
    if newQuestionAlert == nil {
        newQuestionAlert = UIAlertController(title: "Notice", message: "Next Question Starting", preferredStyle: .alert)
        if let newQuestionAlert = newQuestionAlert {
            newQuestionAlert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
                self.newQuestionAlert = nil
                return
            }))
            self.present(newQuestionAlert, animated: true, completion: nil)
         }
     }
 }

ステップ3:アラートを却下する関数を作成する

func autoDismiss() {
    newQuestionAlert?.dismiss(animated: false, completion: nil)
    newQuestionAlert = nil
}

ステップ4:必要に応じて関数を呼び出す

0
Stotch