Ios 是否可以在Swift中从同一UITextField中设置UIPickerView和UIDatePicker?

Ios 是否可以在Swift中从同一UITextField中设置UIPickerView和UIDatePicker?,ios,swift,uipickerview,uidatepicker,Ios,Swift,Uipickerview,Uidatepicker,我是斯威夫特的新手,所以请容忍我 首先,让我解释一下我的应用程序布局: 我在屏幕上有一个文本字段,带有一个标签和一个按钮。我问用户3个问题-这些问题使用“标签”显示,并且每次用户按下下一个“按钮”时,下一个问题都会出现。这些问题是从数组中填充的 其中一个问题需要填充选择器视图,以便用户可以选择一个选项。 其中一个问题使用普通键盘。 最后一个问题,我需要使用日期选择器 这可能吗?如果是这样的话,你能告诉我如何将它添加到下面的代码中吗 let questions = ["What is your t

我是斯威夫特的新手,所以请容忍我

首先,让我解释一下我的应用程序布局:

我在屏幕上有一个文本字段,带有一个标签和一个按钮。我问用户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、UIExtFieldDelegate、UIPickerViewData源、UIPickerViewDeleteGate{

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实例的委托属性设置为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)
            }
        }
}

为你想使用的每个元素制作一个iBullet,检查你需要哪个问题,显示这个元素并隐藏others@Nick89我只是回去看看你是否可以使用这个解决方案,但我发现你的代码有问题。您放入nextButton:的函数textFieldDidBeginEditing:应退出此函数。textFieldDidBeginEditing:是在UITextFieldDelegate中声明的一个方法,您遵守该方法,现在应该实现它。记住,协议中未定义的declarednot方法只是抽象的,真正的实现在您的ViewController中。@Nick89如果您有任何问题,请告诉我,不要犹豫ask@user4130613-首先感谢您在这方面的帮助!我已经开始了一个新的项目,希望它能保持整洁。请查看上面我的所有新代码。据我所知,我已经更新了你对我说的一切,我想!,但它并没有像预期的那样起作用。我只看到一个日期选择器,我按下文本字段。我没有看到第一个问题的pickerView和第二个问题的键盘。。。?谢谢@user4130613-我想知道你是否有机会看看上面的内容?感谢Hanks用户4130613,我在上面添加了更多信息,因为我遇到了一些错误…谢谢你,对不起,我仍然有麻烦,我真的很想知道我哪里出了问题。我在上面的问题中添加了我的新代码,这样您就可以看到我的所有代码。我在说“使用未解析标识符”“PickServiceInstance”和“datePickerInstance”时出错。我真的很感激你帮助我理解我做错了什么,因为我对这一切都是新手,我很想了解一下!谢谢你advance@Nick89这是因为您尚未在ViewController类中定义PickServiceInstance和datePickerInstance,所以请在ViewController中定义并初始化它们