UITableView 单元格中的可重用单元格存在问题

Posted

技术标签:

【中文标题】UITableView 单元格中的可重用单元格存在问题【英文标题】:Having issue in reuseable cell in UITableView cell 【发布时间】:2017-02-23 13:03:55 【问题描述】:

我在单个UITableViewCell 中有两种设计。这是我在加载 viewController 时想要并得到的设计

但滚动后我得到以下结果。

我认为这个问题是由 UITableViewCell 的可重用性引起的。这是我的 cellForRowAtIndexPath 代码

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: "notificationCell", for: indexPath) as! NotificationTableViewCell
        cell.selectionStyle = .none
        cell.btnClose.tag = indexPath.row
        let noti_flag = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "noti_flag") //as! String
         let noti_flag_string = NSString(format: "%@", noti_flag as! CVarArg) as String

        cell.lbl_From.text = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "caller_id") as? String ?? ""

        if noti_flag_string == "0" 
            cell.lblTime.isHidden = true
            cell.imgThumbIcon.isHidden = true
            cell.lbl_remaining.isHidden = true
            cell.lbl_mm_text.text = "Missed call"
            cell.lbl_mm_text.font = cell.lbl_mm_text.font.withSize(23)

        
        else

            var startAttributedText = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "rebound_start_time") as! String
            var endAttributedText = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "rebound_end_time") as! String
            startAttributedText = Model.shared.convertLocalTimeToServer(timeString: startAttributedText,isTimeFromServer: true)
            endAttributedText = Model.shared.convertLocalTimeToServer(timeString: endAttributedText,isTimeFromServer: true)
            let dateString:String = startAttributedText + " - " + endAttributedText

            cell.lblTime.attributedText = convertStringToAttr(dateString: dateString)

            cell.lbl_remaining.text = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "remaining_time") as? String ?? ""

            cell.lbl_mm_text.text = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "mm_text") as? String ?? ""

            //cell.lbl_From.text = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "caller_id") as? String ?? ""

            let mm_type = (arrayNotificationList.object(at: indexPath.row) as! NSDictionary).object(forKey: "mm_type") as! String//"img"
            switch mm_type 
            case "img":
                cell.imgThumbIcon.image = UIImage(named: "thumb_camera")
            case "vid":
                cell.imgThumbIcon.image = UIImage(named: "thumb_video")
            case "aud":
                cell.imgThumbIcon.image = UIImage(named: "thumb_audio")
            case "str":
                cell.imgThumbIcon.image = UIImage(named: "thumb_sticker")
            case "txt":
                cell.imgThumbIcon.image = UIImage(named: "thumb_text")
            case "brd":
                cell.imgThumbIcon.image = UIImage(named: "thumb_brand")
            default:
                cell.imgThumbIcon.image = UIImage(named: "thumb_camera")
            
        


        return cell
    

所以请帮我解决这个问题。提前致谢。

【问题讨论】:

我认为问题在arrayNotificationList 。请调试并检查您的数组值。 @nirav 您可以轻松管理使用两个单元格。 cell.lblTime.isHidden = true 在 else 情况下你不做 cell.lblTime.isHidden = false。每次修改属性时,请考虑在其他情况下该怎么做:隐藏/显示/更改值等。否则,您可以覆盖 prepareForReuse() 来执行此操作,并隐藏/显示/重置值。 非常感谢@Larme。这对我很有帮助。 请将此作为答案发布,以便我标记为已接受。@Larme 【参考方案1】:

问题是当你滚动时,

        cell.lblTime.isHidden = true

行将标签隐藏在单元格中。重复使用时,它仍然是隐藏的,所以中间的标签放大以填满剩余空间。

解决办法是,

A.创建另一个单元子类,它可以显着清理代码,并且不再需要显示或隐藏标签。

B.确保设置

cell.lblTime.isHidden = false

在 else 子句中。

我希望这会有所帮助。

【讨论】:

以上是关于UITableView 单元格中的可重用单元格存在问题的主要内容,如果未能解决你的问题,请参考以下文章

滚动 UITableView 时自定义单元格中的 UITextField 文本正在更改

通过单元格中的可访问性标识符访问 UIButton

Swift - uitableview 重用单元格时用户输入混淆?

Swift 3 - 使用多个自定义单元重用单元的问题

将文本字段数据保存在 xcode 中的可扩展表格单元格中

表格单元格中的集合视图。这是重用的错误