2017-01-13 2 views
2

Я использую контроллер предупреждений для отображения ошибки в блоке catch. Тем не менее, пользователь может едва увидеть его, прежде чем он исчезнет сам по себе. Что я делаю не так? Вот мой код.Панель UIAlertController исчезает, прежде чем пользователь сможет ответить

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) 
      }) 
     } 

ответ

0

удалить self.dismiss (анимированный: правда, завершение: ноль)

1

Ваш вопрос в том, что self.dismiss(animated: true, completion: nil) вызывается в неправильном месте. Вы вызываете это, как только вы представили _alertController. На самом деле вам не нужно вызывать это, как только появится предупреждающий контроллер. UIAlertAction обрабатывает отклонение.

+0

Я не отклоняю панель предупреждения, я отклоняю контроллер панели вкладок. Однако я полностью удалял блок завершения, и панель предупреждения все еще исчезает. –

+0

Что делать, если вы переместили этот код в 'tabBarController: didSelectViewController:' вместо этого. Мне просто интересно, отклоняется ли диспетчер предупреждений, потому что вы возвращаете true (после отображения кода), который на самом деле вызывает отображение объекта SubmitInspectionViewController. – darrenallen7

+0

Я на самом деле возвращаю ложь. Это то, что я хочу, потому что произошла ошибка. Параметр submitInspectionViewController никогда не должен отображаться, он только там, поэтому этот код будет запущен, а затем я отклоню контроллер панели вкладок. У меня был этот код в didSelect за один раз, и он тоже не работал. –

1

Я понял! Я не понимал, как работает контролер. Я думал, что он заблокирует поток, пока пользователь не ответит; Это не. Поэтому код позже в этой функции отклонил панель предупреждений.

Рабочий код должен возвращать false после представления предупреждения.

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 
     }