我有一个用2个原型单元创建的UITableView,每个单元都有单独的标识符和子类。
我的问题是当我显示细胞时,第二个原型的第一行被第一个原型细胞吸收。
例如,我有第一个原型单元格只显示1个项目。第二个原型单元格应该显示4个项目。但是,第二个原型单元格中的第一个项目没有显示,相反,四个项目中只有3个可见。
以下是我实施的代码:
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
}
感谢所有帮助。
答案 0 :(得分:1)
对于tableView:numberOfRowsInSection
和tableView:cellForRowAtIndexPath
,您在表格中如何计算行数存在逻辑问题。
您的代码正在生成如下所示的显示输出:
staticCell
原型表格单元格视图;这些是staticsObjects
数组中的值。cell
原型表格单元格视图;这些是objects
数组中的值。<强> 1。查看tableView:cellForRowAtIndexPath:
在cellForRowAtIndexPath
方法中,您仅返回objects
数组的计数。
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.objects.count
}
这意味着您在表格中的行数将是 4 而不是5.相反,您希望返回表格中使用的两个数组的总和:{ {1}}。例如:
objects.count + staticObjects.count
<强> 2。查看tableView:cellForRowAtIndexPath:
这是你的原始代码和我的评论..
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects.count + staticObjects.count
}
现在,这是解决上述讨论中所述错误的一种方法:
// 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
}
现在你应该看到这个: