【问题标题】:Show UIPickerView with UITapGestureRecognizer使用 UITapGestureRecognizer 显示 UIPickerView
【发布时间】:2017-03-24 04:50:02
【问题描述】:

我正在尝试使用 UITapGestureRecognizer 显示已隐藏的 UIPickerView。我正在尝试将此GestureRecognizer 添加到UILabel

UITapGestureRecognizer 无法对UILabel 进行一次录音。任何指针表示赞赏。谢谢

class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource  {

    @IBOutlet var baseCurrency: UITextField!
    @IBOutlet var excahngeCurrency: UITextField!
    @IBOutlet var dropDown: UIPickerView!
    @IBOutlet var currencyLabel: UILabel!

    var list: [String: AnyObject] = [String: AnyObject]()
    var titles: [String] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        currencyLabel.isUserInteractionEnabled = true
        let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(showpickerView))
        tap.numberOfTapsRequired = 1
        currencyLabel.addGestureRecognizer(tap)

        let url:URL = URL(string: "https://openexchangerates.org/api/currencies.json?app_id=7486951aeb994599a08cd7979bef3c03")!
        Alamofire.request(url).responseJSON(completionHandler: {
            response in

            switch response.result {

            case.success:

                self.list = response.result.value as! [String: AnyObject]

                for (key, _) in self.list{

               self.titles += [key]

                }

                print(self.titles)

                if (self.titles.count > 0) {

                    self.dropDown.reloadAllComponents()

                    print("test")

                } else {
                    print("there is no data for your picker view")
                }



            case .failure:
                print("error")


            }


        })

    }

    func showpickerView(_ sender:UITapGestureRecognizer){

      print("test")

        //self.dropDown.isHidden = false

    }

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

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{


        return self.titles[row]


    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
    {
        return self.titles.count
    }



    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){


        currencyLabel.text = self.titles[row]
        self.dropDown.isHidden = true


    }




    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

【问题讨论】:

  • 测试是否被调用
  • 否则检查您的标签框架
  • 您的视图控制器中是否有另一个手势识别器可能会以某种方式干扰这个?

标签: ios swift uipickerview uitapgesturerecognizer


【解决方案1】:

tap 赋值后,添加tap.delegate = self

【讨论】:

  • 嗨 Clay,谢谢,我确实添加了 tap.delegate = self ,但仍然无法正常工作。
【解决方案2】:

在此行之后尝试此代码 (tap.numberOfTapsRequired = 1)

tap.cancelsTouchesInView = false

【讨论】:

  • 感谢 Vignesh,我在 tap.numberOfTapsRequired = 1 之后添加了 tap.cancelsTouchesInView = false。它仍然不起作用。
  • 删除了代码中的 tap.numberOfTapsRequired = 1 行。
  • 试过了,只使用了 tap.cancelsTouchesInView = false 并删除了 tap.numberOfTapsRequired = 1。当我点击标签时仍然不打印“test”
【解决方案3】:

您必须将@objcattribute 添加到您的showpickerView(_ sender:UITapGestureRecognizer) 方法中才能与#selector 一起使用。

更多详情请参考这里 '#selector' refers to a method that is not exposed to Objective-C

【讨论】:

  • 嗨,我正在使用 swift,正在添加,但仍然要检查我是否添加了 @objc。我在 appdelegate 中有错误
  • 看起来错误在我构建时消失了。我添加了@objc func showpickerView(_ sender:UIGestureRecognizer) 它仍然不打印测试
【解决方案4】:

首先,你修复这样的函数:

func showpickerView(_ sender:**UIGestureRecognizer**){
  print("test")
    //self.dropDown.isHidden = false
}

和:

let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(showpickerView(_:)))

您可以再次测试。

【讨论】:

  • 谢谢罗纳德。我将 func 和 tapgesture 更新为 func showpickerView(_ sender:UIGestureRecognizer) 并让 tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(showpickerView(_:))) 。仍然没有工作
  • 它显示或没有任何事情发生?它打印了“测试”吗?
  • 不,它不会打印“测试”。我无法弄清楚这里出了什么问题。
【解决方案5】:

此代码用于取消隐藏 UIPickerView

类 FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet var baseCurrency: UITextField!
@IBOutlet var excahngeCurrency: UITextField!
@IBOutlet var dropDown: UIPickerView!
@IBOutlet var currencyLabel: UILabel!

var list: [String: AnyObject] = [String: AnyObject]()
var dict: [String: AnyObject] = [String: AnyObject]()
var titles: [String] = []
var value: Int = 0

let food = ["app", "ban", "org"]
override func viewDidLoad() {
    super.viewDidLoad()

    currencyLabel.isUserInteractionEnabled = true
    let tap:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(showpickerView(_:)))
    tap.numberOfTapsRequired = 1

    currencyLabel.addGestureRecognizer(tap)


let url:URL = URL(string: "https://openexchangerates.org/api/latest.json?app_id=7486951aeb994599a08cd7979bef3c03")!
    Alamofire.request(url).responseJSON(completionHandler: {
        response in

        switch response.result {

        case.success:

            self.list = response.result.value as! [String: AnyObject]

            self.dict = self.list["rates"] as! [String: AnyObject]

             self.value = self.dict["INR"] as! Int

            for (key, _) in self.dict
            {
                self.titles += [key]
            }


            print(self.value)
            print("test")

            print(self.titles)

            if (self.titles.count > 0) {

                self.dropDown.reloadAllComponents()


                print("teest")

            } else {
                print("there is no data for your picker view")
            }



        case .failure:
            print("error")


        }


    })

}

@objc func showpickerView(_ sender:UIGestureRecognizer){

  print("test")

   self.dropDown.isHidden = false

}

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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?{


    return self.titles[row]


}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int
{
    return self.titles.count
}



func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int){


    currencyLabel.text = self.titles[row]
    self.dropDown.isHidden = true


}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多