2017-01-13 2 views
2

Ich verwende den Alert-Controller, um einen Fehler im catch-Block anzuzeigen. Der Benutzer kann es jedoch kaum sehen, bevor es von selbst verschwindet. Was mache ich falsch? Hier ist mein Code.UIAlertController-Panel wird ausgeblendet, bevor der Benutzer antworten kann

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 
    if viewController is CancelInspectionViewController { 
     persistentContainer.viewContext.rollback() 
     self.dismiss(animated: true, completion: nil) 
     return false 
    } else if viewController is SubmitInspectionViewController { 
     do { 
      try persistentContainer.viewContext.save() 
      self.dismiss(animated: true, completion: nil) 
     } catch { 
      _alertController = UIAlertController(title: "Error Saving", message: error.localizedDescription, preferredStyle: .alert) 
      let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 
      _alertController.addAction(defaultAction) 
      present(_alertController, animated:true, completion: { 
       self.dismiss(animated: true, completion: nil) 
      }) 
     } 

Antwort

0

die self.dismiss entfernen (animiert: true, Fertigstellung: nil)

1

Ihr Problem ist, dass self.dismiss(animated: true, completion: nil) an der falschen Stelle genannt wird. Sie rufen dies an, sobald Sie _alertController angezeigt haben. Sie müssen dies nicht wirklich aufrufen, sobald der Alarm-Controller angezeigt wird. Die UIAlertAction übernimmt das Ablehnen.

+0

Ich verwarne nicht die Alarmanzeige, ich verwerfe den Tab-Leiste-Controller. Ich habe den Completion-Block jedoch vollständig entfernt und das Alarm-Panel verschwindet immer noch. –

+0

Was ist, wenn Sie diesen Code in 'tabBarController: didSelectViewController:' verschoben haben. Ich frage mich nur, ob der Alert-Controller wird entlassen, weil Sie wahr (nach dem Code angezeigt), die dann tatsächlich die SubmitInspectionViewController angezeigt wird. – darrenallen7

+0

Ich komme tatsächlich falsch zurück. Was ich will, weil es einen Fehler gab. Der submitInspectionViewController sollte nie angezeigt werden, es ist nur dort, so dass dieser Code ausgeführt wird, dann verwerfe ich den Tab-Leiste-Controller. Ich hatte diesen Code in didSelect auf einmal und es funktionierte dort auch nicht. –

1

Ich habe es herausgefunden! Ich habe falsch verstanden, wie der Alarm-Controller funktioniert. Ich dachte, es würde den Thread blockieren, bis der Benutzer antwortet; Es tut nicht. Also Code später in dieser Funktion wurde das Warnfeld entlassen.

Arbeitscode soll nach dem Vorlegen der Warnung false zurückgeben.

func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 
    if viewController is CancelInspectionViewController { 
     persistentContainer.viewContext.rollback() 
     self.dismiss(animated: true, completion: nil) 
     return false 
    } else if viewController is SubmitInspectionViewController { 
     do { 
      try persistentContainer.viewContext.save() 
      self.dismiss(animated: true, completion: nil) 
     } catch { 
      let alertController = UIAlertController(title: "Error Saving", message: error.localizedDescription, preferredStyle: .alert) 
      let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 
      alertController.addAction(defaultAction) 
      present(alertController, animated:true, completion: nil) 
      return false 
     } 
Verwandte Themen