2017-06-23 2 views
0

サーバに非同期データグラブを実行している間に実行するオーバーレイを作成しましたので、データが取得されるまでUIでボタンを押し続けることはありません終わらせる。私は関数をグローバルなシングルトンクラスに入れました。私は表示または非表示にするかどうかをboolに渡しながら呼び出します。私はそれを表示することができますが、私はそれを隠すことができません。私は今UIALERTCONTROLLERios 10+、Swift 3+ - SingletonインスタンスからUIAlertControllerを却下できません

let modalAlert = UIAlertController(title: "Please Wait...", message: "Loading Data...", preferredStyle: UIAlertControllerStyle.alert) 
    let loadingIndicator = UIActivityIndicatorView(frame: CGRect(x: 10, y: 5, width: 50, height: 50)) 

    func toggleModalProgess(show: Bool) -> Void { 
     print("toggleModalProgess: show = " + String(describing: show)) 
     if (show) { 
      print("let's turn it on") 
      loadingIndicator.hidesWhenStopped = true 
      loadingIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray 
      loadingIndicator.startAnimating() 
      modalAlert.view.addSubview(loadingIndicator) 
      modalAlert.show() 
     }else { 
      print("let's turn it off") 
      modalAlert.hide() 
     } 
    } 

    private init() { } 
} 

MAGICがUIAlertControllerを解任するために

public extension UIAlertController { 
    func show() { 
     let win = UIWindow(frame: UIScreen.main.bounds) 
     let vc = UIViewController() 
     vc.view.backgroundColor = .clear 
     win.rootViewController = vc 
     win.windowLevel = UIWindowLevelAlert + 1 
     win.makeKeyAndVisible() 
     vc.present(self, animated: true, completion: nil) 
    } 
    func hide() { 
     // HERE IS WHERE I NEED TO HIDE IT BUT I AM HAVING ISSUES 
    } 
} 

答えて

4

起こるEXTENSIONを設定するのはここ

class DataModel { 
    static let sharedInstance = DataModel() 
    func accessNetworkData(vc: UIViewController, params: [String:Any], wsURLPath: String, completion: @escaping (_ response: AnyObject) ->()) { 
     DataModel.sharedInstance.toggleModalProgess(show: true) 
     // SHOW THE MODAL HERE ONCE THE DATA IS REQUESTED. 
     let url = URL(string: wsURLPath)! 
     let session = URLSession.shared 
     var request = URLRequest(url: url) 
     request.httpMethod = "POST" 
     do { request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) } catch let error { print(error.localizedDescription) } 
     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 
     let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 
      DataModel.sharedInstance.toggleModalProgess(show: false) 
      // NOW SINCE THE NETWORK ACTIVITY IS DONE, HIDE THE UIALERTCONTROLLER 
      guard error == nil else { 
       print("WEB SERVICE ERROR <----------------------------<<<<<< " + wsURLPath) 
       print(error!) 
       let resp: [String: String] = [ "conn": "failed" ] 

       DispatchQueue.main.async { completion(resp as NSDictionary) } 
       return 
      } 
      guard let data = data else { 
       print("WEB SERVICE ERROR <----------------------------<<<<<< " + wsURLPath) 
       return 
      } 
      do { 
       if let parsedJSON = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { 
        print("WEB SERVICE SUCCESS <----------------------------<<<<<< "+wsURLPath+" "+String(describing:params)) 
        if let parsedResponseDict = parsedJSON["d"] as? NSDictionary { 
         DispatchQueue.main.async { 
          completion(parsedResponseDict) 
         } 
        }else if let parsedResponseArr = parsedJSON["d"] as? NSArray { 
         DispatchQueue.main.async { 
          completion(parsedResponseArr) 
         } 
        }else { 
         print("INVALID KEY <----------------------------<<<<<< " + wsURLPath) 
         DispatchQueue.main.async { 
          completion(parsedJSON as AnyObject) 
         } 
        } 
       } 
      } catch let error { 
       print("Error with JSON Serialization") 
       print(error.localizedDescription) 
      } 
     }) 
     task.resume() 
    } 

である(IS:ここにコードがありますUIViewControllerのサブクラス)では、dismissメソッドを呼び出すには十分でなければなりません。

func hide() { 
    dismiss(animated: true, completion: nil) 
} 

サンプルプロジェクトで正常に動作します。

あなたがすべき
0

...

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

は、それが

を役に立てば幸い
関連する問題