Можно ли использовать UIPickerView с функцией if, зависящей (например) от UISegmentedControll? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу создать представление выбора в TextField в зависимости от SegmentedControll.

Просто начал кодировать с некоторыми функциями if ... но он не работает, потому что функция не возвращает Int.

func functionOne() {
        createJobToolBar()
        aufgabenPicker = UIPickerView()
        aufgabenPicker?.delegate = self
        aufgabenPicker?.dataSource = self

        jobTF.inputView = aufgabenPicker
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if categorySC.isEnabledForSegment(at: 1) {
            return jobsHaus.count
        }else if categorySC.isEnabledForSegment(at: 2) {
            return jobsGarten.count
        }else if categorySC.isEnabledForSegment(at: 3) {
            return jobsBetreuung.count
        }else if categorySC.isEnabledForSegment(at: 4) {
            return jobsSonstiges.count
        }
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if categorySC.isEnabledForSegment(at: 1) {
            return jobsHaus[row]
        }else if categorySC.isEnabledForSegment(at: 2) {
            return jobsGarten[row]
        }else if categorySC.isEnabledForSegment(at: 3) {
            return jobsBetreuung[row]
        }else if categorySC.isEnabledForSegment(at: 4) {
            return jobsSonstiges[row]
        }
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if categorySC.isEnabledForSegment(at: 1) {
            jobTF.text = jobsHaus[row]
        }else if categorySC.isEnabledForSegment(at: 2) {
            jobTF.text = jobsGarten[row]
        }else if categorySC.isEnabledForSegment(at: 3) {
            jobTF.text = jobsBetreuung[row]
        }else if categorySC.isEnabledForSegment(at: 4) {
            jobTF.text = jobsSonstiges[row]
        }
    }

Текущее сообщение об ошибке из-за пропущенного возврата: «Отсутствует возврат в функции, ожидающей возврата« Int »»

1 Ответ

0 голосов
/ 19 октября 2019

В вашем методе func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) вы возвращаете значение, основанное на количестве if ... else операторов. Они могут охватывать все ваши возможные сценарии, но компилятор не может вывести это и может увидеть возможность, когда все четыре проверки не пройдены, и поэтому значение не возвращается.

Существует несколько подходов к исправлению этого:

  1. после последнего if вставил роковую ошибку для сбоя
//cut earlier code for brevity
  else if categorySC.isEnabledForSegment(at: 4) {
            return jobsSonstiges.count
  }
  fatalerror("Invalid segment logic")
}
Возвращает случайное число, исходя из того, что, если ваша логика верна, поток кода никогда не должен заходить так далеко:
//cut earlier code for brevity

  else if categorySC.isEnabledForSegment(at: 4) {
            return jobsSonstiges.count
  }
  return 999
}
Пропустить последнюю проверку if, исходя из того, что это единственное возможное оставшееся значение, и просто вернуть значение:
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if categorySC.isEnabledForSegment(at: 1) {
            return jobsHaus[row]
        }else if categorySC.isEnabledForSegment(at: 2) {
            return jobsGarten[row]
        }else if categorySC.isEnabledForSegment(at: 3) {
            return jobsBetreuung[row]
        }else {
            return jobsSonstiges[row]
        }
    }

Мои предпочтения, по крайней мере во время разработки, будутдля варианта 1, чтобы я выяснил, допустил ли я логическую ошибку.

...