#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. знаете ли вы способ реализовать это