Swift 3 - 自定义单元格没有显示?

时间:2017-02-18 20:13:27

标签: ios swift uitableview

经过几个小时的努力弄清楚为什么我的海关细胞没有显示出来之后,我已经碰了一下。使用MVC模式:

Model.swift

struct studentProperties {
   var _title : String!
   var _forename : String!
   var _surname : String!
}

class MainModel {

   // Singleton instances
   static let modelInstance = MainModel()
   static var structInstance = studentProperties()

   // Array of structs
   var studentArray: [studentProperties] = []

   // MARK: - Initialization
   private init() {}

   func studentInput(title: String, forename: String, surname: String) {
       MainModel.structInstance._title = title
       MainModel.structInstance._forename = forename
       MainModel.structInstance._surname = surname
    }
}

CreateStudentController.swift

我不会显示整个文件,但是此代码位于保存按钮内 - 用户输入数据,并且该数据会附加到模型中的数组

 @IBAction private func saveNewStudentButton(_ sender: UIBarButtonItem) {

    // Put student data into the struct properties in model
    MainModel.modelInstance.studentInput(title: studentTitle.text!, forename: studentForename.text!, surname: studentSurname.text!)

    // Append the user input
    MainModel.modelInstance.studentArray.append(MainModel.structInstance)

    dismiss(animated: true, completion: nil)
    performSegue(withIdentifier: "returnToStudentsList", sender: sender)
 }

MainStudentController.swift

class MainStudentController: UIViewController, UITableViewDelegate, UITableViewDataSource {

   //MARK: - @IBOutlets
   @IBOutlet weak var myTableView: UITableView!

   //MARK: - @IBActions
   @IBAction func addStudentButton(_ sender: UIBarButtonItem) {

       dismiss(animated: true, completion: nil)

       performSegue(withIdentifier: "createStudentSegue", sender: sender)
   }

   override func viewDidLoad() {
       super.viewDidLoad()

       myTableView.delegate = self
       myTableView.dataSource = self

       myTableView.reloadData()
   }

   // MARK: - Table view data source
   func numberOfSections(in tableView: UITableView) -> Int {

       return 1
   }

   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

       print(MainModel.modelInstance.studentArray.count)
       return MainModel.modelInstance.studentArray.count
   }

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

       let cell: MainCell = self.myTableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MainCell

       cell.studentTitle?.text = MainModel.modelInstance.studentArray[0]._title
       cell.studentForename?.text = MainModel.modelInstance.studentArray[0]._forename
       cell.studentSurname?.text = MainModel.modelInstance.studentArray[0]._surname

       return cell
   }

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

       myTableView.deselectRow(at: indexPath, animated: true)
   }
}

还有另一个文件 - 它是UITableViewCell,但它实际上只有我的自定义单元格的出口。

问题

我目前遇到的问题是(我认为)围绕这种方法?:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    print(MainModel.modelInstance.studentArray.count)
    return MainModel.modelInstance.studentArray.count
}

用户输入数据 - >它会附加到该数组 - >因此,现在我使用数组中的那些元素来表示将会有的行数。

可悲的是,它目前没有显示任何行?我可以添加多个元素,它仍然不会显示任何行。然而,当我打印出相同的行时,它显示内部有元素(取决于我添加新数据的次数)。我有点困惑为什么这不是添加行?

我不确定这是我遗漏的东西还是代码中的错误。如果有人能看到我哪里出错了,我将不胜感激?

希望这能解释我的情况。

由于

1 个答案:

答案 0 :(得分:1)

根据此代码,您的问题只是表视图本身没有重新加载。您唯一的重新加载调用位于viewDidLoad,因此只有在您的视图第一次加载时才会加载(该方法只被调用一次)。您可以将myTableView.reloadData()viewDidLoad移至viewWillAppearviewDidAppear,从而轻松解决此问题。这应该就是你需要做的一切。

这样的事情:

override func viewWillAppear() {
       super.viewWillAppear()
       myTableView.reloadData()
   }