Swift 4 UITableView静态和动态单元混合在iPhone上崩溃但在模拟器中没有崩溃

时间:2018-04-23 12:15:07

标签: uitableview dynamic static ios-simulator swift4

我正在尝试将表视图与静态和动态部分混合使用。我的动态部分使用Xib文件/类。

输出应该是这样的 Result of the working app

第1节和第3节是静态的,第2节是动态的,并显示联系人的姓名(来自笔尖)。

我在UITableView Mix of Static and Dynamic Cells?

页面上将我的代码基于山野的例子

在模拟器上,我有3个联系人,在iPhone上,我的阵列有4个显示。我在cellForRowAt中打印一个带有名称的注释,并打印所有4个名称。

我在模拟器上得到了正确的结果,它在iPhone上崩溃并出现错误

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [__ NSArrayI objectAtIndex:]:索引3超出边界[0 .. 2]'

我在带有IOS 11.3的iPhone X上使用Swift 4,Xcode 9.3。

我的代码是

import UIKit
import Contacts

class EditEvenementTableViewController: UITableViewController {

    var événement: Evenement? = nil


    override func viewDidLoad() {
        super.viewDidLoad()

        addData() // fill an array for test

        let nib = UINib.init(nibName: "DefaultParticipantTableViewCell", bundle: nil)
        self.tableView.register(nib, forCellReuseIdentifier: "DefaultParticipantTableViewCell")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    } // numberOfSections

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

        if section == 1 {
            return (self.événement?.defaultParticipants.count)!
        }
        return super.tableView(tableView, numberOfRowsInSection: section)
    } // numberOfRowsInSection

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 1 {
            let participant = (événement?.defaultParticipants[indexPath.row])!
            let cell = tableView.dequeueReusableCell(withIdentifier: "DefaultParticipantTableViewCell") as! DefaultParticipantTableViewCell
            cell.nomCompletLabel.text = participant.nomComplet
            return cell
        }
        return super.tableView(tableView, cellForRowAt: indexPath)
    } // cellForRowAt

} // EditEvenementTableViewController

仅建议或评论?

由于

2 个答案:

答案 0 :(得分:0)

首先尝试摆脱“!”在你的代码中尝试像这样的smth:

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

    if section == 1 {
        return self.événement?.defaultParticipants.count ?? 0
    }
    return 0
} // numberOfRowsInSection

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let événement = self.événement else { return super.tableView(tableView, cellForRowAt: indexPath) }
    if indexPath.section == 1 {
        let participant = événement.defaultParticipants[indexPath.row]            
        if let cell = tableView.dequeueReusableCell(withIdentifier: "DefaultParticipantTableViewCell") as? DefaultParticipantTableViewCell {
        cell.nomCompletLabel.text = participant.nomComplet
        return cell
        }

    return UITableViewCell()
} // cellForRowAt

答案 1 :(得分:0)

您可以通过在下面添加缺少的部分来重试:

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.section == 1 {
            return 44
        }
        return super.tableView(tableView, heightForRowAt: indexPath)
    }