gpt4 book ai didi

具有多个原型(prototype)单元格的 Swift TableView 未显示所有行

转载 作者:行者123 更新时间:2023-11-28 06:57:03 24 4
gpt4 key购买 nike

我有一个由 2 个原型(prototype)单元格创建的 UITableView,每个原型(prototype)单元格都有单独的标识符和子类。

我的问题是当我显示单元格时,第二个原型(prototype)的第一行被第一个原型(prototype)单元格吸收。

例如,我的第一个原型(prototype)单元格仅显示一个项目。第二个原型(prototype)单元格应显示 4 个项目。但是,第二个原型(prototype)单元格中的第一项没有显示,相反,四个项目中只有三个可见。

这是我实现的代码:

  override func viewDidLoad() {
super.viewDidLoad()


self.staticObjects.addObject("Please...")
self.objects.addObject("Help")
self.objects.addObject("Me")
self.objects.addObject("Thank")
self.objects.addObject("You")

self.tableView.reloadData()

}

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

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

return self.objects.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

if(indexPath.row==0){

let staticCell = self.tableView.dequeueReusableCellWithIdentifier("staticCell", forIndexPath: indexPath) as! StaticTableViewCell

staticCell.staticTitleLabel.text = self.staticObjects.objectAtIndex(indexPath.row) as? String

return staticCell

}

else{

let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! PillarTableViewCell

cell.titleLabel.text = self.objects.objectAtIndex(indexPath.row) as? String


return cell

}

感谢大家的帮助。

最佳答案

对于 tableView:numberOfRowsInSectiontableView:cellForRowAtIndexPath,您在如何计算行数方面存在逻辑问题。

您的代码正在生成如下所示的显示输出,其中:

  • 蓝色单元格代表您的 staticCell 原型(prototype)表格单元格 View ;这些是 staticsObjects 数组中的值。
  • 黄色单元格代表您的 cell 原型(prototype)表格单元格 View ;这些是 objects 数组中的值。

Bad Output of Table View


<强>1。查看 tableView:cellForRowAtIndexPath:

cellForRowAtIndexPath 方法中,您返回objects 数组的计数。

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        
return self.objects.count
}

这意味着您的表中的行数将是 4 而不是 5。相反,您想返回表中使用的两个数组的总和:objects.count + staticObjects.count。例如:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count + staticObjects.count
}

<强>2。查看 tableView:cellForRowAtIndexPath:

这是您的原始代码和我的评论..

// You are assuming that `staticObjects` will always have 
// exactly one row. It's better practice to make this
// calculation more dynamic in case the array size changes.
if (indexPath.row==0){

let staticCell = self.tableView.dequeueReusableCellWithIdentifier("staticCell", forIndexPath: indexPath) as! StaticTableViewCell
staticCell.staticTitleLabel.text = self.staticObjects.objectAtIndex(indexPath.row) as? String
return staticCell
} else {
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! PillarTableViewCell
// Here's your problem! You need to calculate the row
// because you want to put the objects from your other
// array first. As a result, you need to account for them.
cell.titleLabel.text = self.objects.objectAtIndex(indexPath.row) as? String
return cell
}

现在,这里有一种方法可以解决您在上述讨论中提到的错误:

// If the indexPath.row is within the size range of staticObjects
// then display the cell as a "staticCell".
// Notice the use of "staticObjects.count" in the calculation.
if indexPath.row < staticObjects.count {
let staticCell = self.tableView.dequeueReusableCellWithIdentifier("staticCell", forIndexPath: indexPath) as! StaticTableViewCell
staticCell.staticTitleLabel.text = self.staticObjects.objectAtIndex(indexPath.row) as? String
return staticCell
} else {
// If you get here then you know that your indexPath.row is
// greater than the size of staticObjects. Now you want to
// display your objects values.
// You must calculate your row value. You CANNOT use the
// indexPath.row value because it does not directly translate
// to the objects array since you put the staticObjects ahead
// of them. As a result, subtract the size of the staticObjects
// from the indexPath.row.
let row = indexPath.row - staticObjects.count
let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! PillarTableViewCell
cell.titleLabel.text = self.objects.objectAtIndex(row) as? String
return cell
}

现在你应该看到这个:

Correct Display of Table View

关于具有多个原型(prototype)单元格的 Swift TableView 未显示所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33224344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com