【问题标题】:UIAlertController with textfield validation alert displaying issue in swift ios带有文本字段验证警报的 UIAlertController 在 swift ios 中显示问题
【发布时间】:2019-03-06 11:37:28
【问题描述】:

我能够显示带有文本字段的警报控制器并正确获取文本字段输入数据。

在这里,我想根据文本字段数据进行两次验证。 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
    }
}

有人可以建议我我无法处理标签中显示的这两种情况错误文本。提前致谢。

【问题讨论】:

  • dialogMessage.view.addSubview(label)。别。因为不建议自定义UIAlertAction。另外,我猜这个方法被调用了两次?
  • 你应该为警报控制器使用一些库,它很容易定制。喜欢github.com/dillidon/alerts-and-pickers

标签: ios swift xcode uialertview uialertcontroller


【解决方案1】:

您只需要像这样将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,欢迎您,如果这对您有帮助,那么您也可以UPVote 这个答案。谢谢
  • 是的,我做到了。谢谢。
【解决方案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)
     }

【讨论】:

  • 首先感谢您的回复。替换为您的代码后,我遇到了同样的问题。请用另一种方法建议我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
相关资源
最近更新 更多