Выберите одну ячейку в UITableView, чтобы перейти к UITableView для отображения разных данных списков студентов. - PullRequest
0 голосов
/ 08 ноября 2018

Обновлено

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

ManageViewController Класс:

class ManageViewController : UIViewController, UITableViewDataSource, UITableViewDelegate{

@IBOutlet weak var tableView: UITableView!

var classList = [Class]()
var selectedClass: StudentData?


override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationItem.title = "Manage Classes"
    tableView.dataSource = self

    let fetchRequest: NSFetchRequest<Class> = Class.fetchRequest()

    do {
        let classList = try PersistenceService.context.fetch(fetchRequest)
        self.classList = classList
        self.tableView.reloadData()
    } catch {}


    // Do any additional setup after loading the view.
}

Добавить действие кнопки класса:

@IBAction func onAddTapped(_ sender: UIBarButtonItem) {
    let alert = UIAlertController(title: "Add Class", message: nil, preferredStyle: .alert)
    alert.addTextField { (classListTF) in
        classListTF.placeholder = "Enter Class"
    }
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    let action = UIAlertAction(title: "Add", style: .default) { (_) in
        guard let list = alert.textFields?.first?.text else { return }
        print(list)
        let subject = Class(context: PersistenceService.context)
        subject.class_name = list
        PersistenceService.saveContext()
        self.classList.append(subject)
        self.tableView.reloadData()
    }
    alert.addAction(action)
    present(alert, animated: true)
}

Код для выбора ячейки класса:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)

    // Unwrap that optional
    if let label = cell?.textLabel?.text {
        print("Tapped \(label)")
    }
    self.performSegue(withIdentifier: "studentInfoView", sender: self)
}

StudentListViewController класс:

class StudentListViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var studentList = [StudentData]()
var selectedStudent: StudentData?

override func viewDidLoad() {
    super.viewDidLoad()

    let fetchRequest: NSFetchRequest<StudentData> = StudentData.fetchRequest()

    do {
        let studentList = try PersistenceService.context.fetch(fetchRequest)
        self.studentList = studentList
        self.tableView.reloadData()
    } catch {}


}

@IBAction func addStudentTapped(_ sender: UIBarButtonItem) {
    let alert = UIAlertController(title: "Add Student", message: nil, preferredStyle: .alert)
    alert.addTextField { (studentListTF) in
        studentListTF.placeholder = "Enter name"
    }
    alert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
    let action = UIAlertAction(title: "Add", style: .default) { (_) in
        guard let student = alert.textFields?.first?.text else { return }
        print(student)
        let person = StudentData(context: PersistenceService.context)
        person.student_name = student
        PersistenceService.saveContext()
        self.studentList.append(person)
        self.tableView.reloadData()
    }
    alert.addAction(action)
    present(alert,animated: true)
}

Я обновил свой дополнительный код для ManageViewController класса и StudentInfoViewContrller класса. Извините, я новый программист Ios.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы можете передать данные об ученике на следующий просмотр UIViewController , используя prepare(for segue: UIStoryboardSegue, sender: Any?) делегат.

В вашем UIViewController , который имеет UITableView со всеми перечисленными учащимися, есть переменная, объявленная для удержания учащегося в таблице, вместе с вашей переменной studentList.

var selectedStudent: StudentData?

После этого в методе делегата UITableView didSelectRowAt установите значение для selectedStudent.

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

    // Make sure that the selected inexPath.row is within the bounds of the studentsList array.
    if indexPath.row < studentList.count {
        selectedStudent = studentList[indexPath.row]
        performSegue(withIdentifier: "studentInfoView", sender: self)
    }
}

Затем в том же UIViewController назначьте свойство student вашего UIViewController , в котором отображаются сведения об ученике.

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "studentInfoView" {
        // Replace 'StudentInfoViewController' with your detail UIViewController class name.
        let destinationVC = segue.destination as? StudentInfoViewController
        destinationVC?.student = selectedStudent
    }
}

Убедитесь, что у вас объявлено свойство student в StudentInfoViewController (или как вы его называете).

class StudentInfoViewController: UIViewController {

    var student: StudentData?

    // .......
    // .......
}

Затем, с помощью viewDidLoad() или любого другого метода настройки в StudentInfoViewController , вы можете настроить информацию об ученике на экране.

0 голосов
/ 08 ноября 2018

Вы должны добавить дополнительное условие, чтобы иметь возможность перейти к другому представлению, основанному на выбранной строке, например, ff:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)

    if indexPath.row == 0 {
        self.performSegue(withIdentifier: "toViewA", sender: self)
    } else {
        self.performSegue(withIdentifier: "toViewA", sender: self)
    }

}
...