UIAlertController с предупреждением о проверке текстового поля, отображающим проблему в swift ios

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

Здесь я хотел сделать две проверки на основе данных текстового поля. 1. Если в текстовом поле нет текста и вы нажали на создание дисплея, введите предупреждение о названии комнаты в метке. 2. если введенный текст совпадает с уже доступной строкой, а затем создать сенсорный дисплей, вы уже создали комнату с таким именем, эти скриншоты показаны ниже.

UIAlertController с предупреждением о проверке текстового поля, отображающим проблему в swift iosUIAlertController с предупреждением о проверке текстового поля, отображающим проблему в swift iosUIAlertController с предупреждением о проверке текстового поля, отображающим проблему в swift ios

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

UIAlertController с предупреждением о проверке текстового поля, отображающим проблему в swift ios

Вот мой полный код для отображения контроллера предупреждений ниже.

    @IBAction func getAlertBtn(_ sender: Any) {
    alertControllerWithTf()
}
var roomTextField: UITextField!
func alertControllerWithTf(){
    let dialogMessage = UIAlertController(title: "New Room", message: nil, preferredStyle: .alert)
    let Create = UIAlertAction(title: "Create", style: .default, handler: { (action) -> Void in
        if let userInput = self.roomTextField!.text {
            let label = UILabel(frame: CGRect(x: 0, y: 40, width: 270, height:18))
            label.textAlignment = .center
            label.textColor = .red
            label.font = label.font.withSize(12)
            dialogMessage.view.addSubview(label)
            label.isHidden = true
            if userInput == ""{
                label.text = "Please enter room name to create."
                label.isHidden = false
                self.present(dialogMessage, animated: true, completion: nil)

            }else if self.haveSameRoomName(createdRoomName: userInput){
                label.text = "You've already created room with this name."
                label.isHidden = false
                self.present(dialogMessage, animated: true, completion: nil)
            }else{
                print("Create button success block called do stuff here....")
            }
        }
    })
    let cancel = UIAlertAction(title: "Cancel", style: .default) { (action) -> Void in
        print("Cancel button tapped")
    }

    //Add OK and Cancel button to dialog message

    dialogMessage.addAction(Create)
    dialogMessage.addAction(cancel)
    // Add Input TextField to dialog message
    dialogMessage.addTextField { (textField) -> Void in
        self.roomTextField = textField
        self.roomTextField?.placeholder = "Please enter room name"
    }
    // Present dialog message to user
    self.present(dialogMessage, animated: true, completion: nil)
}
func haveSameRoomName(createdRoomName: String) -> Bool{
    let allRoomNames =  ["FIRST", "SECOND", "THIRD", "FOURTH", "FIFTH","SIXTH"]
    if allRoomNames.contains(createdRoomName){
        return true
    }else{
        return false
    }
}

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

dialogMessage.view.addSubview(label). Не надо. Потому что не рекомендуется настраивать UIAlertAction. Кроме того, я предполагаю, что метод вызывается дважды?
Larme 06.03.2019 12:40

Вы должны использовать некоторую библиотеку для контроллера предупреждений, которая легко настраивается. Нравится github.com/dillidon/alerts-and-pickers

Muhammad Zohaib Ehsan 06.03.2019 12:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
2 863
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашей части проверки просто установите текст метки в пустую строку перед отображением вашего сообщения.

if userInput == "" {
    label.text = "" *// Put this in your code*
    label.text = "Please enter room name to create."
    label.isHidden = false
    self.present(dialogMessage, animated: true, completion: nil)

     } else if self.haveSameRoomName(createdRoomName: userInput){
         label.text = ""  *// Put this in your code*
         label.text = "You've already created room with this name."
         label.isHidden = false
         self.present(dialogMessage, animated: true, completion: nil)
     }

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

iOSDude 06.03.2019 12:53
Ответ принят как подходящий

вам просто нужно поместить UILabel код вне блока «Создать» UIAlertAction вот так.

Эта строка (внутри блока действий «Создать») вызывает проблему --> dialogMessage.view.addSubview(label)

Я надеюсь, что это поможет вам.

func alertControllerWithTf() {
    let dialogMessage = UIAlertController(title: "New Room", message: nil, preferredStyle: .alert)
    let label = UILabel(frame: CGRect(x: 0, y: 40, width: 270, height:18))
    label.textAlignment = .center
    label.textColor = .red
    label.font = label.font.withSize(12)
    dialogMessage.view.addSubview(label)
    label.isHidden = true

    let Create = UIAlertAction(title: "Create", style: .default, handler: { (action) -> Void in
        if let userInput = self.roomTextField!.text {
            if userInput == "" {
                label.text = ""
                label.text = "Please enter room name to create."
                label.isHidden = false
                self.present(dialogMessage, animated: true, completion: nil)

            }
            else if self.haveSameRoomName(createdRoomName: userInput){
                label.text = ""
                label.text = "You've already created room with this name."
                label.isHidden = false
                self.present(dialogMessage, animated: true, completion: nil)
            }
            else{
                print("Create button success block called do stuff here....")
            }
        }
    })
    let cancel = UIAlertAction(title: "Cancel", style: .default) { (action) -> Void in
        print("Cancel button tapped")
    }

    //Add OK and Cancel button to dialog message

    dialogMessage.addAction(Create)
    dialogMessage.addAction(cancel)
    // Add Input TextField to dialog message
    dialogMessage.addTextField { (textField) -> Void in
        self.roomTextField = textField
        self.roomTextField?.placeholder = "Please enter room name"
    }

    // Present dialog message to user
    self.present(dialogMessage, animated: true, completion: nil)
}

ДА. СПАСИБО БОЛЬШОЕ. Это съело мой мозг с 1 часа. это работает.

iOSDude 06.03.2019 13:02

@MIOSY, добро пожаловать. Если это поможет вам, вы также можете проголосовать за этот ответ. Спасибо

Kuldeep 06.03.2019 13:10

да, я сделал. Спасибо.

iOSDude 06.03.2019 13:11

Другие вопросы по теме