我有一个JSON看起来像这样:
"product": [
{
"product_id": 471,
"info": "123456",
},
{
"product_id": 471,
"info": "356697456",
},
{
"product_id": 472,
"info": "1432",
},
{
"product_id": 473,
"info": "4321",
},
]
我想将TableView设置为如下图所示:
我想要的是:
如果TableView中的第一个单元格我想要显示产品1(红色)。
如果第二个单元格的product_id
与之前单元格的product_id
相同,则不再显示产品1,它会消失。
由于第3个单元格product_id
与之前的单元格(第二个单元格)不同,因此显示红色标签Product 2。
同样转到Product 3
以及TableView
我已经尝试过:
为了实现这一点,我需要在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只在第一次启动屏幕时才是正确的,这不是持久的。
所以我的问题是:
比较当前单元格与上一单元格的数据的正确方法是什么?
在cellForRowAt
委托方法中进行比较是否正确?如果不是,我应该在哪里执行此操作?
答案 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.
}
}
结果见附件
希望它有所帮助!
答案 2 :(得分:0)
我认为在这种情况下,您可以在表格中划分表格视图的单元格,并为每个部分指定标题(产品名称)。请仔细阅读official documentation以获取更多信息。
答案 3 :(得分:0)
尝试在else部分设置高度约束。
else
部分内容:if previousProductId == thisProductId {
和此:if thisIndexPath - 1 > -1 {
。