2017-02-06 1 views
0

Ich habe einen Controller erstellt, der Administratoren die Möglichkeit gibt, neue Studenten zur Datenbank hinzuzufügen. Ich versuche, ein UIPicker zu einem Textfeld in einer Tabellenansicht hinzuzufügen, die andere benutzerdefinierte Zellen verwendet.Swift: TextField aktualisiert sich nicht nach der Auswahl aus UIPickerView

Der UIPicker erscheint, wenn ich das Feld auswähle, und es gibt auch alle Daten aus meinem Array zurück. Das Problem ist, dass mein Textfeld nach dem Auswählen von etwas aus dem UIPicker NICHT aktualisiert wird. Ein einfacher Druck auf die Konsole bestätigt jedoch, dass die Auswahl funktioniert.

Wie sende ich meine Auswahl korrekt an das Textfeld, das mit dem UIPicker verbunden ist?

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!) 
} 
} 

Alle meine benutzerdefinierten Zellen für die Tabellenansicht.

// # 
// 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 
} 
} 

Crashlog

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 
+0

haben Sie Ihr Handy neu zu laden? – karthikeyan

+0

Wird Ihre PickerViewDidSelectRow-Funktion aufgerufen? –

+0

Kannst du dein Storyboard oder Xib zeigen? – User511

Antwort

0

konnte ich meinen Code beheben, indem eine sehr einfache Codezeile hinzuzufügen.

Falscher Code:

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 
} 

Guter Code:

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 
    } 
Verwandte Themen