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 块,是吗? 您是否在循环之前清除了nameArray
和 ageArray
并向这些对象添加新对象?
【参考方案1】:
每次调用cellForRowAtIndexPath
时,您都会添加到nameArray
和ageArray
,并且您没有先清除它们。这似乎效率低下,您应该只在输入数据更改时填充这些数组,而不是在生成单元格时。
我什至认为你不需要这些数组,你可以这样做:
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