尝试为多个文本字段分别创建选择器视图输入。
尝试为多个文本字段分别创建选择器视图输入。
我正在使用Swift制作一个GPA计算器,但遇到了一些问题。我创建了一个选择器视图,其中包含所有的字母等级(A到F)。我放置了7个文本字段(每个课程一个)。我希望用户点击文本字段时,选择器视图会出现,并且所选等级会显示在文本字段中。我已经成功为第一个文本字段做到了这一点,但我不知道如何编写代码,使我能够为每个文本字段选择等级。我尝试了不同的方法,但总是只能改变第一个文本字段。
非常感谢任何帮助 🙂
这是我的代码(gradeOne是第一个课程的文本字段,gradeTwo是第二个课程的文本字段,以此类推):
import UIKit
class GPA: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet var gradeOne: UITextField!
@IBOutlet var gradeTwo: UITextField!
//等级数组
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)"]
//第一个等级选择器
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]
}
//使键盘消失
override func viewDidLoad() {
super.viewDidLoad()
// 在加载视图之后进行任何其他设置,通常是使用nib文件。
let gradePickerView = UIPickerView()
gradePickerView.delegate = self
gradeOne.inputView = gradePickerView
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
view.addGestureRecognizer(tap)
}
func dismissKeyboard() {
// 导致视图(或其嵌入的文本字段之一)放弃第一响应者状态。
view.endEditing(true)
}
}
问题的出现原因:
问题是想要为七个不同的文本字段分别创建一个选择器视图输入。每次点击文本字段时,选择器视图将显示出来。选择器视图中选择的单元格的值应该显示在刚刚点击的文本字段中。
解决方法:
1. 为每个文本字段添加标签:yourtextField.view.tag = 0(或1、2、3、4等)。
2. 在显示选择器视图时,将选择器视图的标签设置为相应文本字段的标签:pickerView.tag = yourtextField.view.tag。
3. 在pickerView的didSelectRow方法中,通过获取文本字段的标签来确定要显示的文本字段:let mytag = pickerView.tag。然后通过"mytag"找到相应的文本字段,并更改其文本。
代码示例:
yourtextField.view.tag = 0
pickerView.tag = yourtextField.view.tag
let mytag = pickerView.tag
let selectedTextField = view.viewWithTag(mytag) as? UITextField
selectedTextField?.text = pickerView.selectedRow(inComponent: 0).description
希望能帮到你!祝好运!
问题的原因是需要为多个文本字段分别创建选择器视图的输入。解决方法是将gradePickerView设置为所有文本字段的inputView,并在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
}
然后,在pickerView:didSelectRow:方法中,将选择的行的文本设置为活动文本字段的文本:
func pickerView(gradePickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
activeField.text = grades[row]
}
此外,为了解决添加“Done”按钮和“Cancel”按钮的功能问题,首先需要检查应用程序崩溃的原因。可以在Xcode的控制台日志中查看错误消息。可能是因为调用了尚未实现的函数导致的未知选择器崩溃。可以通过编程方式或通过接口构建器/故事板来添加按钮。以下是一些关于添加按钮的指南(链接)。
为了实现多个文本字段的选择器输入,我们需要将gradePickerView设置为所有文本字段的inputView,并使用UITextFieldDelegate设置活动文本字段。此外,为了使“Done”按钮和“Cancel”按钮功能正常工作,需要检查崩溃的原因并相应地添加按钮。