[英]How to use UIPickerview and UIDatePicker on the same Viewcontroller?
[英]Is it possible to have a UIPickerView and a UIDatePicker from the same UITextField in Swift?
我是Swift的新手,請多多包涵。
首先,讓我解釋一下我的應用布局:
我在屏幕上有一個文本字段,帶有標簽和按鈕。 我問用戶3個問題-這些問題使用“標簽”顯示,每當用戶按下“下一個”按鈕時,下一個問題就會出現(這些問題是從數組中填充的)。
問題之一是填充“選擇器視圖”(以便用戶可以選擇一個選項)。 問題之一是使用普通鍵盤。 最后一個問題是我需要使用日期選擇器。
這可能嗎? 如果是這樣,請您告訴我如何將其添加到下面的代碼中?
let questions = ["What is your title?", "What is your full name?", "When were you born?"]
var currentQuestionIndex = 0
let placeholder = ["Title", "Full name", "Date of birth"]
var currentPlaceholderIndex = 0
@IBAction func nextButton(sender: AnyObject) {
textField.hidden = false
textField.placeholder = placeholder[currentPlaceholderIndex]
barImage.hidden = false
// Reset text field to have no text
textField.text = ""
questionLabel.text = questions[currentQuestionIndex]
// Displays the questions in array
if currentQuestionIndex < questions.count {
++currentQuestionIndex
// Displays the placeholder text in the textfield
if currentPlaceholderIndex < placeholder.count {
++currentPlaceholderIndex
}
buttonLabel.setTitle("Next", forState: UIControlState.Normal)
}
else {
//Add some logic here to run whenever the user has answered all the questions.
}
}
謝謝你的幫助!
缺口
下面的新代碼(自2015年4月6日起):
ViewController類:UIViewController,UITextFieldDelegate,UIPickerViewDataSource,UIPickerViewDelegate {
var pickerData = ["Mr", "Mrs", "Miss", "Ms", "Doctor"]
var questions = ["What is your title?", "What is your name?", "What is your DOB?"]
var currentQuestionIndex = 0
var datePickerView:UIDatePicker = UIDatePicker()
var pickerView:UIPickerView = UIPickerView()
@IBOutlet var buttonLabel: UIButton!
@IBOutlet var questionsLabel: UILabel!
@IBOutlet var textField: UITextField!
@IBAction func textFieldEditing(sender: UITextField) {
datePickerView.datePickerMode = UIDatePickerMode.Date
sender.inputView = datePickerView
datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)
}
func datePickerValueChanged(sender: UIDatePicker) {
var dateformatter = NSDateFormatter()
dateformatter.dateStyle = NSDateFormatterStyle.LongStyle
textField.text = dateformatter.stringFromDate(sender.date)
}
@IBAction func nextButton(sender: UIButton) {
textField.text = ""
textField.hidden = false
buttonLabel.setTitle("Next", forState: UIControlState.Normal)
questionsLabel.text = questions[currentQuestionIndex]
if currentQuestionIndex < questions.count {
currentQuestionIndex++
}
else {
//println("questions are complete")
}
}
func textFieldDidBeginEditing(textField: UITextField) {
switch currentQuestionIndex {
case 0:
self.view.addSubview(datePickerView)
case 2:
self.view.addSubview(pickerView)
default:
println("Test")
}
}
override func viewDidLoad() {
super.viewDidLoad()
buttonLabel.setTitle("Start", forState: UIControlState.Normal)
textField.hidden = true
questionsLabel.text = ""
textField.delegate = self
pickerView.delegate = self
pickerView.dataSource = self
// 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 textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
self.view.endEditing(true)
}
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) {
textField.text = pickerData[row]
pickerView.hidden = true
}
}
根據currentQuestionIndex
您可以將UIPickerView
或UIDatePicker
添加到UITextField
實例中
switch currentQuestionIndex {
case 0:
// TODO: Add UIPickerView
case 2:
// TODO: Add UIDatePicker
}
編輯:更多說明
首先,遵循UITextFieldDelegate
並實現textFieldDidBeginEditing(:)
,因為您想在UITextField實例獲得第一個響應者狀態時獲得通知,所以必須實現該方法。
另外,將UITextField
實例的delegate
屬性設置為self
或要放置的任何實例/對象,並實現textFieldDidBeginEditing(:)
然后寫這段代碼
func textFieldDidBeginEditing(_ textField: UITextField) {
switch currentQuestionIndex {
case 0:
// TODO: Add UIPickerView
// Add it for example at the bottom your view self.view.addSubview(pickerViewInstance)
// or add it as the subview of UIPopoverController instance that is added to your UITextField instance
case 2:
// TODO: Add UIDatePicker
// Add it for example at the bottom your view self.view.addSubview(datePickerInstance)
// or add it as the subview of UIPopoverController instance that is added to your UITextField instance
}
}
當您想向UIPopoverViewController添加另一個視圖時,請記住刪除添加的視圖。
編輯:添加實際的實現
class NewCaseViewController : UIViewController {
. . .
@IBOutlet weak var textField: UITextField // TODO: Initialize it properly in designated initializer
var popoverController: UIPopoverController! // TODO: Initialize it
. . .
}
class PopoverContentManager : UIViewController {
. . .
var pickerView: UIPickerView // TODO: Initialize it properly
var datePicker: UIDatePicker // TODO: Initialize it properly
. . .
}
extension NewCaseViewController : UITextFieldDelegate {
func textFieldBeginEditing(_ textField: UITextField) {
println(__FUNCTION__)
var popover = PopoverContentManager()
switch self.currentQuestionIndex {
case 0:
popover.datePicker.hidden = true
self.popoverController = init(contentViewController: popOver)
self.popoverController.presentPopoverFromRect(self.textField.bounds, inView: self.textField, permittedArrowDirections: UIPopoverArrowDirectionDown, animated: true)
self.popoverController.popoverContentSize = CGSizeMake(120, 90)
case 1:
popover.pickerView.hidden = true
self.popoverController = init(contentViewController: popOver)
self.popoverController.presentPopoverFromRect(self.textField.bounds, inView: self.textField, permittedArrowDirections: UIPopoverArrowDirectionDown, animated: true)
self.popoverController.popoverContentSize = CGSizeMake(120, 90)
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.