Я могу отображать контроллер предупреждений с текстовым полем и правильно получать входные данные текстового поля.
Здесь я хотел сделать две проверки на основе данных текстового поля. 1. Если в текстовом поле нет текста и вы нажали на создание дисплея, введите предупреждение о названии комнаты в метке. 2. если введенный текст совпадает с уже доступной строкой, а затем создать сенсорный дисплей, вы уже создали комнату с таким именем, эти скриншоты показаны ниже.
Здесь проблема заключается в том, что если я сначала не отображаю текстовое предупреждение, а затем второе предупреждение о совпадениях, оба объединяются и отображаются в предупреждении, показанном ниже. я не хочу отображать оба одновременно.
Вот мой полный код для отображения контроллера предупреждений ниже.
@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
}
}
Может кто-нибудь, пожалуйста, предложите мне, я не могу справиться с этими двумя случаями, когда текст ошибки отображается в метке. заранее спасибо.
Вы должны использовать некоторую библиотеку для контроллера предупреждений, которая легко настраивается. Нравится github.com/dillidon/alerts-and-pickers





В вашей части проверки просто установите текст метки в пустую строку перед отображением вашего сообщения.
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)
}
Во первых спасибо за ответ. У меня такая же проблема после замены вашим кодом. пожалуйста, предложите мне другой подход.
вам просто нужно поместить 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 часа. это работает.
@MIOSY, добро пожаловать. Если это поможет вам, вы также можете проголосовать за этот ответ. Спасибо
да, я сделал. Спасибо.
dialogMessage.view.addSubview(label). Не надо. Потому что не рекомендуется настраиватьUIAlertAction. Кроме того, я предполагаю, что метод вызывается дважды?