2016-12-21 2 views
1

с shouldPerforSegue() func Я могу проверить некоторые поля перед тем, как нарисовать, но мне нужно, чтобы продолжить с помощью segue, даже если поля были плохими в то время инициирования segue.Как продолжить segue после проверки полей с shouldPerformSegue() в Swift

Прямо сейчас, когда пользователь нажимает кнопку, которая запускает segue, я проверяю, загружены ли изображения на сервер. Я показываю индикатор выполнения вместе с предупреждением, чтобы указать% слева. Однако прямо сейчас, когда изображение загружается на сервер, индикатор выполнения показывает 100%. Мне все еще нужно вручную щелкнуть «ok» и снова нажать кнопку seguing. Я пытаюсь понять, есть ли способ обойти это препятствие, просто продолжая сце.

Я попытался программным образом запустить кнопку segue после загрузки изображения, но он не работает должным образом.

UIApplication.shared.sendAction(self.saveButton.action!, to: self.saveButton.target, from: nil, for: nil) 

Функция у меня есть, что проверки для проверки:

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool { 
     if ((sender as? UIBarButtonItem) != nil) && uploadingImagesToFirebase { 
      // Create the alert controller 
      let alertController = UIAlertController(title: "Uploading Images...", message: "", preferredStyle: .alert) 
      // Create an ok button 
      let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in 
       print("OK") 
      } 
      alertController.addAction(okAction) 

      self.present(alertController, animated: true, completion: { 
       // Add your progressbar after alert is shown (and measured) 
       let rect = CGRect(x: alertController.view.frame.width * 0.10, y: alertController.view.frame.height/2, width: alertController.view.frame.width * 0.80, height: 100) 
       self.progressView = UIProgressView(frame: rect) 
       alertController.view.addSubview(self.progressView!) 
      }) 

      return false 
     } 
     return true 
    } 
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // If user clicks on a job cell 
     if segue.identifier == "showJobDetails" { 
      ... 
     } 
     else if addJobButton == sender as? UIButton { 
      print("Adding a new job from customer view") 
      ... 
     } 
     // If save button was choice selected by user 
     else if segue.identifier == "identifier { 
      customer.firstName = firstNameTextField.text 
      customer.middleName = middleNameTextField.text 
      customer.lastName = lastNameTextField.text 
      customer.address = addressTextField.text 
      customer.email = emailTextField.text 
      customer.phone = phoneTextField.text 

      customer.jobs = customerJobs 

      updateCustomerValuesInFirebase() 
      updateJobValuesInFirebase() 
     } 
    } 

ответ

1

Перед проверки (с помощью shouldPerformSegue(withIdentifier:sender:)), вы должны выполнить ее первой, вы можете добиться этого с помощью performSegueWithIdentifier:sender::

Инициирует SEGUE с указанным идентификатором из раскадровки файла текущего зрения контроллера.

На самом деле, shouldPerformSegue(withIdentifier:sender:) методы выполняет следующие действия:

Определяет, является ли переход с указанным идентификатором должно быть выполнено .

Так что вы должны сделать:

performSegue(withIdentifier: "identifier", sender: self) 

перед проверкой с помощью shouldPerformSegue(withIdentifier:sender:).

Если вы не знаете, как установить идентификатор для segue, отметьте this answer.

+0

Пусть 'performSegue()' будет первым шагом, после выполнения вы выполните проверку 'shouldPerformSegue()'. Кроме того, 'performSegue()' является заменой 'present' или 'push'. –

+0

Как бы я это делал, если segue - это выход segue? –

+0

Я не понимаю, что вы подразумеваете под выходом segue? –

1

в Swift3, вы должны выполнить переход по этой строке кода:

performSegue(withIdentifier: identifier, sender: sender) 

identifier и sender значения зависит от того, где вы вызываете performSegue, например, если вы находитесь в функции shouldPerformSegue, вы можете использовать функцию input value es, но если вы используете другие функции, вам нужно добавить идентификатор самостоятельно (который вы установили для segue в раскадровке) и установить отправителя на нуль.

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