Swift - индекс UIPickerView вне диапазона - PullRequest
0 голосов
/ 27 мая 2018

Здесь я пытаюсь использовать UIPickerView.

В этом средстве выбора 2 компонента, второй компонент должен измениться после выбора первого.

Но мы прокручиваем первый компонент, подборщик увольняется автоматически.Затем, если я пытаюсь снова его разбудить, приложение вылетает и читает: Неустранимая ошибка: индекс выходит за пределы диапазона

Но я не могу выяснить, как это исправить.

Большое спасибо.

Вот код:

class Doll {
    var continent: String
    var dolls: [String]
    init(continent: String, dolls: [String]) {
        self.continent = continent
        self.dolls = dolls
    }
}

class addStoreTableViewController: UITableViewController, UIPickerViewDelegate, UIPickerViewDataSource {
var picker = UIPickerView()
func reloadArea() {
    dolls.append(Doll(continent: "Asia", dolls: ["¥(CNY)","$(HKD)","P(MOP)","NT$(TWD)","¥(JPY)","₩(KRW)","฿(THB)","RM(MYR)","$(SGD)"]))
    dolls.append(Doll(continent: "Euro", dolls: ["£(GBP)","€(EUR)","Fr(CHF)","₤(TRY)","kr(SEK)"]))
    dolls.append(Doll(continent: "Amereica", dolls: ["$(USD)","$(CAD)"]))
    dolls.append(Doll(continent: "Austr", dolls: ["$(AUD)"]))
}

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    var a = 0
    if component == 0 {
        a = dolls.count
    } else if component == 1 {
        let selectedContinent = picker.selectedRow(inComponent: 0)
        a = dolls[selectedContinent].dolls.count
    }
    return a
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    var b = ""
    if component == 0 {
        b = dolls[row].continent
    } else if component == 1 {
        let selectedContinent = picker.selectedRow(inComponent: 0)
        b = dolls[selectedContinent].dolls[row]// error here
    }
    return b
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    pickerView.reloadComponent(1)
    let selectContinent = pickerView.selectedRow(inComponent: 0)
    let selectDoll = pickerView.selectedRow(inComponent: 1)
    let myDoll = dolls[selectContinent].dolls[selectDoll]
    let index3 = IndexPath(row: 3, section: 0)
    let cell3: addStoreTableViewCell = self.tableView(tableView, cellForRowAt: index3) as! addStoreTableViewCell
    cell3.textIn.text = myDoll
    self.tableView.reloadRows(at: [index3], with: .fade)
    self.myDoll = myDoll
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.reloadArea()
    picker.delegate = self
    picker.dataSource = self
    picker.selectRow(0, inComponent: 0, animated: true)
    picker.selectRow(0, inComponent: 1, animated: true)
    picker.reloadAllComponents()
    picker.reloadComponent(1)
}

1 Ответ

0 голосов
/ 27 мая 2018

я проверил твой код

все работает нормально, когда я комментирую tableView части просто проверь его

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        pickerView.reloadComponent(1)
        let selectContinent = pickerView.selectedRow(inComponent: 0)
        let selectDoll = pickerView.selectedRow(inComponent: 1)
        let myDoll = dolls[selectContinent].dolls[selectDoll]

        /*let index3 = IndexPath(row: 3, section: 0)
        let cell3: addStoreTableViewCell = self.tableView(tableView, cellForRowAt: index3) as! addStoreTableViewCell
        cell3.textIn.text = myDoll
        self.tableView.reloadRows(at: [index3], with: .fade)
        self.myDoll = myDoll*/

    }
...