热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在UITableView中正确显示JSON数据-ShowJSONdatacorrectlyinUITableView

IvemadeanUITableViewandfilleditwithJSONdataIgetinsidemyAPI.Igetandplaceallcorre

I've made an UITableView and filled it with JSON data I get inside my API. I get and place all correctly but when I scroll or delete a row everything gets messed up!

我已经创建了一个UITableView并用我在API中获得的JSON数据填充它。我得到并正确放置但是当我滚动或删除一行时,一切都搞砸了!

Take a look at the screenshot

Labels and images interfere; this is my code:

标签和图像干扰;这是我的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    var dict = productsArrayResult[indexPath.row]

    let cellImage = UIImageView(frame: CGRect(x: 5, y: 5, width: view.frame.size.width / 3, height: 90))
    cellImage.cOntentMode= .scaleAspectFit
    let productMainImageString = dict["id"] as! Int
    let url = "https://example.com/api/DigitalCatalog/v1/getImage?id=\(productMainImageString)&name=primary"
    self.downloadImage(url, inView: cellImage)
    cell.addSubview(cellImage)

    let cellTitle = UILabel(frame: CGRect(x: view.frame.size.width / 3, y: 5, width: (view.frame.size.width / 3) * 1.9, height: 40))
    cellTitle.textColor = UIColor.darkGray
    cellTitle.textAlignment = .right
    cellTitle.text = dict["title"] as? String
    cellTitle.fOnt= cellTitle.font.withSize(self.view.frame.height * self.relativeFontConstantT)
    cell.addSubview(cellTitle)

    let cellDescription = UILabel(frame: CGRect(x: view.frame.size.width / 3, y: 55, width: (view.frame.size.width / 3) * 1.9, height: 40))
    cellDescription.textColor = UIColor.darkGray
    cellDescription.textAlignment = .right
    cellDescription.text = dict["description"] as? String
    cellDescription.fOnt= cellDescription.font.withSize(self.view.frame.height * self.relativeFontConstant)
    cell.addSubview(cellDescription)

    return cell
}

5 个解决方案

#1


1  

You are adding subviews multiple times while dequeuing reusable cells. What you can do is make a prototype cell either in storyboard or as xib file and then dequeue that cell at cellForRowAtIndexPath.

您在重复使用可重复使用的单元格时多次添加子视图。你可以做的是在storyboard或xib文件中创建一个原型单元格,然后在cellForRowAtIndexPath中将该单元格出列。

Design Prototype cell and assgin with the custom class

Your custom class for cell will look similar to this where outlets are drawn from prototype cell.

您的单元格自定义类看起来类似于从原型单元格中绘制出口的类。

Note: You need to assign Reusable Identifier for that prototype cell.

注意:您需要为该原型单元分配可重用标识符。

class DemoProtoTypeCell: UITableViewCell { @IBOutlet var titleLabel: UILabel! @IBOutlet var descriptionLabel: UILabel! @IBOutlet var titleImageView: UIImageView! }

class DemoProtoTypeCell:UITableViewCell {@IBOutlet var titleLabel:UILabel! @IBOutlet var descriptionLabel:UILabel! @IBOutlet var titleImageView:UIImageView! }

Now you can deque DemoProtoTypeCell and use accordingly.

现在你可以deque DemoProtoTypeCell并相应地使用。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: DemoProtoTypeCell.self), for: indexPath) as! DemoProtoTypeCell
  cell.titleImageView.image = UIImage(named: "demoImage")
  cell.titleLabel.text = "demoTitle"
  cell.descriptionLabel.text = "Your description will go here."
  return cell
}

#2


0  

That's because you are adding subviews to reused (so that it may already have subviews added previously) cells.

那是因为您要添加子视图以重复使用(以便它可能已经添加了先前的子视图)单元格。

Try to check if the cell has subviews and fill in information you need, if there're no subviews then you add them to the cell.

尝试检查单元格是否包含子视图并填写所需信息,如果没有子视图,则将其添加到单元格。

Option 1

选项1

if let imageView = cell.viewWithTag(1) {
    imageView.image = //your image
} else {
    let imageView = UIImageView(//with your settings)
    imageView.tag = 1
    cell.addSubview(imageView)
}

Option 2

选项2

Crete UITableViewCell subclass that already has all the subviews you need.

Crete UITableViewCell子类已经包含了您需要的所有子视图。

#3


0  

I have used below method to remove all subviews from cell:

我使用下面的方法从单元格中删除所有子视图:

override func prepareForReuse() {
    for views in self.subviews {
        views.removeFromSuperview()
    }
}

But I have created UITableViewCell subclass and declared this method in it.

但我创建了UITableViewCell子类并在其中声明了此方法。

you can also do one thing as @sCha has suggested. Add tags to the subviews and then use the same method to remove subview from cell:

你也可以像@sCha建议的那样做一件事。将标记添加到子视图,然后使用相同的方法从单元格中删除子视图:

override func prepareForReuse() {
    for view in self.subviews {
        if view.tag == 1 {
          view.removeFromSuperview()
        } 
    }
}

Hope this helps.

希望这可以帮助。

#4


0  

I think the other answers already mentioned a solution. You should subclass the tableview cell and just change the values of your layout elements for each row.

我认为其他答案已经提到了解决方案。您应该子类化tableview单元格,只需更改每行的布局元素的值。

But I want to explain why you get this strange behaviour.

但我想解释为什么你会得到这种奇怪的行为。

When you call tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) it tries to reuse an already created cell with the passed identifier @"cell". This saves memory and optimises the performance. If not possible it creates a new one.

当您调用tableView.dequeueReusableCell(withIdentifier:“cell”,for:indexPath)时,它会尝试使用传递的标识符@“cell”重用已创建的单元格。这样可以节省内存并优化性能。如果不可能,它会创建一个新的。

So now we got a cell with layout elements already in place and filled with your data. Your code then adds new elements on top of the old ones. Thats why your layout is messed up. And it only shows if you scroll, because the first cells got no previous cells to load.

所以现在我们已经有了一个布局元素的单元格,并且已经填充了您的数据。然后,您的代码会在旧代码之上添加新元素。这就是为什么你的布局搞砸了。它只显示滚动,因为第一个单元格没有先前的单元格加载。

When you subclass the cell try to create the layout only once on first initialisation. Now you can pass all values to the respective layout element and let the tableview do its thing.

当您对单元格进行子类化时,尝试在第一次初始化时仅创建一次布局。现在,您可以将所有值传递给相应的布局元素,并让tableview执行其操作。

#5


0  

Try this:

尝试这个:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell:UITableViewCell! = tableView.dequeueReusableCell(withIdentifier: "cell")
        if cell == nil
        {
            cell = UITableViewCell.init(style: UITableViewCellStyle.default, reuseIdentifier: "cell")
        }
        for subView in cell.subviews
        {
            subView.removeFromSuperview()
        }
// Your Code here
    return cell
    }

推荐阅读
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • WinMain 函数详解及示例
    本文详细介绍了 WinMain 函数的参数及其用途,并提供了一个具体的示例代码来解析 WinMain 函数的实现。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • [转]doc,ppt,xls文件格式转PDF格式http:blog.csdn.netlee353086articledetails7920355确实好用。需要注意的是#import ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • DAO(Data Access Object)模式是一种用于抽象和封装所有对数据库或其他持久化机制访问的方法,它通过提供一个统一的接口来隐藏底层数据访问的复杂性。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 本文对比了杜甫《喜晴》的两种英文翻译版本:a. Pleased with Sunny Weather 和 b. Rejoicing in Clearing Weather。a 版由 alexcwlin 翻译并经 Adam Lam 编辑,b 版则由哈佛大学的宇文所安教授 (Prof. Stephen Owen) 翻译。 ... [详细]
author-avatar
少爷自控_592
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有