2017-03-28 8 views
0

私は、ビューコントローラのviewDidLoad関数に存在するボタンを持たないUIAlertControllerを持っています。私は警告を提示した後、私は、データベースから情報を取得する機能を実行すると、私は、ユーザーが進むことができるようにアラートを却下したい、これが行われた後しかしアラートが実行した後に却下していないよう:個別の関数からUIAlertControllerを却下する

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

Iをまた、運に次の行を関数の引数としての私のuialertcontrollerを渡し、実行しようとしている:

alertController.dismiss(animated: false, completion: nil) 

EDIT:これは私のviewDidLoad機能だけでなく、警告

override func viewDidLoad() { 
    super.viewDidLoad() 

    let alertController = UIAlertController(title: "Loading", message: 
     "This might take a moment", preferredStyle: UIAlertControllerStyle.alert) 

    self.present(alertController, animated: true, completion: nil) 
    hideAlert(alert: alertController) 
} 

func hideAlert(alert: UIAlertController) { 
let hideAlertController = {() -> Void in 
alertController.dismiss(animated: false, completion: nil) 
} 
FIRDatabase.database().reference().child("info").observeSingleEvent(of: .value, with: { (dataSnapshot) in 
     DispatchQueue.main.async { 
      hideAlertController() 
     } 
    }) 
} 
を却下すべき機能です

答えて

2

あなたのViewControllerの内側に、このいずれかを試してみてください:

var operationPerformed : Bool = false; 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning(); 
    // Dispose of any resources that can be recreated. 
} 

override func viewDidLoad() { 
    super.viewDidLoad(); 
} 
override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated); 
    if(!self.operationPerformed){ 
     let alertController = UIAlertController(title: "Loading", message: 
      "This might take a moment", preferredStyle: UIAlertControllerStyle.alert); 
     self.present(alertController, animated: true, completion: nil); 
     self.performOperation(alertToBeClosedOnFinish: alertController); 
    } 
} 

func performOperation(alertToBeClosedOnFinish: UIAlertController) { 
    let hideAlertController = {() -> Void in 
     alertToBeClosedOnFinish.dismiss(animated: false, completion: nil) 
    } 
    DispatchQueue.global().asyncAfter(deadline: .now() + 2, execute: { 
     DispatchQueue.main.async { 
      hideAlertController(); 
      self.operationPerformed = true; 
     } 
    }); 
} 

アイデアは、それは所有者の場合にアラートコントローラを示すことである階層にあると私はあなたが右理解している場合 - 、あなたは一度それを呼びたいです操作が既に実行されているかどうかを確認する必要があります。

ただし、UIViewのサブクラスとして進行状況ビューを作成してスーパービューに追加または削除することができる場合は、警告コントローラを使用することが欠点です。さらに、これを達成するのに役立つポッドがたくさんあります。

敬具、 セルゲイ

0

データベースから情報を取得する機能は、別のスレッドで実行されていますか?その場合、そのスレッドからUIを更新することはできません。 UIの更新はメインスレッドでのみ発生します。

これでコードをラップするとどうなりますか? :)

DispatchQueue.main.async { 
    alertController.dismiss(animated: false, completion: nil) 
} 
+1

私はしかし、ラッピングした後、私は別のスレッドで実行しないクロージャの内部でアラートを解任しようとすることを言及するのを忘れてしまった編集に言ったように私はまた、オリジナルのポストを更新 – XvKnightvX

2

viewDidAppear(_:)の方法でアラートを表示してください。そうでない場合は、ビューがウィンドウ階層にないエラーが表示されます。

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    let alertController = UIAlertController(title: "Loading", message: 
     "This might take a moment", preferredStyle: UIAlertControllerStyle.alert) 

    self.present(alertController, animated: true, completion: nil) 
} 

func hideAlert(alert: UIAlertController) { 

    let hide = {() -> Void in 
     alert.dismiss(animated: true, completion: nil) 
    } 

    let task = URLSession.shared.dataTask(with: URL(string: "https://www.google.com/")!) { (data, response, error) in 

     print("error: \(error)") 

     DispatchQueue.main.async { 
      hide() 
     } 
    } 
    task.resume() 
} 

これは機能しています。

enter image description here

+0

私はviewDidAppearでアラートを却下しようとしましたが、それを提示した直後には解消されませんでした(もし、 – XvKnightvX

+0

URLからデータを読み込み、完了したらアラートを非表示にすると仮定しました。私の更新を見ることができます! –

+0

私はDispatchQueue.main.asyncの内部のクロージャを呼び出すことは私のためには動作しませんが、主なものとは別のスレッドで実行されるfirebaseリアルタイムデータベースから実際にデータを取得しています。 – XvKnightvX

関連する問題