iOS Swift:在自定义 UITableView 单元格中更新二维数组时获取重复值

Posted

技术标签:

【中文标题】iOS Swift:在自定义 UITableView 单元格中更新二维数组时获取重复值【英文标题】:iOS Swift: Getting repeated value while updating 2D Array in custom UITableView cell 【发布时间】:2015-10-18 08:04:52 【问题描述】:

我有一个 2D 数组,我想以特定模式将其填充到 UITableView 自定义单元格中。

//从 Parse 后端检索

var myArray = [["Name1", "Age1"],["Name2", "Age2"],["Name3", "Age3"]] 

//我需要的是:

nameArray = ["Name1", "Name2", "Name3"]
ageArray = ["Age1", "Age2", "Age3]

这样我就可以使用 indexPath 来填充自定义 UITableView 单元格中的 Name 数据 例如:nameArray[indexPath.row]

我尝试使用 for in 循环,

var nameArray = NSMutableArray()
var ageArray = NSMutableArray()

//Inside CellForRowAtIndexPath
for data in myArray 
   self.nameArray.addObject(data[0])
   self.ageArray.addObject(data[1])


   cell.nameLabel.text = "\(nameArray[indexPath.row])"
   cell.ageLabel.text = "\(ageArray[indexPath.row])"

但是我在两个单元格中都得到了重复的姓名和年龄标签,其中包含 Name1 和 Age1。有谁知道这有什么问题?

有没有更好的方法来根据需要重新加载这些数据?

// 更新的完整工作代码感谢帮助我解决问题的@l00phole

class NewViewController: UIViewController, UITableViewDelegate, UITableViewDataSource  

@IBOutlet var tableView: UITableView!
var data = [[String]]()
var cost = Double()

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view.
   uploadData()


func uploadData() 
    let query = PFQuery(className:"Booking")
    query.getObjectInBackgroundWithId("X0aRnKMAM2") 
        (orders: PFObject?, error: NSError?) -> Void in
        if error == nil && orders != nil 
            self.data = (orders?.objectForKey("orderDetails"))! as! [[String]]
            //[["Vicky","21"],["Luke", "18"],["7253.58"]]
            //*****Removing the last element as it is not needed in the tableView data
            let count = self.data.count - 1
            let c = self.data.removeAtIndex(count)
            cost = Double(c[0])!
            //******
         else 
            print(error)
        
        self.reloadTableData()
    


func reloadTableData()

    dispatch_async(dispatch_get_main_queue(), 
        self.tableView.reloadData()
        return
    )


func numberOfSectionsInTableView(tableView: UITableView) -> Int 
   return 1


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return data.count


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell:NewTableViewCell = self.tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! NewTableViewCell

    // Configure the cell...
    cell.nameLabel.text = "\(data[indexPath.row][0])"
    cell.ageLabel.text = "\(data[indexPath.row][1])"
    return cell

【问题讨论】:

你是如何获取数据的?您没有在单元格内为索引路径处的行调用 fetch 块,是吗? 您是否在循环之前清除了 nameArrayageArray 并向这些对象添加新对象? 【参考方案1】:

每次调用cellForRowAtIndexPath 时,您都会添加到nameArrayageArray,并且您没有先清除它们。这似乎效率低下,您应该只在输入数据更改时填充这些数组,而不是在生成单元格时。

我什至认为你不需要这些数组,你可以这样做:

cell.nameLabel.text = "\(data[indexPath.row][0])"
cell.ageLabel.text = "\(data[indexPath.row][1])"

【讨论】:

谢谢。你能用例子解释一下效率低下的部分吗?我很困惑何时重新加载单元格,因为每当我有大数据时,单元格上传数据时总是会出现奇怪的行为。用数据加载单元格时,如何使用动画一个接一个地插入单元格? @VickyArora 好的,这听起来像是一个不同的问题,需要您提供大量信息才能正确回答。因此,在解决您当前的问题后开始一个新问题。它效率低下的一点是你在重复一些没有效果的东西。姓名/年龄不会在输入数据不变的情况下一直变化,因此只有在它发生变化时才需要这样做。这可能会对性能产生影响,而且是完全错误的。 @VickyArora 关于您刚刚尝试的编辑的注释。 1. 我的低代表不能批准它。 2.您在问题中声明输入数据保存在myArray,而不是data,所以它没有多大意义。 3. 没那么重要;重要的是你明白了;您不需要我的答案中的确切代码。 谢谢,没问题。但我想确保如果我点击正确的答案,当您链接到所提出的问题时,代码应该运行。这样即使是早期的初学者也能理解。无论如何,SO 不适合个人,它是为了与社区分享。拥有正确的信息对每个人都有帮助。 :)【参考方案2】:

您不必为姓名和年龄创建单独的数组,您可以使用现有的myArray,如下所示

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell:NewTableViewCell = self.tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! NewTableViewCell
    // Configure the cell...
    let dataArray = myArray[indexPath.row]
    cell.nameLabel.text = "\(dataArray[0])"
    cell.ageLabel.text = "\(dataArray[1])"
    return cell
   

【讨论】:

以上是关于iOS Swift:在自定义 UITableView 单元格中更新二维数组时获取重复值的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图中连接到 UIButton 的 AddTarget 不起作用。 (斯威夫特 5,iOS)

在自定义 Swift 框架中的 Objective-C 文件上使用 Swift

Swift - 在自定义 TableViewController 中出现 SearchBar 问题

Swift - 如何在自定义 AlertController 中点击按钮时呈现 ViewController

Swift:在自定义视图中未调用 UIButton 触摸事件

在自定义单元格 Swift 中保存 uibutton 状态