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

时间:2018-08-29 14:36:53

标签: swift xcode uipickerview

因此,我仅使用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” ,但是基于 how ,我“轻拂”了选择器,“中”。不会总是在应有的时候返回。

请让我知道我有什么办法可以使这篇文章更好,更具体等。

期待答复。预先感谢!

编辑:得到尝试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的情况下运行。无论哪种方式,它仍然不会打印行号。

1 个答案:

答案 0 :(得分:1)

似乎您正在尝试确定()方法中的行选择。每当需要确定要在选择器行中显示的文本时,UIKit就会调用该方法。

要找出每当选择更改时选择了哪一行,您应该检出pickerView(_:didSelectRow:inComponent:) method中的UIPickerViewDelegate

编辑

Swift不会调用您编写的方法,因为它与委托协议的方法的签名不匹配。 .valpickerView(_:titleForRow:forComponent:)不同。这就是为什么您向编译器警告有关方法名称几乎(但不完全)匹配的原因。

要使UIKit将该方法视为应调用的方法,您需要删除Int返回。如果方法签名匹配,并且您的类已正确分配为选择器的委托(这似乎是因为调用了pickerView(_:didSelectRow:inComponent:)),则UIKit将看到它并调用它。