0

我有一个从元组列表中读取的选择器,并且有几个关于如何使其工作的问题。我想要做的是选择器显示一些字符串,当用户进行选择时,与字符串对应的值将保存到变量中。然后我想在函数中使用这个变量来计算一些东西,然后将计算结果打印给用户。我目前有:

@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-等)的分数部分,但是当用户从选择器中选择某些内容时,我认为它不会将相应分数的值保存到变量“评级”。然后我想在按下按钮时使用 rating 来计算函数:

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

此外,所有这些都是在 Xcode 中创建应用程序时创建的 ContentView 结构内完成的,所以我不知道我是否在声明和定义它们应该在的函数,所以如果有更好的方法请告诉我知道。

此外,选择器是默认选择器。我更喜欢使用滚轮选择器,但是当我使用它时,它会在主屏幕中显示,我希望它仅在用户按下选择按钮时作为弹出窗口出现。

最后,正如您在按钮中看到的那样,该操作正在打印值。但是,我不想打印该值,而是通过弹出框或用户可以看到的其他地方将其显示给用户。

任何想法如何做到这一点?非常感谢你。

4

1 回答 1

0

你需要做很多事情来完成你所要求的一切,但让我们从选择器视图基础开始。您需要遵守 Picker View Data Source 和 Delegate 协议,然后实现 Picker View 期望的所需方法。这是一个例子:

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 中做这件事有多熟悉?

于 2020-11-25T22:09:01.893 回答