【问题标题】:Swift - hide pickerView after value selectedSwift - 选择值后隐藏pickerView
【发布时间】:2017-10-05 23:44:36
【问题描述】:

我发现了类似的问题,他们的回答很有帮助,但我被困在最后一件事上。当我点击一个字段时,我试图让 pickerView 出现,然后在选择数据时,我希望 pickerView 隐藏。我能够从pickerView 中获取数据以隐藏,但是,仍然有一个灰色矩形位于pickerView 后面。如果我点击屏幕,而不是字段或 pickerView,灰色矩形会隐藏,然后在我点击下一个字段时重新出现,仅在选择新数据后保留,直到我点击某个空白屏幕。

我在下面包含了我的代码,你会看到我已经尝试了几个选项。这些不是我尝试过的全部,但经过几次尝试,我开始只是注释掉而不是删除,这样我就可以记住我做了什么。我对编码非常陌生,因此我感谢您将此网站作为资源,并感谢您的帮助。

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

    @IBOutlet var enterSeason: UITextField!

    @IBOutlet var enterSport: UITextField!

    var dataPickerView = UIPickerView()    
    var season = ["2013", "2014", "2015"] //multi-season
    var sport = ["Baseball", "Football", "Basketball", "Hockey"]
    var activeDataArray = []

    override func viewDidLoad() {
        super.viewDidLoad()

        enterSeason.inputView = dataPickerView
        enterSport.inputView = dataPickerView
        dataPickerView.delegate = self
        dataPickerView.dataSource = self
    }

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

    func textFieldDidBeginEditing(textField: UITextField) {
        activeDataArray = [] //clear out the clicked field data array
        if textField == enterSeason {
            activeDataArray = season
        } else
            if textField == enterSport {
                activeDataArray = sport
            }
        dataPickerView.reloadAllComponents()
        dataPickerView.hidden = false
    }

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

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

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        return activeDataArray[row] as! String
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if activeDataArray == season {
            enterSeason.text = season[row] as String
        }
        else if activeDataArray == sport {
            enterSport.text = sport[row] as String
        }
        //trying to hide the dataPicker
        dataPickerView.hidden = true
        //dataPickerView.reloadAllComponents()
        //self.dataPickerView.resignFirstResponder()
        //self.dataPickerView.frameForAlignmentRect(CGRectMake(0, 900, 375, 219))

    }

    //function to hide data in
    func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    //funtion to hide keyboard when screen is tapped
    override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        self.view.endEditing(true)
    }

}

【问题讨论】:

    标签: ios swift uipickerview


    【解决方案1】:

    如果你想隐藏pickerView,试试这个:

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if activeDataArray == season {
            enterSeason.text = season[row] as String
        }
        else if activeDataArray == sport {
            enterSport.text = sport[row] as String
        }
        //trying to hide the dataPicker
        self.view.endEditing(true)
        //dataPickerView.reloadAllComponents()
        //self.dataPickerView.resignFirstResponder()
        //self.dataPickerView.frameForAlignmentRect(CGRectMake(0, 900, 375, 219))
    
    }
    

    【讨论】:

    • 我尝试了您的建议,但出现错误。建议的解决方法是在 endEditing 和左括号 ` ( ` 之间插入一个逗号。当我添加该逗号时,它仍然有错误,建议的解决方法是添加另一个逗号,然后继续。
    • @Greg 对不起,我忘记你使用的是 swift 而不是 objective-c
    【解决方案2】:

    隐藏选择器视图的一种方法是:

    self.view.endEditing(true) 
    

    这对我有用。

    【讨论】:

    • 这行得通..!在我的情况下..当 pickerView 处于“活动或打开”状态并且我想传递给另一个 ViewController 时。谢谢!
    【解决方案3】:

    我尝试辞去 didSelectRow 中文本字段的第一响应者

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if activeDataArray == season {
        enterSeason.text = season[row] as String
        enterSeason.resignFirstResponder()
    }
    else if activeDataArray == sport {
        enterSport.text = sport[row] as String
        enterSport.resignFirstResponder()
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 1970-01-01
      • 2016-04-24
      • 2012-07-05
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多