繁体   English   中英

我只希望用户在swift 3中点击uipickerview时选择国家

[英]I want user to select country only when he/she tapped on uipickerview in swift 3

我已经在UIPickerView中创建了国家列表,并在UItextField中对其进行了调用。 现在,我希望用户点击UIPIckerView选择国家名称。 我对堆栈溢出进行了一些研究,发现(令人惊讶的是!)这样做并不容易。 我为此编写了以下代码,它向我显示了以下错误:

 Cannot convert value of type 'CGRect' to expected argument type 'CGFloat'

是否有简单的方法来做..这是非常基本的要求,应该非常简单; 否则,有人可以帮助解决我在创建点击功能时遇到的错误吗

下面是我的代码

 class StudentSignUpViewController: UIViewController,UIScrollViewDelegate, UITextFieldDelegate,UIPickerViewDelegate,UIPickerViewDataSource, UIGestureRecognizerDelegate {




@IBOutlet weak var countryText: UITextField!
@IBOutlet weak var scrollView: UIScrollView!

///who are you option dropdown box
var picker = UIPickerView()

override func viewDidLoad() {
    super.viewDidLoad()

    //setting portrait
    AppUtility.lockOrientation(.portrait)

    //hide keyboard when click outside
    self.hideKeyboardWhenTappedAround()

    //hide keyboard when click on return

    self.countryText.delegate = self

    self.scrollView.delegate = self

    picker.delegate = self
    picker.dataSource = self
    self.countryText.inputView = picker

    let tap = UITapGestureRecognizer(target: self, action: #selector(pickerTapped))
    tap.cancelsTouchesInView = false
    tap.delegate = self
    picker.addGestureRecognizer(tap)

}


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

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    AppUtility.lockOrientation(.portrait)

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    AppUtility.lockOrientation(.all)
}


//*************************************************************** creating dropdown for country list ***************************************************************

let countries = NSLocale.isoCountryCodes.map { (code:String) -> String in
    let id = NSLocale.localeIdentifier(fromComponents: [NSLocale.Key.countryCode.rawValue: code])
    return NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: id) ?? "Country not found for code: \(code)"
}

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

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


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
    return self.countries[row];
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    self.countryText.text = self.countries[row];
    self.countryText.endEditing(true)
}


func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true}

@objc func pickerTapped(tapRecognizer:UITapGestureRecognizer)
{
    if (tapRecognizer.state == UIGestureRecognizerState.ended)
    {
        let frame = CGRect.zero
        let rowHeight : CGFloat  = self.picker.rowSize(forComponent: 0).height
        let selectedRowFrame: CGRect = frame.insetBy(dx: self.picker.bounds, dy: (self.picker.frame.height - rowHeight) / 2.0 ) //Error: Cannot convert value of type 'CGRect' to expected argument type 'CGFloat'
        let userTappedOnSelectedRow = (selectedRowFrame.contains(tapRecognizer.location(in: picker)))
        if (userTappedOnSelectedRow)
        {
           self.picker.selectedRow(inComponent: 0)

        }
    }
}

}

根据苹果的标准,您应该将toolbar添加到pickerview中,并done一个按钮,该按钮将关闭pickerview。 通过滚动pickerview行并将选定的行保持在中心段,已经可以完成选择。 但是,如果您的要求非常严格,则应创建自己的自定义组件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM