2014-10-26 12 views
12

Chcę, aby UIPickerView został odrzucony (wysuń się z widoku) po kliknięciu na pasku narzędzi. Połączyłem UIPickerView jako inputView z UITextField i ustawiłem UIToolbar jako inputAccessoryView w UIPickerView. Jednak moja funkcja wywoływania metody resignFirstResponder nie przesuwa UIPicker z widoku. Każda pomoc jest doceniana i z góry dziękujemy!resignFirstResponder dla UIPicker w 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] 
} 
} 

Odpowiedz

12

Są 2 problemy:

  1. Twój selektor dla donePressed jest zadeklarowane nieprawidłowo. Powinno być:

    let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "donePressed") 
    
  2. Trzeba zadzwonić resignFirstResponder() na textField:

    func donePressed() { 
        textField.resignFirstResponder() 
    } 
    

Jeśli masz kilka pól tekstowych, a ty nie chcesz hardcode textField w z numerem resignFirstResponder można wykonać następujące czynności:

  1. Dokonaj ViewControllerUITextFieldDeletate:

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate { 
    
  2. ustawić właściwość delegate na swój UITextField:

    textField.delegate = self 
    
  3. dodać obiekt do ViewController śledzić aktywnego UITextField:

    var activeTextField:UITextField? 
    
  4. Wdrożenie textFieldDidBeginEditing i przechowywać aktywny UITextField:

    func textFieldDidBeginEditing(textField: UITextField) { // became first responder 
        activeTextField = textField 
    } 
    
  5. W donePressed, zadzwoń resignFirstResponder na activeTextField:

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

Dziękuję, że go naprawić! –

+0

Aby rozwinąć drugi problem, co jeśli miałbym wiele UITextFields połączonych z oddzielnymi UIPickerViews. Czy istnieje sposób przekazania aktywnego pola tekstowego za pomocą funkcji donePressed()? –

Powiązane problemy