UIPIckerViews работают вместе в одном UIView - PullRequest
1 голос
/ 12 апреля 2020

просмотрел другие подобные вопросы, но не нашел там ответов. Разобрались с некоторыми проблемами, которые у меня были, но все еще есть проблема, когда данные из первого средства выбора определяют, какие варианты есть во втором окне выбора (эта часть приложения является преобразователем единиц).

Я понимаю, что такое идет не так, но не может понять, как решить проблему. Через операторы print я вижу, что при изменении первого pickerView изменяется значение, которое содержит количество строк во втором pickerView. Но заголовки второго pickerView не меняются, поэтому, когда я go на элемент, который выше, чем индекс в новом массиве, приложение вылетает. Это подтверждается ошибкой Index вне диапазона.

Я включил код и снимок того, как выглядит pickerViews (без форматирования или создания красивого - как сначала получить функциональность).

Спасибо за помощь

var conversionTypes = ["length", "mass", "area", "volume", "rate", "temp", "pressure"]
var conversionItems = [["metres", "feet", "yard", "inch", "cm"], ["kg", "lbs", "tonne", "ounces"], ["ft2", "m2", "in2"], ["US Gall", "UK Gall", "Bbls", "ft3", "m3"], ["bbl/min", "scf/min", "scf/hr"], ["degC", "degF", "Kelvin"], ["bar", "psi"]]
var littlePickerType = 0
var wheelOne = 0
var wheelTwo = 0



@IBOutlet weak var numberToConvert: UITextField!
@IBOutlet weak var answerLabel: UILabel!


@IBOutlet weak var littlePicker: UIPickerView!
@IBOutlet weak var bigPicker: UIPickerView!


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    littlePicker.delegate = self
    littlePicker.dataSource = self
    bigPicker.delegate = self
    bigPicker.dataSource = self

    let tap = UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing))
    view.addGestureRecognizer(tap)
}


func numberOfComponents(in pickerView: UIPickerView) -> Int {
    if pickerView == littlePicker {
        return 1
    } else if pickerView == bigPicker {
        return 2
    }

    return 1
}


func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if pickerView == littlePicker {
        return conversionTypes.count
    } else if pickerView == bigPicker {
        return conversionItems[littlePickerType].count
    }

    return 1
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    if pickerView == littlePicker {
        return conversionTypes[row]
    } else if pickerView == bigPicker {
        return conversionItems[littlePickerType][row]
    }
    return ""
}

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

    if pickerView == littlePicker {
        littlePickerType = row
    } else if pickerView == bigPicker {
        if component == 0 {
            wheelOne = row
        } else if component == 1 {
            wheelTwo = row
        }
    }

    print ("Conversion Type \(littlePickerType) WheelOne \(wheelOne) WheelTwo \(wheelTwo) count \(conversionItems[littlePickerType].count)")


}

}

1 Ответ

1 голос
/ 12 апреля 2020

Вы должны звонить reloadAllComponents на ваш большой сборщик всякий раз, когда littlePickerType меняется. Это заставляет все методы источника данных представления выбора (особенно titleForRow) снова вызываться для большого выбора.

var littlePickerType = 0 {
    didSet {
        bigPicker.reloadAllComponents()
    }
}
...