アップロードが進行中であることをユーザーに通知するだけであるため、ボタンなしの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)
}
_
通常、親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)
for Swiftあなたができること:
nameOfYourAlertController.dismiss(animated: true, completion: nil)
trueは消失をアニメーション化し、falseはアラートを突然削除します
短時間表示された後、自動的に終了するアラートを投稿する場合は、次の方法を使用できます。
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)
})
}
AlertControllerの独自のメソッドを使用して、自身を破棄します。
UIAlertController *alertController = [UIAlertController
alertControllerWithTitle:...];
[alertController dismissViewControllerAnimated:YES completion:nil];
上記の機能は何も動作していないように見えますが、ここで完璧に動作します(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:必要に応じて関数を呼び出す