我对tableviews有意想不到的问题。每当我尝试重新加载我的tableviews数据时,应用程序似乎都会在没有错误的情况下退出。我知道数组是正确形成的,所以这些函数有问题:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView.tag == 1 {
return latest.count
}
else if tableView.tag == 2{
return older.count
}
else {
return 0 //In case of error
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:UITableViewCell?
if tableView.tag == 1 {
print("Success")
cell = tableView.dequeueReusableCell(withIdentifier: "latestCell")! as UITableViewCell
cell = UITableViewCell(style: UITableViewCellStyle.subtitle,
reuseIdentifier: "latestCell")
cell?.textLabel?.text = latest[indexPath.row]
cell?.detailTextLabel?.text = latestSub[indexPath.row]
cell?.accessoryType = .disclosureIndicator
return cell!
}
else if tableView.tag == 2 {
cell = tableView.dequeueReusableCell(withIdentifier: "olderCell")! as UITableViewCell
cell = UITableViewCell(style: UITableViewCellStyle.subtitle,
reuseIdentifier: "olderCell")
cell?.textLabel?.text = older[indexPath.row]
cell?.detailTextLabel?.text = olderSub[indexPath.row]
cell?.accessoryType = .disclosureIndicator
return cell!
}
else {
return cell!
}
}
这些类型的问题之前的答案是关于忘记设置代表和数据源等等......所以我认为这是一个合适的问题。
提前致谢!
编辑:
var latest = [String]()
var older = [String]()
var latestSub = [String]()
var olderSub = [String]()
override func viewDidAppear(_ animated: Bool) {
latestTable.reloadData()
olderTable.reloadData()
}
完整日志;
2017-02-16 15:57:28.889 NotebookApp [24985:604704]启用Firebase自动屏幕报告。调用+ [FIRAnalytics setScreenName:setScreenClass:]设置屏幕名称或覆盖默认屏幕类名称。要禁用自动屏幕报告,请在Info.plist中将标志FirebaseAutomaticScreenReportingEnabled设置为NO 2017-02-16 15:57:28.997 NotebookApp [24985:] Firebase Analytics v.3600000已启动 2017-02-16 15:57:28.999 NotebookApp [24985:]要启用调试日志记录,请设置以下应用程序参数:-FIRAnalyticsDebugEnabled 2017-02-16 15:57:29.012:启用了FIRInstanceID AppDelegate代理,将调用app委托远程通知处理程序。要禁用将“FirebaseAppDelegateProxyEnabled”添加到Info.plist并将其设置为NO 2017-02-16 15:57:29.020 NotebookApp [24985:]自动成功创建Firebase Analytics App委托代理。要禁用代理,请在Info.plist中将标志FirebaseAppDelegateProxyEnabled设置为NO 2017-02-16 15:57:29.090 NotebookApp [24985:] AdSupport Framework目前尚未关联。某些功能无法正常运行。 2017-02-16 15:57:29.180 NotebookApp [24985:]启用了Firebase Analytics 2017-02-16 15:57:45.703779 NotebookApp [24985:604704] [LayoutConstraints]无法同时满足约束。 可能至少下列列表中的一个约束是您不想要的约束。 试试这个: (1)查看每个约束并试图找出你不期望的; (2)找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您看到您不理解的NSAutoresizingMaskLayoutConstraints,请参阅UIView属性的文档translatesAutoresizingMaskIntoConstraints) ( “” “” )
将尝试通过违反约束来恢复
在UIViewAlertForUnsatisfiableConstraints处创建一个符号断点,以便在调试器中捕获它。 在列出的UIView上的UIConstraintBasedLayoutDebugging类别中的方法也可能有所帮助。 2017-02-16 16:01:34.316879 NotebookApp [24985:604704] [MC] systemgroup.com.apple.configurationprofiles路径的系统组容器是/ Users / tuomasnummela / Library / Developer / CoreSimulator / Devices / AA87179A-11E5-4A3A -A63F-B785AA71EC95 /数据/容器/共享/ SystemGroup / systemgroup.com.apple.configurationprofiles 2017-02-16 16:01:34.317476 NotebookApp [24985:604704] [MC]从私人有效用户设置中读取。
我有点认为这里没有任何有用的东西,因为当应用程序退出时它不会把我带到错误页面的东西并突出显示任何代码。
What my project looks like after the app has forcedly closed itself.
答案 0 :(得分:0)
第一个错误出现在viewDidAppear
,您必须调用super.viewDidAppear(animated)
,tableview重新加载永远不会被解雇。
答案 1 :(得分:0)
这里可能出错的是它找不到你在下面一行传递的重用标识符的单元格
cell = tableView.dequeueReusableCell(withIdentifier: "olderCell")! as UITableViewCell
您只需在viewDidLoad
中注册具有重用标识符的单元格即可 <olderTableView>.registerClass(UITableViewCell.self, forCellReuseIdentifier: "olderCell")
<latestTableView>.registerClass(UITableViewCell.self, forCellReuseIdentifier: "latestCell")
或
您只需使用以下
替换出队和初始化行if tableView.tag == 1 {
let reuseId = "latestCell"
let latestCell = tableView.dequeueReusableCell(withIdentifier: reuseId) ?? UITableViewCell(style: .subtitle, reuseIdentifier: reuseId)
latestCell.textLabel?.text = latest[indexPath.row]
latestCell.detailTextLabel?.text = latestSub[indexPath.row]
latestCell.accessoryType = .disclosureIndicator
return latestCell
}
答案 2 :(得分:0)
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
中有很多错误。崩溃可能来自力量展开cell
,在最后一行是零。
这是我的清理工作。请务必使用UITableViewCell
向您注册tableView.register(SubtitleCell.self, forCellReuseIdentifier:"latestCell")
子类。除非其他代码不可见,否则您可以对latestCell
和olderCell
使用相同的标识符 - 它们与您发布的代码似乎不同
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:UITableViewCell //can't be optional
if tableView.tag == 1 {
print("Success")
cell = tableView.dequeueReusableCell(withIdentifier: "latestCell", forIndexPath: indexPath) as! SubtitleCell
//cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "latestCell") //don't call this here, make a subclass of UITableViewCell to set style
cell.textLabel?.text = latest[indexPath.row]
cell.detailTextLabel?.text = latestSub[indexPath.row]
cell.accessoryType = .disclosureIndicator
return cell
}
else if tableView.tag == 2 {
//same comments as above
cell = tableView.dequeueReusableCell(withIdentifier: "olderCell", for: indexPath) as! SubtitleCell
cell.textLabel?.text = older[indexPath.row]
cell.detailTextLabel?.text = olderSub[indexPath.row]
cell.accessoryType = .disclosureIndicator
return cell
}
else {
cell = tableView.dequeueReusableCell(withIdentifier: "latestCell", forIndexPath: indexPath)
return cell //you were returning nil here - need to return a cell
}
}
以下是如何初始化正确的单元格样式的示例
class SubtitleCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
}