【发布时间】:2011-03-06 17:27:13
【问题描述】:
当我创建 TTTableMessageItem 的实例时,我只能访问 imageURL、caption、title 等。可以更改 TTTableMessageItem(Three20) 的标题颜色吗?
【问题讨论】:
标签: iphone objective-c sdk three20
当我创建 TTTableMessageItem 的实例时,我只能访问 imageURL、caption、title 等。可以更改 TTTableMessageItem(Three20) 的标题颜色吗?
【问题讨论】:
标签: iphone objective-c sdk three20
是的,虽然这需要一些工作(不幸的是,还需要一些使用 Three20 的经验才能弄清楚)。
一、背景:
当您创建TTTableMessageItem 时,Three20 稍后将创建TTTableMessageItemCell 类型的表格单元格。 (参见 Three20UI 项目中-[TTTableMessageDataSource tableView:cellClassForObject:] 中的代码。)
因此,如果您查看类TTTableMessageItemCell(也在同一个项目中)的源代码,您会看到它有一个名为titleLabel 的属性。在创建该标签的函数- (UILabel*)titleLabel 中,它设置_titleLabel.textColor = [UIColor blackColor]。
因此,这为我们提供了弄清楚如何更改标题颜色所需的信息:您需要找到一种方法来更改 TTTableMessageItemCell 实例的 titleLabel.textColor 属性。您可以采取几种方法。
更简单但可以说不是那么干净(但不是那么糟糕)的方法是创建自己的表委托类——TTTableViewVarHeightDelegate 的子类——然后在你的子类中实现-[tableView:willDisplayCell:forRowAtIndexPath:] .在该函数中,更改 titleLabel 的 textColor。采取这种方法:
创建您自己的表视图委托类——TTTableViewVarHeightDelegate 的子类。比如这里是MyDelegate.h:
@interface MyDelegate : TTTableViewVarHeightDelegate
@end
这里是MyDelegate.m:
@implementation MyDelegate
- (void)tableView:(UITableView *)tableView
willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell isKindOfClass:[TTTableMessageItemCell class]]) {
TTTableMessageItemCell* messageCell = (TTTableMessageItemCell*)cell;
messageCell.titleLabel.textColor = [UIColor blueColor];
}
}
@end
在您的表格视图控制器(TTTableViewController 的子类)中,覆盖 createDelegate:
- (id <UITableViewDelegate>) createDelegate {
return [[[MyDelegate alloc] initWithController:self] autorelease];
}
另一种可能更简洁但需要更多工作的方法是将TTTableMessageItem和TTTableMessageItemCell子类化;在您的 TTTableMessageItemCell 子类中,更改标题颜色(例如,通过覆盖 -[titleLabel]);然后是TTListDataSource 或TTSectionedDataSource 的子类;在子类中,覆盖-[tableView:cellClassForObject:];当您获得TTTableMessageItem 子类的实例时,返回TTTableMessageItemCell 子类的实例。哇!这给您带来的是代码重用:Any 表可以返回您的 TTTableMessageItem 子类的实例并获得适当颜色的标题,而不是上述技术,因为它把表格视图委托中的单元格颜色知识,这并不是真正适合它的地方。但正如您所看到的,对于像更改颜色这样简单的事情,这需要跳过很多圈。
【讨论】: