2014-10-26 8 views
12

Ich möchte, dass die UIPickerView nach dem Klicken auf die Schaltfläche auf der Symbolleiste angeklickt wird (außer Sicht). Ich habe die UIPickerView als Eingabeansicht des UITextField verknüpft und die UIToolbar als EingabeAccessoryView des UIPickerView festgelegt. Allerdings ruft meine Funktion, die resignFirstResponder aufruft, den UIPicker nicht aus der Ansicht heraus. Jede Hilfe wird geschätzt und danke im Voraus!resignFirstResponder für 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] 
} 
} 

Antwort

12

Es gibt zwei Probleme:

  1. Ihre Wähler für donePressed falsch erklärt. Es sollte sein:

    let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "donePressed") 
    
  2. Sie müssen resignFirstResponder() auf textField nennen:

    func donePressed() { 
        textField.resignFirstResponder() 
    } 
    

Wenn Sie mehrere Textfelder haben, und Sie nicht möchten, dass das Textfeld codieren in die resignFirstResponder Anruf, können Sie Folgendes tun:

  1. Machen Sie Ihre ViewController ein UITextFieldDeletate:

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate { 
    
  2. Stellen Sie die delegate Eigentum auf Ihrer UITextField:

    textField.delegate = self 
    
  3. der Unterkunft um Ihre ViewController hinzufügen Spur des aktiven UITextField zu halten:

    var activeTextField:UITextField? 
    
  4. Implementieren textFieldDidBeginEditing und speichern die aktive UITextField:

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

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

Danke, dass es behoben haben! –

+0

Um auf das zweite Problem zu erweitern, was passiert, wenn ich mehrere UITextFields mit separaten UIPickerViews verknüpft hatte. Gibt es eine Möglichkeit, das aktive Textfeld durch die Funktion donePressed() zu übergeben? –