【问题标题】:Issue updating UIPickerView in Swift with user inputted data into an array使用用户输入的数据到数组中更新 Swift 中的 UIPickerView 问题
【发布时间】:2021-05-05 06:48:45
【问题描述】:

我正在编写一个简单的健身应用程序,允许用户添加在UIPickerView,选择的用户配置文件中,并且在选择时,在Main ViewController的标签上输入@ 987654322。 pickerView 使用 Profile 对象的数组作为其数据源,并在选取器中显示配置文件的名称。我将其设置为用户单击主ViewController 上的按钮并连接到AddProfileViewController,在那里他们输入创建配置文件的必要要求。当他们点击提交时,信息成功附加到profileNames 数组,但pickerView 在用户单击它时不会显示任何更改。我试过使用pickerView.reloadAllComponents()pickerView.reloadComponent(1) 没有成功。

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

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", 2, 100, 20, "Male"),
        Profile("K", 1.6, 111, 19, "Male"),
        Profile("F", 2.1, 95, 20, "Male"),
        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
    }
}
class AddProfileViewController: UIViewController, UINavigationControllerDelegate
{

    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var weightTextField: UITextField!
    @IBOutlet weak var heightTextField: UITextField!
    @IBOutlet weak var ageTextField: UITextField!
    @IBOutlet weak var sexTextField: UITextField!
    
    let main: ViewController? = nil
    
    @IBAction func submit(_ sender: Any)
    {
        let name = String(nameTextField.text!)
        let height = Double(heightTextField.text!)!
        let weight = Double(weightTextField.text!)!
        let age = Double(ageTextField.text!)!
        let sex = String(sexTextField.text!)
        let new = Profile.init(name, height, weight, age, sex)
        
        
        main?.profileSubmit(new)
        new.display()
        
        dismiss(animated: true, completion: nil)
    }

    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

}

【问题讨论】:

    标签: ios arrays swift xcode uipickerview


    【解决方案1】:

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

    super.viewDidLoad()
            pickerView = UIPickerView()
    

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

     var pickerView = UIPickerView()
    

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

    pickerView.reloadComponent(0) 
    

    【讨论】:

    • 不幸的是,这并没有解决这个问题。我实际上是事先随机添加的,看看它是否会首先解决问题(当然它没有)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多