Как использовать сборщик, чтобы получить какое-то значение после того, как выбор сделан?
У меня есть сборщик, который считывает список кортежей, и у меня есть пара вопросов о том, как заставить его работать. Я хочу, чтобы средство выбора отображало некоторые строки, и когда пользователь делает выбор, значение, соответствующее строке, сохраняется в переменной. Затем я хочу использовать эту переменную в функции, чтобы вычислить что-то, чтобы распечатать расчет пользователю. В настоящее время у меня есть:
@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?