2015-06-17 2 views
0

На самом деле у меня есть один контроллер вида с 4 способами. 3 метода используют для отображения UIAlertController без кнопки действия типа «ok» или «cancel». Только название и сообщение. Окончательные методы отклонения этих UIAlertController. Одно из моих оповещений показывает, когда запрашивает асинхронный вызов. Когда мы получим результаты, он будет уходить и скрываться.Как полностью отключить uialertcontroller?

Проблема заключается в том, что мое первое предупреждение отображается, и внезапно потерянное соединение потеряно, а другое предупреждение, которое отображает сообщение об ошибке «Интернет-Потерянный» из-за этого предупреждения.

2015-06-17 13:49:04.787 myauction[2404:40506] Warning: Attempt to present <UIAlertController: 0x7f8d136bafa0> on <myauction.AuctionLatestViewController: 0x7f8d13771180> while a presentation is in progress! 

Это означает, что я не могу успешно отменить первое предупреждение. Любая помощь, пожалуйста?

Вот myAlertController

import UIKit 

class MyAlertViewController:UIViewController{ 

var myAlertController : UIAlertController! 

func displayLoadingAlert(viewController: UIViewController?) -> UIAlertController { 

    var controllerToPresent = viewController 
    if controllerToPresent == nil { 
     controllerToPresent = self 
    } 

    //create an alert controller 
    myAlertController = UIAlertController(title: "Loading...", message: "We are getting the data,Please Wait", preferredStyle: .Alert) 

    let indicator = UIActivityIndicatorView() 
    indicator.color = UIColor.redColor() 
    indicator.setTranslatesAutoresizingMaskIntoConstraints(false) 
    myAlertController.view.addSubview(indicator) 

    let views = ["pending" : myAlertController.view, "indicator" : indicator] 
    var constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[indicator]-(7)-|", options: nil, metrics: nil, views: views) 
    constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[indicator]|", options: nil, metrics: nil, views: views) 
    myAlertController.view.addConstraints(constraints) 

    indicator.userInteractionEnabled = false 
    indicator.startAnimating() 

    controllerToPresent!.presentViewController(myAlertController, animated: true, completion: nil) 

    return myAlertController 
} 

func connectionErrorAlert(viewController: UIViewController?) -> UIAlertController { 

    var controllerToPresent = viewController 
    if controllerToPresent == nil { 
     controllerToPresent = self 
    } 

    //create an alert controller 
    myAlertController = UIAlertController(title: "Not Connected", message: "No Internet Connection", preferredStyle: .Alert) 
    let defaultAction = UIAlertAction(title: "OK", style: .Default,handler:nil) 
    myAlertController.addAction(defaultAction) 

    controllerToPresent!.presentViewController(myAlertController, animated: true, completion: nil) 

    return myAlertController 
} 

func requestTimeOutErrorAlert(viewController: UIViewController?) -> UIAlertController { 

    var controllerToPresent = viewController 
    if controllerToPresent == nil { 
     controllerToPresent = self 
    } 

    //create an alert controller 
    myAlertController = UIAlertController(title: "Request Time Out", message: "Please Tap Retry to Get The Data", preferredStyle: .Alert) 
    let defaultAction = UIAlertAction(title: "OK", style: .Default,handler:nil) 
    myAlertController.addAction(defaultAction) 

    controllerToPresent!.presentViewController(myAlertController, animated: true, completion: nil) 

    return colayAlertController 
} 

func dismissLoadingAlert(){ 
    myAlertController.dismissViewControllerAnimated(true, completion: nil) 
} 

} 

Вот мой ViewController (обратите внимание, я не показывать инициализацию myAlertViewController)

func getResults{ 
    api.searchCar() 
    //This is where i start to load my first alert every time it call 
    self.myAlertViewController = displayLoadingAlert(self) 
} 

func didReceiveAPIResults(results: NSDictionary,headers:JSON) { 
    dispatch_async(dispatch_get_main_queue(), { 
      //do about showing the results.... 

      //Then i dismiss my first loading alert 
      self.myAlertController.dismissViewControllerAnimated(true){} 
    }) 
} 

func didNotReceiveAPIResults(results: Bool,error:NSError){ 
    dispatch_async(dispatch_get_main_queue(), { 
     //I did dismiss the first alert before i gonna show another one 
     self.myAlertController.dismissViewControllerAnimated(true){ 
     if (results) { 
      if error.localizedDescription == "The Internet connection appears to be offline."{ 
       self.myAlertViewController = connectionErrorAlert(self) 
       self.carTableView.hidden=true 
       self.retryButton?.hidden=false 
       self.retryButton?.enabled=true 
      } 
      if error.localizedDescription == "Request Time Out."{ 
       self.myAlertViewController = requestTimeOutErrorAlert(self) 
       self.carTableView.hidden=true 
       self.retryButton?.hidden=false 
       self.retryButton?.enabled=true 
      } 

     }else{ 
      //self.myAlertController.displayLoadingAlert(self) 
      self.retryButton?.hidden=true 
      self.retryButton?.enabled=false 
      self.carTableView.hidden=false 
      self.carTableView.reloadData() 
     } 
     } 
    }) 
} 

ответ

2

Вы должны вставить код в completion блоке метода dismissViewControllerAnimated до представления другой ViewController модально.

Взгляните на код, который я обновляемой:

func didNotReceiveAPIResults(results: Bool,error:NSError){ 
    dispatch_async(dispatch_get_main_queue(), { 
     // 
     // I'm calling your error message in the completion block of the 
     // dismissViewControllerAnimated Method 
     // 
     self.myAlertController.dismissViewControllerAnimated(true) { 
     if (results) { 
      if error.localizedDescription == "The Internet connection appears to be offline."{ 
       self.myAlertController.connectionErrorAlert(self) 
      } 

      if error.localizedDescription == "Request Time Out."{ 
       self.myAlertController.requestTimeOutErrorAlert(self) 
      } 

      // 
      // Moved this code out of your if-statements since they are called 
      // no matter which case is true 
      // 
      self.carTableView.hidden=true 
      self.retryButton?.hidden=false 
      self.retryButton?.enabled=true 
     } else { 
      //self.myAlertController.displayLoadingAlert(self) 
      self.retryButton?.hidden=true 
      self.retryButton?.enabled=false 
      self.carTableView.hidden=false 
      self.carTableView.reloadData() 
     } 
     } 
    }) 
} 
+0

Я получаю ошибку от этого, было бы умом, пожалуйста, еще раз проверьте? Спасибо –

+0

извините. закрывая скобки, где неправильно. проверьте конец строк. – ezcoding

+0

Первое предупреждение «Загрузка» не отклоняется, даже когда я собираюсь отобразить другое предупреждение. Мне тоже нужно изменить этот func removeLoadingAlert(). Если вам нужны методы myalertController, я могу предоставить вам. –

0

Прежде всего, я делал ошибку, потому что я создаю новый ViewController для предупреждения вместо определения extension.So, если некоторые начинающий, который ищет результаты, не нравится мой код выше. Вот и ответ.

Если вы хотите добавить специальное предупреждение, используйте расширение, подобное этому.

import UIKit 

extension UIAlertController { 

class func displayLoadingAlert() -> UIAlertController { 

    //create an alert controller 
    let myAlertController = UIAlertController(title: "Loading...", message: "We are getting the data,Please Wait...", preferredStyle: .Alert) 

    let indicator = UIActivityIndicatorView() 
    indicator.color = UIColor.redColor() 
    indicator.setTranslatesAutoresizingMaskIntoConstraints(false) 
    myAlertController.view.addSubview(indicator) 

    let views = ["pending" : myAlertController.view, "indicator" : indicator] 
    var constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:[indicator]-(7)-|", options: nil, metrics: nil, views: views) 
    constraints += NSLayoutConstraint.constraintsWithVisualFormat("H:|[indicator]|", options: nil, metrics: nil, views: views) 
    myAlertController.view.addConstraints(constraints) 

    indicator.userInteractionEnabled = false 
    indicator.startAnimating() 

    return myAlertController 
} 

class func connectionErrorAlert() -> UIAlertController { 

    let myAlertController = UIAlertController(title: "Not Connected", message: "No Internet Connection", preferredStyle: .Alert) 
    let defaultAction = UIAlertAction(title: "OK", style: .Default,handler:nil) 
    myAlertController.addAction(defaultAction) 
    return myAlertController 
} 

class func requestTimeOutErrorAlert() -> UIAlertController { 
    // same as above 
} 
} 

Тогда как использовать его с других контроллеров отображения (для отображения и увольнения)

class ViewController : UIViewController{ 

     var myAlert : UIAlertController! 
     //For displaying the one of the alert 
     func getResults(){ 
      myAlert = UIAlertController.displayLoadingAlert() 
      self.presentViewController(myAlert, animated: true, completion: nil) 
     } 
     //For dismissing the alert,please add the code in the completion that will do after dismiss 
     func afterGettingResults(){ 
      self.myAlert.dismissViewControllerAnimated(true){ 
       //do your job after dismiss is done 
      } 
     } 
} 

Надежда этой помощи, everyone.Thanks к @ezCoding, которые пытаются помочь мне выйти из этой темной ошибки и показать мне свет к успеху.

 Смежные вопросы

  • Нет связанных вопросов^_^