UIPickerView没有返回用户选择的正确行

问题描述 投票:1回答:1

所以我只是使用this SO Post为我的pickerView添加第二个ViewController。我使用了用户'LAOMUSIC Arts'的答案,该答案实现了使用已接受解决方案中的标签的想法。

这是我的实现:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{
    var molyRow = ""
    var tungRow = ""

    var molyPickerViewOptions = ["mils", "mm", "in."]
    var tungPickerViewOptions = ["mils", "mm", "in."]



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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return molyPickerViewOptions.count
        }else{
            return tungPickerViewOptions.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            molyRow = "\(molyPickerViewOptions[row])"
            print("molyRow = ", "\(molyPickerViewOptions[row])")
            return "\(molyPickerViewOptions[row])"

        }else{
            tungRow = "\(tungPickerViewOptions[row])"
            print("tungRow = ", "\(tungPickerViewOptions[row])")
            return "\(tungPickerViewOptions[row])"
        }
    }

正如你所看到的,我有它打印tungRowmolyRow及其相应的值。这样,当我在模拟器中运行应用程序时,我可以看到它获得了什么价值。

当我尝试这个时,我偶然发现了一些非常奇怪的东西。当在模拟器中选择那些时,它将正确返回“mils”和“mm”,但如果我从“mils”或“mm”行向下“滑动”到“in”。排,它会因某种原因返回“mils”。我会附上一个视频给你看。

Video

正如你所看到的那样,选择器似乎在大多数情况下正确地返回“mils”和“mm”,但是基于我如何“轻弹”选择器,“in。”在它应该的时候不会总是被退回。

如果我能做些什么来让这篇文章更好,更具体,等等,请告诉我。

期待回应。提前致谢!

编辑:在得到一个尝试pickerView(_:didSelectRow:inComponent:)的建议后,我尝试实现函数返回,并打印行号。我编辑了pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int)函数,只需设置标题:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (pickerView.tag == 1){
            return "\(molyPickerViewOptions[row])"

        }else{
            return "\(tungPickerViewOptions[row])"
        }
    }

    private func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) -> Int{
        if (pickerView.tag == 1){
            molyRow = row
            print("molyRow = ", "\(row)")
            return row

        }else{
            tungRow = row
            print("tungRow = ", "\(row)")
            return row
        }
    }

请注意,当我尝试实现pickerView(_:didSelectRow:inComponent:)函数时,Xcode警告我:Instance method 'pickerView(_:didSelectRow:inComponent:)' nearly matches optional requirement 'pickerView(_:didSelectRow:inComponent:)' of protocol 'UIPickerViewDelegate' Make 'pickerView(_:didSelectRow:inComponent:)' private to silence this warning

我试过运行有和没有使功能private。无论哪种方式,它仍然不打印行号。

swift xcode uipickerview
1个回答
1
投票

看起来您可能正在尝试确定pickerView(_:titleForRow:forComponent:)方法中的行选择。只要需要确定要在选择器行中显示的文本,UIKit就会调用该方法。

要找出选择更改时选择了哪一行,您应该查看pickerView(_:didSelectRow:inComponent:) methodUIPickerViewDelegate

编辑

Swift没有调用你编写的方法,因为它与委托协议方法的签名不匹配。 pickerView(_:didSelectRow:inComponent:)pickerView(_:didSelectRow:inComponent:) -> Int不同。这就是为什么你得到关于方法名称的编译器警告差不多但不完全匹配的原因。

要让UIKit将方法视为应该调用的方法,您需要删除Int返回。如果方法签名匹配,并且您的类被正确地指定为选择器的委托(这似乎是因为titleForRow:被调用),那么UIKit将看到并调用它。

© www.soinside.com 2019 - 2024. All rights reserved.