【问题标题】:If UITextField is blank UIAlert does not appear如果 UITextField 为空 UIAlert 不会出现
【发布时间】:2019-05-01 19:23:45
【问题描述】:

我有一个带有 4 个 UITextFields 的应用程序,如果 UITextfield 为空白,我想做的是显示 UIAlert。我有我选择显示的UIAlert的功能如下:

func displayMyAlertMessage(userMessage: String) {
    let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertController.Style.alert)
    let okAction = UIAlertAction(title: "Ok", style: UIAlertAction.Style.default, handler: nil)
    myAlert.addAction(okAction)
    self.present(myAlert, animated: true, completion: nil)
}

我查看了这个example 并无法让它工作,因为我有 UIPickerView 来显示文本。下面是我为 didSelectRow 编写的代码:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if TrackTextField.isFirstResponder {
        selectedTrack = tracks[row]
        guard let track = selectedTrack?.isEmpty else {
            displayMyAlertMessage(userMessage: "You have to fill in a track")
            return
        }
        TrackTextField.text = String(track)
    } else if firstTextField.isFirstResponder {
        firstDriver = drivers[row]
        firstTextField.text = firstDriver
    } else if secondTextField.isFirstResponder {
        secondDriver = drivers[row]
        secondTextField.text = secondDriver
    } else if thirdTextField.isFirstResponder {
        thirdDriver = drivers[row]
        thirdTextField.text = thirdDriver
    }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController
        self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!))
        vc.grandPrix = self.grandPrix


    }
}

我使用 TrackTextField 来测试警报是否有效。当我点击 Grandprix Predictor 时,UIAlert 不会出现。下面是 segue 到下一个 UIViewController 的函数。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "getPredictor" {
        let predictorVC = segue.destination as! UINavigationController
        let vc = predictorVC.topViewController as! PredictorTableViewController
        self.grandPrix.append(GrandPrix(granPrix: TrackTextField.text!, firstDriver: firstTextField.text!, secondDriver: secondTextField.text!, thirdDriver: thirdTextField.text!))
        vc.grandPrix = self.grandPrix


    }

任何帮助将不胜感激。

【问题讨论】:

    标签: ios swift uitextfield uialertcontroller uipickerviewcontroller


    【解决方案1】:

    您的检查不应在选取器视图委托中完成。

    答案实际上取决于您甚至想使用什么来触发检查。您很可能希望在用户填写所有四个文本字段后单击某个按钮时进行检查。

    添加一个verifyInput 方法。比如:

    func verifyInput() -> Bool {
        if TrackTextField.text?.isEmpty || firstTextField.text?.isEmpty || secondTextField.text?.isEmpty || thirdTextField.text?.isEmpty {
            // at least one is empty, show your alert here
            return false
        } else {
            return true // all good
        }
    }
    

    然后从某个按钮处理程序或shouldPerformSegue 调用verifyInput。同样,这取决于您要使用什么事件来触发检查。

    例子:

    override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
        // Only validate for this specific segue
        if identifier == "getPredictor" {
            return verifyInput()
        } else {
            return true
        }
    }
    

    根据需要调整逻辑。

    【讨论】:

    • 我对 validateInput 位有点困惑。不确定我将如何在准备中使用 verifyInput 函数(对于 segue:UIStoryboardSegue,发件人:Any?)?
    • 你不要在prepare中使用它。为时已晚。这就是为什么我向您展示了使用 shouldPerformSegue 的清晰示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多