Swift:每次重新加载时都会一次又一次地添加表格视图单元格内容?

Posted

技术标签:

【中文标题】Swift:每次重新加载时都会一次又一次地添加表格视图单元格内容?【英文标题】:Swift: tableview cell content is added again and again with each reload? 【发布时间】:2016-08-25 01:51:00 【问题描述】:

好的,我很公平,这个 Objective C 问题也有同样的问题 = Cell Label text overlapping in cells 但我在 Swift 中没有找到任何答案。我对表格视图/单元格也很陌生,我只想知道正确的方法,因为我做错了-

我在故事板中创建的 tableview 中有自定义单元格。我需要以编程方式添加单元格的内容(标签等)。我已经在这里完成了 -

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! EventTableCellTableViewCell
//        cell.eventTitle.text = names[indexPath.row]
//        cell.eventDescription.text = descriptions[indexPath.row]

        cell.contentView.clipsToBounds = false

        //cell UIX
        let eventTitleLabel = UILabel()
        let dateLabel = UILabel()
        let authorLabel = UILabel()
        let locationLabel = UILabel()

        let categoryView = UIImageView()

        //border
        let botBorder: CALayer = CALayer()
        botBorder.frame = CGRectMake(0.0, cell.frame.height-1, cell.frame.width, 1.0)
        botBorder.backgroundColor = colorWithHexString("#C5C7C9").CGColor

        //initalize cell items
        eventTitleLabel.text = names[indexPath.row]
        eventTitleLabel.frame = CGRectMake(0, 0, cell.frame.width * 0.5, cell.frame.height * 0.3)
        eventTitleLabel.tag = indexPath.row
        eventTitleLabel.textAlignment = .Left
        eventTitleLabel.font = UIFont(name: "Montserrat-Bold", size: screenSize.height * (24/568))
        eventTitleLabel.textColor = UIColor.blackColor()
        eventTitleLabel.center = CGPointMake(cell.contentView.frame.width * 0.35, cell.contentView.frame.height * 0.35)


        dateLabel.textColor = colorWithHexString("#C5C7C9")
        let dateString = "\(dates[indexPath.row]) \(times[indexPath.row])"
        dateLabel.text = dateString
        dateLabel.frame = CGRectMake(0, 0, cell.frame.width * 0.5, cell.frame.height * 0.3)
        dateLabel.tag = indexPath.row
        dateLabel.textAlignment = .Left
        dateLabel.font = UIFont(name: "Montserrat-Regular", size: screenSize.height * (10/568))
        dateLabel.center = CGPointMake(cell.contentView.frame.width * 0.35, cell.contentView.frame.height * 0.6)

        //for setting bottom label

        //Code sets label (yourLabel)'s text to "Tap and hold(BOLD) button to start recording."
        let boldAttribute = [
            //You can add as many attributes as you want here.
            NSFontAttributeName: UIFont(name: "Montserrat-Bold", size: 11.0)!]

        let regularAttribute = [
            NSFontAttributeName: UIFont(name: "Montserrat-Regular", size: 11.0)!]

        let beginningAttributedString = NSAttributedString(string: authors[indexPath.row], attributes: boldAttribute )
        //let boldAttributedString = NSAttributedString(string: locationNames[indexPath.row], attributes: boldAttribute)
        let boldAttributedString = NSAttributedString(string: "Monterey, CA USA", attributes: regularAttribute)
        let fullString =  NSMutableAttributedString()

        fullString.appendAttributedString(beginningAttributedString)
        fullString.appendAttributedString(NSAttributedString(string: "  ", attributes: regularAttribute)) //space
        fullString.appendAttributedString(boldAttributedString)
        //------

        authorLabel.attributedText = fullString

        authorLabel.textColor = colorWithHexString("#C5C7C9")
        authorLabel.frame = CGRectMake(0, 0, cell.frame.width, cell.frame.height * 0.3)
        authorLabel.tag = indexPath.row
        authorLabel.textAlignment = .Left
        authorLabel.center = CGPointMake(cell.contentView.frame.width * 0.5, cell.contentView.frame.height * 0.8)

        categoryView.frame = CGRectMake(0, 0, screenSize.width * (50/screenSize.width), screenSize.width * (50/screenSize.width))
        categoryView.layer.cornerRadius = categoryView.frame.width * 0.5
        categoryView.center = CGPointMake(cell.contentView.frame.width * 0.7, cell.contentView.frame.height * 0.35)
        categoryView.backgroundColor = colorWithHexString("#3dccff")
        cell.contentView.addSubview(categoryView)


        cell.contentView.addSubview(eventTitleLabel)
        cell.contentView.addSubview(dateLabel)
        cell.contentView.addSubview(locationLabel)
        cell.contentView.addSubview(authorLabel)
        cell.contentView.layer.addSublayer(botBorder)

        print("called cell")

        return cell
    

这是第一次。但是,我从打印到控制台中了解到,每次滚动时都会调用它,并且在我添加新项目后会在我的表格视图中占用新单元格。当发生这种情况时,我会得到重叠 -

我该如何解决这个问题?我还查看了TableViewCell is piled up and appear again and again 并尝试将cell.contentView.removeFromSuperView() 放在此函数的开头,这样它会清除旧内容,但结果绝对没有出现。

以编程方式添加内容的正确方法是什么?

【问题讨论】:

为什么所有这些代码都在您的cellForRowAtIndexPath 函数中?您有一个自定义单元格类。大部分代码都属于该类。把代码放在它所属的地方。 不要在cellForRowAtIndexPath 的单元格中添加子视图。让每个单元格都已拥有其标签/子视图(在 Interface Builder 中设计,或在 init() 上以编程方式设计),然后通过每次更新标签的 text 等来配置它们。 你能看看我的问题***.com/questions/39148460/…我似乎无法在自定义类中配置任何东西 【参考方案1】:

tableview 单元格被回收,因此每次呈现一个单元格时,它都会包含您最后放入的任何内容,您需要适当地处理一个返回的单元格,该单元格会填满您放入的标签。可能应该有某种单元格的 init 方法,每个 new 单元格只调用一次,当单元格被回收时被忽略,然后只需编辑标签和其他正常的东西。这种功能应该内置在单元格自定义类本身中,而不是在cellForRowAtIndexPath

【讨论】:

好的,我在尝试在 init 中做任何事情时遇到问题,因为它没有被调用..你会看***.com/questions/39148460/…

以上是关于Swift:每次重新加载时都会一次又一次地添加表格视图单元格内容?的主要内容,如果未能解决你的问题,请参考以下文章

活动加载一次又一次

一次又一次地在新的相同标签中打开一个网址

CoreData 一次又一次地将数据添加到数据库中

在父组件的 onClick 上一次又一次地添加子组件,每次使用新的道具到子组件

Swift,如何通过按下按钮一次又一次地播放声音

托管在 Azure 上的点网 mvc 应用程序突然一次又一次地重定向到登录页面,直到重新启动