UITableViewCell嵌套UICollectionView滑动错乱问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UITableViewCell嵌套UICollectionView滑动错乱问题相关的知识,希望对你有一定的参考价值。
参考技术A 由于UITableViewCell的复用机制,CollectionView的contentOffset会错乱,解决方法,是可以给cell的model里添加一个属性,记录collectionView的偏移位置。在m文件里面,在collectionView滑动的代理方法,用model的偏移属性记录偏移的
在数据赋值的时候:
demo链接: https://wojia.coding.net/p/testdemo/d/UITableViewCell-UICollectionView/git
缺少返回 UITableViewCell
【中文标题】缺少返回 UITableViewCell【英文标题】:Missing return UITableViewCell 【发布时间】:2015-05-12 11:27:26 【问题描述】:我确信以前有人问过这个问题,但我找不到解决嵌套 if-else 和 switch-case 逻辑问题的答案。
我有一个UITableView
有两个部分,每个部分都有两个自定义单元格。就是它。 4 个细胞。但无论我做什么,我都会得到“预期返回 UITableViewCell
的函数中缺少返回”
问题如何更改此设置,以便在底部获得满足快速逻辑的 else 语句?
任何帮助将不胜感激
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
if indexPath.section == 0
switch (indexPath.row)
case 0:
let cell0: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell
cell0.backgroundColor = UIColor.redColor()
break
case 1:
let cell1: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell
cell1.backgroundColor = UIColor.whiteColor()
break
default:
break
if indexPath.section == 1
switch (indexPath.row)
case 0:
let cell10: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell
cell10.backgroundColor = UIColor.redColor()
break
case 1:
let cell11: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell
cell11.backgroundColor = UIColor.whiteColor()
break
default:
break
【问题讨论】:
你想做什么...? 你这是什么意思。我想要一个有 2 个部分的 tableView,每个部分有两个单元格。 @karlml 写。在 cellForRowAtIndexPath 方法中返回单元格语句 哈哈!我喜欢它!!为什么错误消息甚至会打扰消息... @karlml 您需要在 return 语句中提及您的 tableview 单元格名称...我认为它的 SettingsCell.. 所以写这行 return SettingsCell 【参考方案1】: 在方法开始时声明单元格, 根据部分和行号为单元格赋值, 在所有“不应该发生”的情况下抛出fatalError()
,
返回单元格。
另请注意,不需要break
语句。默认
Swift 中的行为是不会进入下一个案例。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
let cell: SettingsCell
switch(indexPath.section)
case 0:
switch (indexPath.row)
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
default:
fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)")
case 1:
switch (indexPath.row)
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
default:
fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)")
default:
fatalError("Unexpected section \(indexPath.section)")
return cell
fatalError()
错误函数被标记为@noreturn
,所以
编译器知道程序执行不会从
默认情况。 (这也有助于发现程序中的逻辑错误。)
编译器验证一个值被分配给cell
其他情况。
在此初始化 常量 (let cell ...
) 的可能性
方式在 Swift 1.2 中是新的。
或者,您可以创建一个单元格并“立即”返回它 在每种情况下:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
switch(indexPath.section)
case 0:
switch (indexPath.row)
case 0:
let cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
return cell
case 1:
let cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
return cell
default:
fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)")
case 1:
switch (indexPath.row)
case 0:
let cell = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
return cell
case 1:
let cell = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
return cell
default:
fatalError("Unexpected row \(indexPath.row) in section \(indexPath.section)")
default:
fatalError("Unexpected section \(indexPath.section)")
再次,调用fatalError()
解决了“缺少返回预期”编译器
错误。
如果有不同类型的单元格,此模式会很有用 (具有不同的类)在每种情况下创建。
【讨论】:
本次崩溃:致命错误:在线解开可选值时意外发现 nil:返回单元格 但是现在可以编译了吗? – 您是否已验证dequeueReusableCellWithIdentifier
返回有效单元格?您是否致电 registerNib(..)
或 registerClass(...)
或在 Storyboard 中定义了原型单元(针对所有单元标识符)?
我所有的原型单元格都是自定义的。应该有一个是空的吗?
@karlml:Storyboard 中是否定义了原型单元?您是否为每个原型单元分配了单元标识符(与您在代码中使用的相同)?
工作 - 非常感谢!!【参考方案2】:
您必须返回一个单元格,如果节数为 2,则此方法不会返回任何内容,当您指定的节数超过两个时就是这种情况。解决方案
第二个“if”将是“else”部分 限制节数【讨论】:
【参考方案3】:您的方法中缺少 return 语句。
return 语句示例。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
if indexPath.section == 0
switch (indexPath.row)
case 0:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
break
case 1:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
break
default:
let cellId: NSString = "Cell"
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell
break
if indexPath.section == 1
switch (indexPath.row)
case 0:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
break
case 1:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
break
default:
let cellId: NSString = "Cell"
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell
break
return cell
【讨论】:
你正在返回 if 之外的单元格 "return cell" 给出错误 "Use of unresolved identifier 'cell'" @karlml 您需要在 return 语句中提及您的 tableview 单元格名称......我认为它的 SettingsCell.. 所以写这行返回 SettingsCell。 我编辑它并提供更多信息。在默认情况下,您也需要创建一个单元格。即使它不应该永远到达。 嗯,“返回单元格”仍然给出错误“使用未解析的标识符'单元格'”【参考方案4】:你可以使用 else if 像这样:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
if indexPath.section == 0
switch (indexPath.row)
case 0:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
break
case 1:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
break
default:
break
else if indexPath.section == 1
switch (indexPath.row)
case 0:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell10", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.redColor()
break
case 1:
let cell: SettingsCell! = tableView.dequeueReusableCellWithIdentifier("cell11", forIndexPath: indexPath) as! SettingsCell
cell.backgroundColor = UIColor.whiteColor()
break
default:
break
return cell
它可以帮助你尝试一下
【讨论】:
else if indexPath.section == 1 给出错误“预期表达式” 哦!别担心,再次检查您的代码并检查表达式。它会解决你的问题。以上是关于UITableViewCell嵌套UICollectionView滑动错乱问题的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell嵌套UICollectionView滑动错乱问题
UITableViewCell嵌套UIWebView并且cell根据webView的内容自适应
UITableViewCell 中嵌套的 UIStackViews,会减慢滚动速度,降低性能。如何提高性能?
UITableViewCell中嵌套UICollectionView
UITableViewCell嵌套UITableView的正确姿势
FetchedResultsController 并在一个 UITableViewCell 中显示来自 3 个嵌套实体的数据