【问题标题】:How to use a picker to get some value after a selection is made?选择后如何使用选择器获取一些值?
【发布时间】:2020-11-25 19:40:15
【问题描述】:

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

@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")
        }

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

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

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

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

【问题讨论】:

    标签: ios swift xcode swiftui swiftui-picker


    【解决方案1】:

    您需要做很多事情才能完成您所要求的一切,但让我们从选择器视图的基础知识开始。您需要遵守 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 中做这件事有多熟悉?

    【讨论】:

    • 我对 C++ 和 Python 有丰富的经验,但对 Swift 一无所知,这就是我苦苦挣扎的原因。你在那里定义的类(PickerViewController),我应该在哪里写呢?在 ContentView.swift 中? AppDelegate 文件?场景委托文件?我不确定一切都在哪里,所以我只是在 ContentView 中做所有事情。网上也很难找到资源,因为它没有解释我在寻找什么,而且没有快速的经验很难理解。
    • @SantiagoMedina - 不用担心,马上就可以吸收很多内容,尤其是来自其他语言的内容。 PickViewController 只是视图控制器子类的任意示例,我猜您已经有一个 ViewController,它可能是您的 ContentView,因此您可以将代码(不是类声明)复制到您的 ContentView swift 文件中并尝试出去。现在不要担心 AppDelegate 或 SceneDelegate 文件,您只需关注单个视图控制器及其视图/子视图,直到您熟悉该排列。
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    相关资源
    最近更新 更多