Как использовать сборщик, чтобы получить какое-то значение после того, как выбор сделан?

У меня есть сборщик, который считывает список кортежей, и у меня есть пара вопросов о том, как заставить его работать. Я хочу, чтобы средство выбора отображало некоторые строки, и когда пользователь делает выбор, значение, соответствующее строке, сохраняется в переменной. Затем я хочу использовать эту переменную в функции, чтобы вычислить что-то, чтобы распечатать расчет пользователю. В настоящее время у меня есть:

@State private var rating: Int = 0

func scale(rating: Float, someValue1: Float, someValue2: Float) -> Float{
    return (rating + someValue1 * 2.5 + someValue2 * 1.5) / 10
}

var arrayOfTuples: [(score: String, value: Int)] = [
        (score: "A+", value: 60),
        (score: "A", value: 55),
        (score: "A-", value: 50),
        (score: "B+", value: 45),
        (score: "B", value: 40),
        (score: "B-", value: 35),
        (score: "C+", value: 30),
        (score: "C", value: 25),
        (score: "C-", value: 20),
        (score: "D+", value: 15),
        (score: "D", value: 10),
        (score: "D-", value: 5),
        (score: "F", value: 0)
    ]

Picker(selection: $rating, label: Text("Choose")) {
                        ForEach(0 ..< arrayOfTuples.count) {
                            Text(self.arrayOfTuples[$0].score)
                        }
                    }

Этот код отображает только счетную часть arrayOfTuples (A+, A, A- и т. Д.), Что я хочу, но когда пользователь выбирает что-то из средства выбора, я не думаю, что он сохраняет значение соответствующей оценки в переменная "рейтинг". Затем я хочу использовать рейтинг для вычисления функции при нажатии кнопки:

Button(action: {
            print(self.scale(rating: Float(self.rating), someValue1: Float(self.someValue1) ?? 0, someValue2: Float(self.someValue2)))
        }) {
            Text("Calculate")
        }

Кроме того, все это делается внутри структуры ContentView, созданной при создании приложения в Xcode, поэтому я не знаю, объявляю ли я и определяю функции, где они должны быть, поэтому, если есть лучший способ, позвольте мне знать.

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

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

Есть идеи, как это сделать? Огромное спасибо заранее.

1 ответ

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

class PickerViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    
//...rating and tuple variables

overide func viewDidLoad() {
   let pickerView = UIPickerView()
   pickerView.dataSource = self
   pickerView.delegate = self
   self.view.addSubview(pickerView)
}

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

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    rating = arrayOfTuples[row].value
}

}

Ключом к хранению значения средства выбора в переменной рейтинга является метод didSelectRow. Пример кода, который я написал, просто берет простое представление средства выбора и добавляет его в представление контроллера представления, не задумываясь о размещении, ограничениях или чем-то еще, поэтому он не будет красивым, но он иллюстрирует, как использовать представление средства выбора для выбора данных. Если вы хотите, чтобы окно выбора отображалось всплывающим и скрывалось, есть несколько способов сделать это, включая добавление вложенного представления поверх других представлений и удаление его из суперпредставления или представление нового контроллера представления. Насколько вы знакомы с этим в Swift?

Другие вопросы по тегам