簡體   English   中英

在Swift中,是否可以從同一UITextField中獲得UIPickerView和UIDatePicker?

[英]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您可以將UIPickerViewUIDatePicker添加到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM