【问题标题】:trying to make picker view input for several textfields separately尝试分别为多个文本字段进行选择器视图输入
【发布时间】:2016-07-12 02:33:20
【问题描述】:

我正在使用 swift 制作 GPA 计算器,但遇到了一些问题。我创建了一个包含所有字母等级(A 到 F)的选择器视图。我已经放置了 7 个文本字段(每门课程一个)。我希望用户点击一个文本字段并且应该出现选择器视图,并且选择的等级将出现在文本字段中。我已经设法为第一个文本字段做到这一点,但我不知道如何编写允许我为每个文本字段选择等级的代码。我尝试了不同的方法,但我总是只更改第一个文本字段。

任何帮助表示赞赏:-)

这是我的代码(gradeOne 是课程 1 的文本字段,gradeTwo 是课程 2 等的文本字段):

导入 UIKit

类 GPA:UIViewController、UIPickerViewDelegate、UIPickerViewDataSource {

@IBOutlet var gradeOne: UITextField!

@IBOutlet var gradeTwo: UITextField!





//Grades array

var grades = ["A+/A (85-100)", "A- (80-84)", "B+ (77-79)", "B (73-76)", "B- (70-72)", "C+ (67-69)", "C (63-66)", "C- (60-62)", "D+ (57-59)", "D (53-56)", "D- (50-52)", "F (0-49)"]


//Grade 1 Picker
func numberOfComponentsInPickerView(gradePickerView: UIPickerView) -> Int {
    return 1
}

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

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

func pickerView(gradePickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    gradeOne.text = grades[row]

}



//Make keyboard disappear


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

    let gradePickerView = UIPickerView()
    gradePickerView.delegate = self
    gradeOne.inputView = gradePickerView


    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
    view.addGestureRecognizer(tap)

}

func dismissKeyboard() {
    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)
}

}

【问题讨论】:

    标签: ios swift xcode


    【解决方案1】:

    您应该将gradePickerView 设置为所有文本字段的输入视图

    gradeTwo.inputView = gradePickerView
    gradeThree.inputView = gradePickerView
    // set for rest of textfields
    

    然后在您的pickerView:didSelectRow: 方法中,您需要将文本设置为当时的活动文本字段。我建议使用 UITextFieldDelegate 设置活动文本字段

    var activeField: UITextField?
    
    override func viewDidLoad() {
        // Set VC as textfield's delegate
        gradeTwo.delegate = self
        gradeThree.delegate = self
        // Set for rest of textfields
    }
    
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
        activeField = textField
    }
    
    func pickerView(gradePickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        activeField.text = grades[row]
    }
    

    【讨论】:

    • 完美!!有效。您遗漏了一个小细节:textFieldShouldBeginEditing 应该返回 true :-)
    • 后续问题。我设法添加了一个“完成”按钮和一个“取消”按钮。但是,我不知道如何使它们起作用?一旦我点击它们,我的应用程序就会崩溃
    • 不知道它为什么会崩溃,我帮不了你太多。您可以在 xcode 的控制台日志中查看错误消息。我怀疑这是因为调用了未知选择器,即您正在调用尚未实现的函数。这些是添加按钮programmatically 和通过interface builder / storyboard 的几个指南
    【解决方案2】:

    使用 UITextField 的委托将所有 inputviews 设置为 pickerView。确保为所有文本字段设置委托

    let gradePickerView = UIPickerView()
    override func viewDidLoad() {
        super.viewDidLoad()
    
        // set delegates for all textfields
    
        gradePickerView.delegate = self
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
        view.addGestureRecognizer(tap)
    
    }
    
    func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
    
        textField.inputView = gradePickerView
    }
    

    【讨论】:

    • 我收到函数 textFieldShouldBeginEditing 的错误
    【解决方案3】:

    我想你想点击 7 textfiel。每次pickerView都会显示。您在 pickerView 中选择一个单元格,然后 textfiel(您只需点击)将显示您的选择?如果是真的。您应该执行以下步骤: 1:为每个textFiel添加标签:yourtextFiel.view.tag = 0(或1,2,3,4,...) 2:显示pickerView时:添加pickerView.tag = yourtextFiel.view.tag 3:在 fucion pickerView didSelectRow 中:获取您的 textFiel 的标签将显示您选择的内容:让 mytag = pickerView.tag。 使用“mytag”找到您的 textFiel 并更改您的文本 谷歌

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多