как сравнить введенный текст со строкой в терминах пароля, чтобы запустить новый переход

#ios #swift

#iOS #swift

Вопрос:

У меня есть запущенное приложение, в котором есть переходы, к которым есть вопросы, и которое передает данные из одного перехода в другой.

Мне нужно добавить пароль к моей последней кнопке, которая запускает событие передачи данных на контроллер последнего просмотра и показывает данные пользователю, у которого есть пароль.

У меня есть код, который передает код на последнюю страницу, и у меня есть код, который передает пользователю предупреждение о вводе пароля.

моя проблема в том, есть ли у меня что-то для перехода перед загрузкой страницы с предупреждением, и не имеет значения, введено ли ключевое слово или нет. если переход выполняется после предупреждения, ничего не происходит, независимо от того, что введено в текстовое поле.

 @IBAction func DataReveal(_ sender: UIButton)
{
     ID = ID2.text
     date = date2.text
     Answer1 = answ1.text
     Answer2 = answ2.text
     switch sender.tag
     {
     case 1: send = "Thanks"
     default: print("No Selection")
     }
     let alertController = UIAlertController(title: "Password check", message: "Enter Password to see collected data", preferredStyle: .alert)
        alertController.addTextField
        {
            textField in
            textField.placeholder = "Enter Password"
            textField.isSecureTextEntry = true
        }
        let confirmActionBtn = UIAlertAction(title: "OK", style: .default)
        {
            [weak alertController] _ in
            guard let alertController = alertController, let textField = alertController.textFields?.first else
            {
                return
            }
            print("Password is (String(describing: textField.text))")

            //Just compare Entered String in textfield with your original password password
            //if password is matched push or segue your required controller
        }
        alertController.addAction(confirmActionBtn)
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alertController.addAction(cancelAction)
        self.present(alertController, animated: true, completion: nil)
        self.performSegue(withIdentifier: "Link6", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "Link6", let destination = segue.destination as? DataviewController
        {
            destination.Answer2 = self.Answer2
            destination.Answer1 = self.Answer1
            destination.ID = self.ID
            destination.date = self.date
            destination.send = self.send
        }
    }
  

Я внес изменения, упомянутые в одном из предоставленных ответов, я попытался запустить код, но все еще есть другая проблема, потому что он по-прежнему не сравнивает текстовое поле со строковой переменной password, и когда пароль введен, не выполняется никакого перемещения по переходу.

  @IBAction func DataReveal(_ sender: UIButton)
    {
        ID = ID2.text
        date = date2.text
        Answer1 = answ1.text
        Answer2 = answ2.text
        switch sender.tag
        {
        case 1: send = "current data collected"
        default: print("No Selection")
        }
        let alertController = UIAlertController(title: "Password check", message: "Enter Password to see collected data", preferredStyle: .alert)
        alertController.addTextField
        {
            textField in
            textField.placeholder = "Enter Password"
            textField.isSecureTextEntry = true
        }
        let confirmActionBtn = UIAlertAction(title: "OK", style: .default)
        {
            [weak alertController] _ in
            guard let alertController = alertController, let textField = alertController.textFields?.first else
            {
                return
            }
            print("Password is (String(describing: textField.text))")
            func performSegue(withIdentifier identifier: String, sender: Any?) -> Bool
            {
                if identifier == "Link6"
                {
                    if (textField.text == self.password)
                    {
                        return true
                    }
                }
                return false
            }
        }
        alertController.addAction(confirmActionBtn)
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        alertController.addAction(cancelAction)
        self.present(alertController, animated: true, completion: nil)
        //self.performSegue(withIdentifier: "Link6", sender: self)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        if segue.identifier == "Link6", let destination = segue.destination as? DataviewController
        {
            destination.Answer2 = self.Answer2
            destination.Answer1 = self.Answer1
            destination.ID = self.ID
            destination.date = self.date
            destination.send = self.send
        }
    }
  

Ответ №1:

Это делается в методе shouldPerformSegue.

 override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {

    if identifier == "FirstToUsersSegue" {
        if (userText.text == username amp;amp; passText.text == password) {
            return true
        }
    }

    return false
}
  

Комментарии:

1. я добавил код, который вы предоставили, я получаю сообщение об ошибке в passText.text

2. Не должно быть необходимости использовать shouldPerformSegue(withIdentifier:sender:) . Этот метод обычно используется для предотвращения запуска перехода после того, как он уже был запущен. Например, у вас может быть кнопка, которая запускает переход, но по какой-то причине может потребоваться запретить ее запуск. Поскольку у вас есть полный контроль над тем, когда запускается переход, вам не нужно реализовывать этот метод.

3. как бы вы это реализовали

4. Это пример, вам придется использовать в нем свои собственные идентификаторы и переменные. Но логика верна.

Ответ №2:

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

Если вы не хотите выполнять переход до тех пор, пока предупреждение не будет отклонено, вам нужно будет поместить вызов в performSegue(withIdentifier:sender:) внутри confirmActionBtn обработчика.

Комментарии:

1. да, я добавил код внутри подтверждения, я просто получаю ошибку в файле passText.text, который парень предоставил ранее

2. знаете ли вы способ реализовать это