2015-07-30 10 views
36

Mam trudności z wyświetlaniem UIPickerView za pomocą przycisku, który zostanie wyświetlony, gdy użytkownicy dotkną UITextField. To jest mój kod do tej pory. Wszystko układa się dobrze, ale kiedy dotknę pola tekstowego, pojawi się klawiatura, a nie selektor.Jak zrobić UIPickerView za pomocą przycisku Gotowe?

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 


@IBOutlet var textField1: UITextField! 

let pickerData = ["11", "12", "13"] 





@IBAction func textButton(sender: AnyObject) { 

    let picker: UIPickerView 
    picker = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300)) 
    picker.backgroundColor = .whiteColor() 

    picker.showsSelectionIndicator = true 
    picker.delegate = self 
    picker.dataSource = self 

    let toolBar = UIToolbar() 
    toolBar.barStyle = UIBarStyle.Default 
    toolBar.translucent = true 
    toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
    toolBar.sizeToFit() 

    let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") 
    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
    let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") 

    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
    toolBar.userInteractionEnabled = true 

    textField1.inputView = picker 
    textField1.inputAccessoryView = toolBar 




} 



override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

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

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

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

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

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

func donePicker() { 

    textField1.resignFirstResponder() 

} 




} 
+0

gdzie nazywasz metodę textButton? – iAnurag

Odpowiedz

84

Dodaj ten kod do swojej viewDidLoad() zamiast metody

let picker: UIPickerView 
picker = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300)) 
picker.backgroundColor = .whiteColor() 

picker.showsSelectionIndicator = true 
picker.delegate = self 
picker.dataSource = self 

let toolBar = UIToolbar() 
toolBar.barStyle = UIBarStyle.Default 
toolBar.translucent = true 
toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) 
toolBar.sizeToFit() 

let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") 
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") 

toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
toolBar.userInteractionEnabled = true 

textField1.inputView = picker 
textField1.inputAccessoryView = toolBar 
+0

Dziękujemy! To działa! –

+0

To prawdopodobnie dla innego wątku. Ale kiedy wykonuję polecenie "zakończ" przy użyciu powyższego przykładu, element widoku uipickerview nie jest zaznaczony. Jak mogę to zrobić? – VBaarathi

+0

Awesome. Solidny przykład. Doceniam pomoc. – jonthornham

7

Ludzie wydają się być przy użyciu kodu tutaj do innych pytań zadać to samo, co VBaarathi hasła

W Swift3

let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker)) 
let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) 
let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker)) 

Następnie można umieścić następujące elementy w tym samym swi Plik ft

func donePicker (sender:UIBarButtonItem) 
{ 
    // Put something here 
} 
2

Swift 3x:

Awesome odpowiedź jest już wydane, ale tutaj jest inne podejście, po prostu zrobić pickerView i dać inputView i inputAccessoryView takiego:

YOUR_TEXTFIELD_NAME.inputView = picker 


func addKeyboardToolBar() { 
var nextButton: UIBarButtonItem? 
var keyboardToolBar = UIToolbar(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(pickerView.frame.size.width), height: CGFloat(25))) 
keyboardToolBar.sizeToFit() 
keyboardToolBar.barStyle = .default 
daysHourTextField.inputAccessoryView = keyboardToolBar 
nextButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.textFieldShouldReturn)) 
keyboardToolBar.items = [UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), nextButton] 
} 
1

UIPickerView z przyciskiem Gotowe? Swift4

Krok 1: Dodanie jednego textFiled o nazwie txt_pickUpData w ViewController i przekazanie połączenia IBOutlet i przekazanie. również wziąć jedną zmienną UIDatePicker. i wziąć tablicę z wartością ciągu, która jest wyświetlana na kole zbieracza.

@IBOutlet weak var txt_pickUpData: UITextField! 
var myPickerView : UIPickerView! 
var pickerData = ["Hitesh Modi" , "Kirit Modi" , "Ganesh Modi" , "Paresh Modi"] 

Krok 2: Dodanie również delegata UIPickerView i UITextFiled.

class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{ 

Krok 3: Funkcja pickUp do tworzenia UIPickerView z paskiem narzędzi.

func pickUp(_ textField : UITextField){ 

// UIPickerView 
self.myPickerView = UIPickerView(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216)) 
self.myPickerView.delegate = self 
self.myPickerView.dataSource = self 
self.myPickerView.backgroundColor = UIColor.white 
textField.inputView = self.myPickerView 

// ToolBar 
let toolBar = UIToolbar() 
toolBar.barStyle = .default 
toolBar.isTranslucent = true 
toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1) 
toolBar.sizeToFit() 

// Adding Button ToolBar 
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.doneClick)) 
let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) 
let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ViewController.cancelClick)) 
toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) 
toolBar.isUserInteractionEnabled = true 
textField.inputAccessoryView = toolBar 

} 

Krok 4: Dodawanie metod przekazywania i metod danych UIPickerView do wyświetlania danych na kole UIPickerView.

//MARK:- PickerView Delegate & DataSource 
func numberOfComponents(in pickerView: UIPickerView) -> Int { 
return 1 
} 
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
return pickerData.count 
} 
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
return pickerData[row] 
    } 
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
self.txt_pickUpData.text = pickerData[row] 
} 
//MARK:- TextFiled Delegate 

func textFieldDidBeginEditing(_ textField: UITextField) { 
self.pickUp(txt_pickUpData) 
} 

Krok 5: Dodawanie dwóch przycisków, które znajdują się w Pasku narzędzi. Jeden jest doneKliknij, a drugi jest cancelClick. Co oznacza odrzucenie UIPickerView.

func doneClick() { 
    txt_pickUpData.resignFirstResponder() 
} 
func cancelClick() { 
    txt_pickUpData.resignFirstResponder() 
} 

Krok 6: Wywołanie funkcji pickUp w metodzie delegata UITextField.

func textFieldDidBeginEditing(_ textField: UITextField) { 
self.pickUp(txt_pickUpData) 
} 

Wystarczy skopiować i wkleić w swoim kodzie.

Powiązane problemy