使用用户输入的数据更新 Swift 中的 UIPickerView 到数组中的问题

问题描述

我正在编写一个简单的健身应用程序,它允许用户添加显示UIPickerView 中的用户个人资料,并在选择后输入到主 {{1} 上的 profileField 标签中}}。 ViewController 使用一组 pickerView 对象作为其数据源,并在选择器中显示配置文件名称。我已将其设置为用户在主 Profile 上单击按钮的位置,然后转到 ViewController,他们在其中输入创建配置文件的必要要求。当他们点击提交时,信息成功附加到 AddProfileViewController 数组,但当用户点击它时 profileNames 不会显示任何更改。我曾尝试使用 pickerViewpickerView.reloadAllComponents() 没有成功。

我使用的是 Xcode 版本 12.4 (12D4e)

pickerView.reloadComponent(1)
class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource
{
    

    @IBOutlet weak var profileField: UITextField!
    @IBAction func didTapEnter(_ sender: Any)
    {
        
    }
    
    @IBAction func didTapNewProfile(_ sender: Any)
    {

    }
    
//these are pre-populated values in this array 
    var profileNames: [Profile] =
    [
        Profile("Brandon",2,120,20,"Male"),Profile("G",100,Profile("K",1.6,111,19,Profile("F",2.1,95,Profile("J",1.89,97.5,21,"Male")
    ]
    
    var pickerView = UIPickerView()
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        pickerView = UIPickerView()
        pickerView.delegate = self
        pickerView.dataSource = self
        
        profileField.inputView = pickerView
        profileField.textAlignment = .center
        profileField.placeholder = "Enter Profile"
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int
    {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView,numberOfRowsInComponent component: Int) -> Int
    {
        return profileNames.count
    }
    
    func pickerView(_ pickerView: UIPickerView,titleForRow row: Int,forComponent component: Int) -> String?
    {
        return profileNames[row].name
    }
    
    func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int)
    {
        profileField.text = profileNames[row].name
        profileField.resignFirstResponder()
    }
    
    func profileSubmit(_ data: Profile)
    {
        profileNames.append(data)
        pickerView.reloadComponent(1) //This does not seem to do anything for me
    }
}

解决方法

我猜从 newProfile 返回时调用了 viewDidLoad -> 您可以通过将它设置为新实例来重置 viewDidLoad 中的选择器。尝试删除 viewDidLoad 中的新初始化:

super.viewDidLoad()
        pickerView = UIPickerView()

选择器已经在这里初始化:

 var pickerView = UIPickerView()

另外,我认为选择器组件从 0 开始 - 所以如果只有 1 个组件,它应该是:

pickerView.reloadComponent(0)