【问题标题】:Swift 5: How can get the selected PickerView value inside a UIAlert Textfield?Swift 5:如何在 UIAlert 文本字段中获取选定的 PickerView 值?
【发布时间】:2021-11-24 16:54:36
【问题描述】:

我正在努力在 UIAlert 中实现 UIPickerView 作为文本字段的输入。这就是我所拥有的(想想一个简单的 TODO 应用程序);

import UIKit

class ViewController: UIViewController {
    
    let todoItemCategory = ["Work", "Home", "Friends", "Buy stuff"]
    let pickerView = UIPickerView()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        pickerView.dataSource = self
        pickerView.delegate = self
    }

    @IBAction func addItemButtonPressed(_ sender: Any) {
        let alert = UIAlertController(title: "Add a new todo item", message: "Provide the title and the category of the new item.", preferredStyle: .alert)
        
        alert.addTextField { field in
            field.placeholder = "Type the item title"
            field.returnKeyType = .next
        }
        alert.addTextField { field in
            field.placeholder = "Select category"
            
            field.inputView = self.pickerView
        }
        
        alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        alert.addAction(UIAlertAction(title: "Save", style: .default, handler: { _ in
            guard let fields = alert.textFields, fields.count == 2 else {
                return
            }
            let itemTitleField = fields[0]
            let categoryField = fields[1]
            
            guard let itemTitle = itemTitleField.text, !itemTitle.isEmpty, let category = categoryField.text, !category.isEmpty else {
                print("Invalid entries")
                return
            }
            
            print(itemTitle)
            print(category)
            
        }))
        
        present(alert, animated: true)
    }
}

//MARK: - Pickerview datasource & delegate methods

extension ViewController: UIPickerViewDataSource {
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return todoItemCategory.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return todoItemCategory[row]
    }
    
    
}

extension ViewController: UIPickerViewDelegate {
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // Update the textfield inside the UIAlert
    }
}

我所做的是;

  • 当用户单击按钮 (addItemButtonPressed) 时会弹出 UIAlert 视图。
  • 在“选择类别”文本字段中,我链接到 PickerView 作为输入视图。然后,带有可能类别的 Pickerview 将显示为可选选项。

选择器视图看起来不错,但无论何时用户选择其中一个值,都不会发生任何事情。我希望文本字段显示所选类别,并且我知道我需要在里面做一些事情

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        // Update the textfield inside the UIAlert
    }

我打算将选定的值分配给一个全局变量,比如说 currentSelectedCategory,但我不知道如何让 UIAlert 文本字段在值发生更改时再次读取它。

提前感谢您对这个可怜的 swift 新手的帮助!

【问题讨论】:

    标签: ios swift uipickerview uialertcontroller


    【解决方案1】:

    在按钮操作之外设置一个UIAlertController 对象引用并访问它。

    class ViewController: UIViewController {
        
        // Other code
        
        var alert: UIAlertController = UIAlertController()
        
        // Other code
        @IBAction func addItemButtonPressed(_ sender: Any) {
            alert = UIAlertController(title: "Add a new todo item", message: "Provide the title and the category of the new item.", preferredStyle: .alert)
            
            // Other code
        }
    }
    
    extension ViewController: UIPickerViewDelegate {
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            // Update the textfield inside the UIAlert
            alert.textFields?.last?.text = todoItemCategory[row]
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 2019-08-21
      • 1970-01-01
      • 2016-12-21
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多