Swift:从UIPickerView中选择后,TextField不会更新

时间:2017-02-06 09:02:13

标签: ios swift uipickerview

我创建了一个控制器,可以让管理员选择将新学生添加到数据库中。我正在尝试将UIPicker添加到使用不同自定义单元格的tableview中的文本字段中。

当我选择字段时会弹出UIPicker,它也会返回我的数组中的所有数据。问题是我从UIPicker中选择了一些东西后没有更新我的文本字段。然而,对控制台的简单打印确认选择有效。

如何正确地将我的选择发送到链接到UIPicker的文本字段?

class AddStudentInfoController: UITableViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet var addStudentGradeTextField: UITextField!

var pickerGrade = UIPickerView()
var allCellsText = [String]()

let firstNameCell = "firstNameCell"
let lastNameCell = "lastNameCell"
let gradeCell = "gradeCell"

var array = ["First Name", "Last Name", "Grade"]
var grade = ["--", "One", "Two", "Three"]

override func viewDidLoad() {
    super.viewDidLoad()

    pickerGrade.delegate = self
    pickerGrade.dataSource = self
    pickerGrade.backgroundColor = UIColor.white

    self.tableView.tableFooterView = UIView(frame: CGRect.zero)
    self.tableView.rowHeight = 60

    tableView.register(AddStudentFirstNameCell.self, forCellReuseIdentifier: firstNameCell)
    tableView.register(AddStudentLastNameCell.self, forCellReuseIdentifier: lastNameCell)
    tableView.register(AddStudentGradeCell.self, forCellReuseIdentifier: gradeCell)

}

// Load tableview
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return array.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    if indexPath.row == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: firstNameCell, for: indexPath) as! AddStudentFirstNameCell

        cell.textLabel!.text = self.array[indexPath.row]
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        return cell
    }

    else if indexPath.row == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: lastNameCell, for: indexPath) as! AddStudentLastNameCell

        cell.textLabel!.text = self.array[indexPath.row]
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        return cell
    }

    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: gradeCell, for: indexPath) as! AddStudentGradeCell

        cell.textLabel!.text = self.array[indexPath.row]
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        cell.addStudentGradeTextField?.inputView = pickerGrade

        return cell
    }
}

// Picker view
func textFieldDidBeginEditing(_ textField: UITextField) {
    pickerGrade.reloadAllComponents()
    pickerGrade.isHidden = false
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    addStudentGradeTextField?.text = grade[row]
    self.view.endEditing(true)
}

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

// End editing
func textFieldDidEndEditing(_ textField: UITextField) {
    allCellsText.append(textField.text!)
}
}

我为tableview提供的所有自定义单元格。

// #
// Custom cells for AddStudent.swift
// #
class AddStudentFirstNameCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let addStudentTextField: UITextField = {
    let addStudentTextField = UITextField()
    addStudentTextField.placeholder = "First Name"
    addStudentTextField.textColor = .red
    addStudentTextField.translatesAutoresizingMaskIntoConstraints = false
    addStudentTextField.rightViewMode = UITextFieldViewMode.always
    addStudentTextField.autocorrectionType = .no
    return addStudentTextField
}()

func setupViews() {

    addSubview(addStudentTextField)

    addStudentTextField.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10).isActive = true
    addStudentTextField.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    addStudentTextField.widthAnchor.constraint(equalToConstant: 150).isActive = true
    addStudentTextField.heightAnchor.constraint(equalToConstant: 48).isActive = true
}
}

class AddStudentLastNameCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let addStudentTextField: UITextField = {
    let addStudentTextField = UITextField()
    addStudentTextField.placeholder = "Last Name"
    addStudentTextField.textColor = .red
    addStudentTextField.translatesAutoresizingMaskIntoConstraints = false
    addStudentTextField.rightViewMode = UITextFieldViewMode.always
    addStudentTextField.autocorrectionType = .no
    return addStudentTextField
}()

func setupViews() {

    addSubview(addStudentTextField)

    addStudentTextField.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10).isActive = true
    addStudentTextField.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    addStudentTextField.widthAnchor.constraint(equalToConstant: 150).isActive = true
    addStudentTextField.heightAnchor.constraint(equalToConstant: 48).isActive = true
}
}

class AddStudentGradeCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
    setupViews()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let addStudentGradeTextField: UITextField! = {
    let addStudentGradeTextField = UITextField()
    addStudentGradeTextField.placeholder = "--"
    addStudentGradeTextField.textColor = .red
    addStudentGradeTextField.translatesAutoresizingMaskIntoConstraints = false
    addStudentGradeTextField.rightViewMode = UITextFieldViewMode.always
    addStudentGradeTextField.autocorrectionType = .no
    return addStudentGradeTextField
}()

func setupViews() {

    addSubview(addStudentGradeTextField)

    addStudentGradeTextField.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10).isActive = true
    addStudentGradeTextField.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    addStudentGradeTextField.widthAnchor.constraint(equalToConstant: 150).isActive = true
    addStudentGradeTextField.heightAnchor.constraint(equalToConstant: 48).isActive = true
}
}

崩溃日志

Starry`@objc AddStudentGradeCell.init(style : UITableViewCellStyle, reuseIdentifier : String?) -> AddStudentGradeCell:
0x10a402980 <+0>:   pushq  %rbp
0x10a402981 <+1>:   movq   %rsp, %rbp
0x10a402984 <+4>:   subq   $0x70, %rsp
0x10a402988 <+8>:   movq   %rdi, -0x28(%rbp)
0x10a40298c <+12>:  movq   %rcx, %rdi
0x10a40298f <+15>:  movq   %rdx, -0x30(%rbp)
0x10a402993 <+19>:  movq   %rsi, -0x38(%rbp)
0x10a402997 <+23>:  movq   %rcx, -0x40(%rbp)
0x10a40299b <+27>:  callq  0x10a46732a               ; symbol stub for: objc_retain
0x10a4029a0 <+32>:  movq   -0x40(%rbp), %rcx
0x10a4029a4 <+36>:  cmpq   $0x0, %rcx
0x10a4029a8 <+40>:  sete   %r8b
0x10a4029ac <+44>:  xorb   $-0x1, %r8b
0x10a4029b0 <+48>:  testb  $0x1, %r8b
0x10a4029b4 <+52>:  movq   %rax, -0x48(%rbp)
0x10a4029b8 <+56>:  jne    0x10a4029bc               ; <+60> at AddStudent.swift
0x10a4029ba <+58>:  jmp    0x10a4029dc               ; <+92> at AddStudent.swift
0x10a4029bc <+60>:  movq   -0x40(%rbp), %rdi
0x10a4029c0 <+64>:  callq  0x10a46747a               ; symbol stub for: static (extension in Foundation):Swift.String._unconditionallyBridgeFromObjectiveC (Swift.Optional<__ObjC.NSString>) -> Swift.String
0x10a4029c5 <+69>:  xorl   %esi, %esi
0x10a4029c7 <+71>:  movb   %sil, %r8b
0x10a4029ca <+74>:  movq   %rcx, -0x50(%rbp)
0x10a4029ce <+78>:  movq   %rax, -0x58(%rbp)
0x10a4029d2 <+82>:  movq   %rdx, -0x60(%rbp)
0x10a4029d6 <+86>:  movb   %r8b, -0x61(%rbp)
0x10a4029da <+90>:  jmp    0x10a4029f9               ; <+121> at AddStudent.swift
0x10a4029dc <+92>:  xorl   %eax, %eax
0x10a4029de <+94>:  movl   %eax, %ecx
0x10a4029e0 <+96>:  movb   $0x1, %dl
0x10a4029e2 <+98>:  movq   %rcx, %rsi
0x10a4029e5 <+101>: movq   %rcx, %rdi
0x10a4029e8 <+104>: movq   %rdi, -0x60(%rbp)
0x10a4029ec <+108>: movq   %rcx, -0x50(%rbp)
0x10a4029f0 <+112>: movq   %rsi, -0x58(%rbp)
0x10a4029f4 <+116>: movb   %dl, -0x61(%rbp)
0x10a4029f7 <+119>: jmp    0x10a4029f9               ; <+121> at AddStudent.swift
0x10a4029f9 <+121>: movb   -0x61(%rbp), %al
0x10a4029fc <+124>: movq   -0x50(%rbp), %rcx
0x10a402a00 <+128>: movq   -0x60(%rbp), %rdx
0x10a402a04 <+132>: movq   -0x58(%rbp), %rsi
0x10a402a08 <+136>: leaq   -0x20(%rbp), %rdi
0x10a402a0c <+140>: movq   %rsi, -0x20(%rbp)
0x10a402a10 <+144>: movq   %rdx, -0x18(%rbp)
0x10a402a14 <+148>: movq   %rcx, -0x10(%rbp)
0x10a402a18 <+152>: andb   $0x1, %al
0x10a402a1a <+154>: movb   %al, -0x8(%rbp)
0x10a402a1d <+157>: movq   -0x30(%rbp), %rcx
0x10a402a21 <+161>: movq   %rdi, -0x70(%rbp)
0x10a402a25 <+165>: movq   %rcx, %rdi
0x10a402a28 <+168>: movq   -0x70(%rbp), %rsi
0x10a402a2c <+172>: movq   -0x28(%rbp), %rdx
0x10a402a30 <+176>: callq  0x10a402680               ; Starry.AddStudentGradeCell.init (style : __C.UITableViewCellStyle, reuseIdentifier : Swift.Optional<Swift.String>) -> Starry.AddStudentGradeCell at AddStudent.swift:384
0x10a402a35 <+181>: addq   $0x70, %rsp exc_bad_instruction(code=exc_i386_invop,subcode=0x0)
0x10a402a39 <+185>: popq   %rbp
0x10a402a3a <+186>: retq   

1 个答案:

答案 0 :(得分:0)

我能够通过添加一行非常简单的代码来修复我的代码。

代码错误:

else {
    let cell = tableView.dequeueReusableCell(withIdentifier: gradeCell, for: indexPath) as! AddStudentGradeCell

    cell.textLabel!.text = self.array[indexPath.row]
    cell.selectionStyle = UITableViewCellSelectionStyle.none

    cell.addStudentGradeTextField?.inputView = pickerGrade
    cell.addStudentGradeTextField.placeholder = grade[0]

    return cell
}

好代码:

 else {
        let cell = tableView.dequeueReusableCell(withIdentifier: gradeCell, for: indexPath) as! AddStudentGradeCell

        cell.textLabel!.text = self.array[indexPath.row]
        cell.selectionStyle = UITableViewCellSelectionStyle.none

        cell.addStudentGradeTextField.inputView = pickerGrade
        cell.addStudentGradeTextField.placeholder = grade[0]

        addStudentGradeTextField = cell.addStudentGradeTextField

        return cell
    }