2014-10-26 18 views
12

Voglio che UIPickerView venga chiuso (slide out of view) dopo che il pulsante done è stato premuto sulla barra degli strumenti. Ho collegato UIPickerView come inputView di UITextField e ho impostato UIToolbar come inputAccessoryView di UIPickerView. Tuttavia, la mia funzione chiamata resignFirstResponder non fa uscire UIPicker dalla vista. Qualsiasi aiuto è apprezzato e grazie in anticipo!resignFirstResponder per UIPicker in UITextField Swift

import UIKit 

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 
    // Do any additional setup after loading the view, typically from a nib. 

    //initialization constants 
    let pickerView = UIPickerView() 
    let textField = UITextField() 
    let pickerData = ["1","2","three"] 


    override func viewDidLoad() { 
     //pickerview tool bar 
     let toolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 44)) 
     var items = [AnyObject]() 
     //making done button 
     let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: Selector(donePressed())) 
     items.append(doneButton) 
     toolbar.barStyle = UIBarStyle.Black 
     toolbar.setItems(items, animated: true) 


     //creating textfields with a pickerview 
     pickerView.delegate = self 
     pickerView.dataSource = self 
     pickerView.frame = CGRectMake(0, 0, 500, 300) 
     textField.inputAccessoryView = toolbar 
     textField.inputView = pickerView 
     textField.frame = CGRectMake(200, 55, 100, 35) 
    textField.backgroundColor = UIColor.blueColor() 

    //adding objs to viewController 
    self.view.addSubview(textField) 
} 

func donePressed() { 
    resignFirstResponder() 
} 





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



} 

//MARK: Data Sources UIPickerView 
extension ViewController: UIPickerViewDataSource { 
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { 
     return 1 
    } 
    func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int { 
     return pickerData.count 
    } 
} 

//MARK: Delegates UIPickerView 
extension ViewController: UIPickerViewDelegate { 
    // several optional methods: 




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

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) { 
    textField.text = pickerData[row] 
} 
} 

risposta

12

ci sono 2 problemi:

  1. vostro selettore per donePressed è dichiarato in modo non corretto. Dovrebbe essere:

    let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "donePressed") 
    
  2. è necessario chiamare il resignFirstResponder()textField:

    func donePressed() { 
        textField.resignFirstResponder() 
    } 
    

Se si dispone di più campi di testo, e non si vuole hardcode il textField in la chiamata resignFirstResponder, è possibile effettuare quanto segue:

  1. Fai la tua ViewController un UITextFieldDeletate:

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate { 
    
  2. Impostare la proprietà delegate sul UITextField:

    textField.delegate = self 
    
  3. Aggiungi un immobile alla sua ViewController per tenere traccia del principio attivo UITextField:

    var activeTextField:UITextField? 
    
  4. Implementare textFieldDidBeginEditing e memorizzare l'attiva UITextField:

    func textFieldDidBeginEditing(textField: UITextField) { // became first responder 
        activeTextField = textField 
    } 
    
  5. In donePressed, chiamano resignFirstResponder su activeTextField:

    func donePressed() { 
        activeTextField?.resignFirstResponder() 
    } 
    
+0

Grazie, che è stato risolto! –

+0

Per espandere il secondo problema, se avessi più UITextField collegati a UIPickerViews separate. C'è un modo per passare il campo di testo attivo attraverso la funzione donePressed()? –