2017-02-22 6 views
0

У меня есть табличное представление со списком пользователей. Выбрав одного из пользователей, я могу загрузить их профиль пользователя в другом контроллере, включая их личную информацию. Работа по назначению.Swift: Инициализация данных и отправка их другому контроллеру

У меня также есть жестом, который позволяет администраторам редактировать или удалять этих пользователей. В настоящее время я пытаюсь отправить данные пользователя в контроллер «Редактировать пользователя», нажав кнопку «Изменить». Swift дает мне следующую ошибку: Constant «студенту» захваченное закрытием перед тем, как инициализируются

SEGUE к моему пользователю контроллеру

class Student: NSObject { 
    var profileImage: String 
    var firstName: String 

init(profileImage: String, firstName: String) { 
    self.profileImage = profileImage 
    self.firstName = firstName 
    } 
} 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    let student: Student 
    showUserprofileDetail(student: student) 
} 

func showUserprofileDetail(student: Student) { 

    let detailViewController = UserProfileController() 
    detailViewController.student = student 

    present(detailViewController, animated: true, completion: nil) 
} 

Профиля В моем пользователе контроллера профили загружает данные с помощью:

var student: Student? { 
     didSet { 
      if let profileImage = student?.profileImage { 
       profileImageView.image = UIImage(named: profileImage) 
      } 

      if let firstName = student?.firstName { 
       nameLabelView.text = firstName 
      } 
    } 

Под функцией салфетки для редактирования пользователей.

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

    // Edit student 
    let student: Student 

    let edit = UITableViewRowAction(style: .normal, title: "Edit") { action, index in 

     tableView.isEditing = true 

     self.editUserProfileDetail(student: student) 
    } 

    edit.backgroundColor = UIColor.lightGray 
    return [edit] 
} 

func editUserProfileDetail(student: Student) { 

    let detailViewController = EditStudentController() 
    detailViewController.student = student 

    self.present(detailViewController, animated: true, completion: nil) 
} 

Новая проблема: Все данные корректно толкают на новый контроллер, но только изображение профиля видна. Я также хочу, чтобы данные были перенесены во все мои текстовые поля. Мое текстовое поле - это пользовательские классы в виде таблицы. Как получить доступ к этим текстовым полям?

let editStudentTableViewController = EditStudentInfoController() 

    var student: Student? { 
     didSet { 
      if let profileImage = student?.profileImage { 
       profileImageView.image = UIImage(named: profileImage) 
      } 

      if let firstName = student?.firstName { 
       editStudentTableViewController.editStudentFirstNameTextField?.text? = firstName 
      } 
     } 
    } 

lazy var profileImageView: UIImageView = { 
    let imageView = UIImageView() 
    imageView.frame = CGRect(x: 0, y: 0, width: 100, height: 100) 
    imageView.image = UIImage(named: "profile_default") 
    imageView.isUserInteractionEnabled = true 
    imageView.layer.masksToBounds = false 
    imageView.layer.cornerRadius = imageView.frame.height/2 
    imageView.clipsToBounds = true 
    imageView.translatesAutoresizingMaskIntoConstraints = false 
    return imageView 
}() 

// MARK: Custom cells 
class EditStudentFirstNameCell: 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 editStudentFirstNameTextField: UITextField = { 
    let editStudentFirstNameTextField = UITextField() 
    editStudentFirstNameTextField.placeholder = "First Name" 
    editStudentFirstNameTextField.textColor = .red 
    editStudentFirstNameTextField.translatesAutoresizingMaskIntoConstraints = false 
    editStudentFirstNameTextField.rightViewMode = UITextFieldViewMode.always 
    editStudentFirstNameTextField.autocorrectionType = .no 
    return editStudentFirstNameTextField 
}() 

func setupViews() { 

    addSubview(editStudentFirstNameTextField) 

    editStudentFirstNameTextField.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10).isActive = true 
    editStudentFirstNameTextField.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true 
    editStudentFirstNameTextField.widthAnchor.constraint(equalToConstant: 200).isActive = true 
    editStudentFirstNameTextField.heightAnchor.constraint(equalToConstant: 48).isActive = true 
} 
} 
+4

Вы никогда не инициализирует объект Student. Где вы даете студенту свое имя и образ профиля? – Priyal

ответ

2

Вам необходимо назначить выбранного студента к объекту студента перед вызовом

showUserprofileDetail(student: student) 

        or 

self.editUserProfileDetail(student: student). 

Пусть говорят, ваш массив студента arrayStudents [Student], которые вы используете в таблице источника данных для отображения информации студента в таблице. Заменить строку кода:

let student:Student 

с

let student = arrayStudents[indexPath.row] 
+0

Большое вам спасибо! Он работает как прелесть: D –

+0

О, я думаю, он работал только для моего профиля, который напрямую доступен. Я также хочу поместить перенесенные данные, например, имя в одном из моих текстовых полей. Проблема в том, что мои текстовые поля являются пользовательскими классами в tableviewcontroller. Как я могу получить доступ к этим полям, чтобы я мог назначать перенесенные данные в каждое поле? –

+0

В источнике данных cellForRow таблицы вам нужно присвоить значение имени. Предположим, что ваше текстовое поле - это textName. Затем cell.textName.text = self.student.firstName. – sschunara