我正在尝试在tableView的右下角创建一个UIBarButtonItem,以便在按下时突出显示和取消突出显示一个单元格。
简而言之,当用户按下按钮时,一系列单元格会将其背景颜色从白色更改为黄色。
但是,我没有做到这一点,因为每次按下该按钮,应用程序都会崩溃。这是我用来创建按钮的代码:
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem *barButton;
barButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"high.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(colorCells:)] autorelease];
self.navigationItem.rightBarButtonItem = barButton;
}
这里是为了突出显示一系列细胞:
- (void) colorCells:(id)sender
{
UITableViewCell *cell;
NSString *cellValue = cell.textLabel.text;
if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){
cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ;
cell.imageView.image = [UIImage imageNamed:@"hot.png"];
}
else {
cell.imageView.image = nil;
cell.backgroundColor = [UIColor whiteColor];
}
}
我在哪里失败?它应该工作正常。要么?我错过了什么吗?该视图是一个UITableViewController。
修改
我修改了我的代码:
- (void) colorCells:(id)sender{
UITableViewCell *cell;
NSInteger nSections = [self.tableView numberOfSections];
for (int j=0; j<nSections; j++) {
NSInteger nRows = [self.tableView numberOfRowsInSection:j];
for (int i=0; i<nRows; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:j];
cell = [self.tableView cellForRowAtIndexPath:indexPath];
}
NSString *cellValue = cell.textLabel.text;
if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"] ){
cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ;
cell.imageView.image = [UIImage imageNamed:@"hot.png"];
}
else {
cell.imageView.image = nil;
cell.backgroundColor = [UIColor whiteColor];
}
[self.tableView reloadData];
}
}
现在它不会崩溃,但它也不会为背景着色。有什么想法吗?
答案 0 :(得分:1)
基于单元格中文本的背景颜色看起来非常脆弱。是什么决定了一个细胞应该突出显示?它改变了吗?当然,背景的颜色对应于数据源中对象的特定属性。更强大的方法是在类上使用NSMutableIndexSet
属性来跟踪一组行索引,需要在点击小节按钮时突出显示。
考虑这个例子。我假设rowsToHighlight
是在您的类中声明的NSMutableIndexSet
的实例,并且已经填充了需要突出显示的行的索引。我们将实现-tableView:willDisplayCell:forRowAtIndexPath:
来调整单元格的背景颜色,具体取决于提供的索引路径是rowsToHighlight
的成员。
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([self.rowsToHighlight containsIndex:indexPath.row])
{
cell.backgroundColor = [UIColor yellowColor];
}
}
然后在由bar按钮触发的方法中,只需执行一个空的更新块以使表格重新加载动画。
- (void)colorCells:(id)sender
{
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
答案 1 :(得分:0)
除非您告诉包含它们的表视图重新加载它们,否则不会重绘您的单元格。您可以使用以下几种方法之一来完成此操作。您可以考虑[someTableView reloadData]
或one of these methods。
此外,您的单元格对象不是表格视图中的对象。你可能会考虑这个:
- (void) colorCells:(id)sender
{
UITableViewCell *cell;
//grab a cell
cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:someRow inSection:someSection]];
NSString *cellValue = cell.textLabel.text;
if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){
cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ;
cell.imageView.image = [UIImage imageNamed:@"hot.png"];
}
else {
cell.imageView.image = nil;
cell.backgroundColor = [UIColor whiteColor];
}
//perhaps you need to reload the table as well
[self.tableView reloadData];
}