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 个嵌套实体的数据