You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5中如何在UIAlertController中设置下拉选择菜单?

替换UIAlertController中的文本框为1-5数字下拉菜单

要把第二个文本框改成1-5的下拉选择菜单,可以通过给文本框设置inputView为UIPickerView实现,同时添加工具栏方便用户确认选择。以下是修改后的完整代码:

class YourViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    // 优先级选项数据
    private let priorityOptions = ["1", "2", "3", "4", "5"]
    
    func showAddProjectAlert() {
        // 创建弹窗控制器
        let alertController = UIAlertController(title: "Add New Project", message: "Begin an empty project here.", preferredStyle: .alert)

        // 添加第一个文本框(项目名称)
        alertController.addTextField(configurationHandler: {(_ textField: UITextField) -> Void in
            textField.placeholder = "Project Name"
        })

        // 添加第二个文本框(改为下拉选择)
        alertController.addTextField(configurationHandler: {[weak self] (_ textField: UITextField) -> Void in
            guard let self = self else { return }
            
            textField.placeholder = "What is the Priority?"
            // 替换输入视图为选择器
            textField.inputView = self.createPriorityPickerView()
            // 添加带确认按钮的工具栏
            textField.inputAccessoryView = self.createPickerToolbar(for: textField)
            // 默认选中第一个优先级
            textField.text = self.priorityOptions.first
        })

        // 确认按钮事件
        let confirmAction = UIAlertAction(title: "Add Project", style: .default, handler: {(_ action: UIAlertAction) -> Void in
            guard let projectName = alertController.textFields?[0].text,
                  let priorityText = alertController.textFields?[1].text,
                  let priority = Int(priorityText) else {
                return
            }
            print("Project Name: \(projectName), Priority: \(priority)")
        })
        alertController.addAction(confirmAction)
        
        // 取消按钮事件
        let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {(_ action: UIAlertAction) -> Void in
            print("Cancelled")
        })
        alertController.addAction(cancelAction)

        // 展示弹窗
        present(alertController, animated: true, completion: nil)
    }
    
    // 创建优先级选择器
    private func createPriorityPickerView() -> UIPickerView {
        let pickerView = UIPickerView()
        pickerView.dataSource = self
        pickerView.delegate = self
        return pickerView
    }
    
    // 创建选择器的工具栏(带确认按钮)
    private func createPickerToolbar(for textField: UITextField) -> UIToolbar {
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44))
        let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(didTapDoneButton(_:)))
        doneButton.tag = textField.hash // 标记文本框,方便后续识别
        toolbar.items = [flexSpace, doneButton]
        toolbar.sizeToFit()
        return toolbar
    }
    
    // 确认按钮点击事件:关闭选择器
    @objc private func didTapDoneButton(_ sender: UIBarButtonItem) {
        guard let textField = view.viewWithTag(sender.tag) as? UITextField else { return }
        textField.resignFirstResponder()
    }
    
    // MARK: - UIPickerView 数据源与代理方法
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1 // 单列选择器
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return priorityOptions.count // 5个选项
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return priorityOptions[row] // 返回对应行的优先级文本
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // 将选中的优先级同步到文本框
        if let textField = presentedViewController?.textFields?[1] {
            textField.text = priorityOptions[row]
        }
    }
}

关键说明:

  • 替换文本框的inputView为UIPickerView,点击文本框时会弹出选择器而非默认键盘。
  • 添加inputAccessoryView工具栏,用户点击"Done"可关闭选择器,优化交互流程。
  • 实现UIPickerView的数据源和代理方法,提供1-5的选项数据,并同步选中值到文本框。
  • 确认按钮回调中可直接获取文本框的有效值,无需处理用户手动输入的异常情况。

内容的提问来源于stack exchange,提问作者Lionel Yu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:20:34