我正在尝试将表视图与静态和动态部分混合使用。我的动态部分使用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
仅建议或评论?
由于
答案 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)
}