如何使用 UIButton 删除 pickerView 中的选定位置?

How can I delete the selected location in a pickerView using a UIButton?

我正在尝试使用 UIButton 删除 pickerView 的元素,但在连续删除 3 个元素后我收到错误消息(索引超出范围)。

对不起我的英语不好我还年轻,住在德国:D

import UIKit


class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var textFiled: UITextField!
    @IBOutlet weak var pickerView: UIPickerView!

    var Array = ["Blue", "Green", "Red", "White", "Grey"]
    var indexOfPicker = Int()

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

    @IBAction func minusButton(_ sender: UIButton) {
        if Array.count != 0 {
            Array.remove(at: indexOfPicker)
            pickerView.reloadAllComponents()
        }
    }

    @IBAction func plusButton(_ sender: UIButton) {
        if textFiled.text != "" {
            Array.append(textFiled.text!)
            pickerView.reloadAllComponents()
        }
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return Array.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return Array[row]
    }

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

感谢您的帮助!

这个

if Array.count != 0 {

并不意味着你可以删除这个索引indexOfPicker,我认为你需要这个

if indexOfPicker < Array.count {

我猜你只从 pickerView select 一次(当计数为 5 时,这意味着 indexOfPicker 在 0...4 中)然后点击 minusButton 3 次

只需替换您的函数

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return Array[row]
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        indexOfPicker = row
        return pickerArray[row]
}

问题

当您从数组索引中删除一个元素时,索引没有得到更新,因为 func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 仅在您更改选择器中的值时调用 当交互时

但是在重新加载时您需要更新索引,因此每次重新加载选择器时都会调用 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int),这会在您重新加载或更新数组时更新您选择的索引

工作输出