如何将当前单元格中的数据与TableView Swift 4中的前一个单元格进行比较?

时间:2018-02-24 08:38:51

标签: ios swift uitableview

我有一个JSON看起来像这样:

"product": [
    {
        "product_id": 471,
        "info": "123456",
    },
    {
        "product_id": 471,
        "info": "356697456",
    },
    {
        "product_id": 472,
        "info": "1432",
    },
    {
        "product_id": 473,
        "info": "4321",
    },
]

我想将TableView设置为如下图所示:

enter image description here

我想要的是:

  1. 如果TableView中的第一个单元格我想要显示产品1(红色)。

  2. 如果第二个单元格的product_id与之前单元格的product_id相同,则不再显示产品1,它会消失。

  3. 由于第3个单元格product_id与之前的单元格(第二个单元格)不同,因此显示红色标签Product 2。

  4. 同样转到Product 3以及TableView

  5. 中其他单元格

    我已经尝试过:

    为了实现这一点,我需要在cellAtRow委托中获取indexPath,因此我将每个单元格的product_id与前一个单元格进行比较,然后控制其中的逻辑。

    这是我的代码

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
    
            let thisIndexPath = indexPath.row
            if thisIndexPath - 1 > -1 {
    
                let previousProductId = self.productItem[thisIndexPath - 1].productId
                let thisProductId = self.productItem[thisIndexPath].productId
    
                if  previousProductId == thisProductId {
    
                    cell.productLabel.isHidden = true
                    cell.productHeight.constant = 0
                    cell.productnameTopContraint.constant = 0
                    cell.productnameBottomContraints.constant = 0
                }else {
                    cell.productnameLabel.isHidden = false
    
                }
            }else{
                cell.productnameLabel.isHidden = false
            }
    
            cell.item = selfProductItem[indexPath.row]
            return cell
        }
    }
    

    但现在的问题是:

    - 当TableView首次启动时,UI显示如上所示,但当我开始滚动时,所有单元格的 Product 标签(红色)都消失了,虽然product_id与之前的单元格product_id不相同。

    - 当我滚动回第一个单元格时,产品标签(红色)也消失了。这意味着UI只在第一次启动屏幕时才是正确的,这不是持久的。

    所以我的问题是:

    1. 比较当前单元格与上一单元格的数据的正确方法是什么?

    2. cellForRowAt委托方法中进行比较是否正确?如果不是,我应该在哪里执行此操作?

4 个答案:

答案 0 :(得分:1)

我认为,要解决您的问题,您应该考虑如何存储JSON数据。

您可以首先创建一个名为&{39;产品的struct产品。它将存储产品信息,然后通过制作Equatable您可以添加一个功能,以便您比较产品ID'

/// Structure Of A Product
struct Product: Equatable{

  var productID: Int
  var productInfo: Int

  static func == (lhs: Product, rhs: Product) -> Bool {
    return lhs.productID == rhs.productID
  }
}

现在使用您的结构,您可以创建一个Array变量来存储您的产品:

//Array To Store Array Of Product
var products = [Product]()

在此示例中,我只是手动输入产品信息,但您应该以更好的方式处理此问题。但是,它确实说明了一种可以“开始”的方式。处理这个:

   override func viewDidLoad() {
    super.viewDidLoad()

    //1. Create Products
    let productOne = Product(productID: 471, productInfo: 123456)
    let productTwo = Product(productID: 471, productInfo: 356697456)
    let productThree = Product(productID: 472, productInfo: 1432)
    let productFour = Product(productID: 473, productInfo: 4321)

    //2. Add Them To The Products Array
    addUnique(productOne)
    addUnique(productTwo)
    addUnique(productThree)
    addUnique(productFour)

}

/// Checks That A Product Doesn't Exist
///
/// - Parameter product: Product
func addUnique(_ product: Product) {
    if !products.contains(product) {
        products.append(product)
    }
}

在第1步中,我们手动创建产品。

在第2步中,我们调用addUnique(_ product)函数,该函数只允许存储唯一的产品。

确保没有重复的ProductID后,您可以轻松设置所需格式:

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyCell
    cell.productLabel.text = products[indexPath.row].productID
    cell.productnameLabel.text = products[indexPath.row].productInfo
}

当然,您需要修复标签的任何颜色等。

答案 1 :(得分:1)

我试过,它工作正常。我为你制作了一个虚拟阵列。请检查下面的

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tblProduct: UITableView!

var arrProduct = NSMutableArray()
var arrForSection = NSMutableArray()
var arrForProductId = NSMutableArray()

override func viewDidLoad()
{
    super.viewDidLoad()

    let dict = NSMutableDictionary()
    dict.setValue("471", forKey: "product_id")
    dict.setValue("123456", forKey: "info")
    arrProduct.add(dict)

    let dict1 = NSMutableDictionary()
    dict1.setValue("471", forKey: "product_id")
    dict1.setValue("356697456", forKey: "info")
    arrProduct.add(dict1)

    let dict2 = NSMutableDictionary()
    dict2.setValue("472", forKey: "product_id")
    dict2.setValue("1432", forKey: "info")
    arrProduct.add(dict2)

    let dict3 = NSMutableDictionary()
    dict3.setValue("472", forKey: "product_id")
    dict3.setValue("4321", forKey: "info")
    arrProduct.add(dict3)

    print(arrProduct)

    self.createSection()
}

//MARK:
//MARK: Create section
func createSection()
{
    arrForSection.removeAllObjects()
    let arrtemp = NSMutableArray()

    arrtemp.addObjects(from: (self.arrProduct as NSArray) as! [Any])

    for i in 0 ..< arrtemp.count
    {
        let dict = self.arrProduct[i] as! NSMutableDictionary
        let strProductId = (dict["product_id"] as? String)!

        if(!arrForProductId .contains(strProductId))
        {
            arrForProductId.add(strProductId)
        }
    }

    for j in 0 ..< arrForProductId.count
    {
        let strTempDate:String = arrForProductId .object(at: j) as! String
        let arr1 = NSMutableArray()

        for i in 0 ..< arrtemp.count
        {
            let dict = arrtemp .object(at: i) as! NSMutableDictionary
            let strProductId = (dict["product_id"] as? String)!
            if(strProductId == strTempDate)
            {
                arr1.add(dict)
            }
        }
        arrForSection.add(arr1)
    }

    self.tblProduct.reloadData()
}

//MARK:
//MARK: TableView Delegate
func numberOfSections(in tableView: UITableView) -> Int {

    return self.arrForSection.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return (((arrForSection .object(at: section)) as! NSMutableArray).count)
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell:UITableViewCell = self.tblProduct.dequeueReusableCell(withIdentifier: "cell")!

    let dictData = ((arrForSection .object(at: indexPath.section)) as! NSMutableArray).object(at: indexPath.row) as! NSDictionary

    cell.textLabel?.text = dictData["info"] as? String

    return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
{
    return arrForProductId[section] as? String
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{

}


override func didReceiveMemoryWarning()
{
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

结果见附件

enter image description here

希望它有所帮助!

答案 2 :(得分:0)

我认为在这种情况下,您可以在表格中划分表格视图的单元格,并为每个部分指定标题(产品名称)。请仔细阅读official documentation以获取更多信息。

答案 3 :(得分:0)

尝试在else部分设置高度约束。 else部分内容:if previousProductId == thisProductId {和此:if thisIndexPath - 1 > -1 {