我的表视图中有多个单元格;例如猫细胞,狗细胞,鸡细胞。在Cat Cell中,我有两个视图:图形视图和图像视图。
如果图形视图被隐藏且图像视图可见,那么我想将单元格高度设置为200,而在相反的情况下则设置为350。
我将如何实现这一目标?我正在表视图的heightForRowAt
委托方法中注册我的nib文件,我尝试了不同的东西无济于事。这是我单元格中的两个视图:
@property (weak, nonatomic) IBOutlet UIView *imagesView;
@property (weak, nonatomic) IBOutlet UIView *graphView;
...这是我的heightForRowAt
方法:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
TrainingImageCell *cell = (TrainingImageCell*)[self.tableView dequeueReusableCellWithIdentifier:@"TrainingImageCell"];
if (cell.isGraphViewOnTop == YES) {
return 350;
}
else {
return 200;
}
return 200;
}
答案 0 :(得分:2)
您需要访问tableView
中已有的内容,而不是启动新单元格。
而不是
TrainingImageCell *cell = (TrainingImageCell*)[self.tableView dequeueReusableCellWithIdentifier:@"TrainingImageCell"];
待办事项
TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath];
而不是看看房产。
修改强> 看一下我们讨论的冗长讨论,这里有一个非常可靠的例子,可用于 Swift 中的方法。
import UIKit
class RightAlignedCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var subLabel: UILabel!
// Your boolean property you would like to map
var randomBool: Bool = false
}
class RightAlignedTableViewController: UIViewController {
// This is just an example for the dataSource, you should have this somewhere already
lazy var dataSource: [Bool] = {
var dataSource: [Bool] = []
for index in 0..<10 {
dataSource.append(index % 2 == 0)
}
return dataSource
}()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
}
extension RightAlignedTableViewController: UITableViewDelegate {}
extension RightAlignedTableViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// Take a look in the !!!dataSource!!!, what is value for isHidden
let isHidden = self.dataSource[indexPath.row]
// return the right height
return isHidden ? 60 : 100
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: RightAlignedCell = tableView.dequeueReusableCell(withIdentifier: "RightAlignedCell", for: indexPath) as! RightAlignedCell
cell.titleLabel.text = "Something"
cell.subLabel.text = "Nothing"
cell.randomBool = self.dataSource[indexPath.row]
return cell
}
}
答案 1 :(得分:1)
为什么要在heightForRowAt中注册nib文件。您正在注册新单元格,因此无法访问现有单元格。如果您希望它以您的样式工作,而不是在IndexPath中为行注册新单元格,则可以使用indexPath访问现有单元格
TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath];
和访问检查属性。
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
TrainingImageCell *currentCell = (TrainingImageCell*)[tableView cellForRowAtIndexPath:indexPath];
if (cell.isGraphViewOnTop == YES) {
return 350;
}
return 200;
}
答案 2 :(得分:0)
如果您dequeueReusableCellWithIdentifier
刚刚获得新单元格,则无法检查isGraphViewOnTop
我的建议是返回UITableViewAutomaticDimension
并使用常量设置单元格视图,因此当隐藏元素时,单元格的大小会更小。