我正在创建一个使用自定义UITableViewCell类的UITableView。 UITableViewCell使用它自己的方法根据indexPath和选定的索引进行自我布局。
代码如下: AgendaView.h TableViewDelegate方法
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
EventInfoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"infoCell"];
if(cell == nil){
cell = [[EventInfoCell alloc]initWithStyle:0 reuseIdentifier:@"infoCell"];
}
cell.frame = CGRectMake(0, 0, 320, [self tableView:tableView heightForRowAtIndexPath:indexPath]);
cell.selectedBackgroundView = nil;
cell.delegate = self;
TimerEvent *event = [_eventsArray objectAtIndex:indexPath.row];
EventInfo *info = [event valueForKey:@"eventInfo"];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"h:mma"];
cell.timeLabel.text = [NSString stringWithFormat:@"%@",[df stringFromDate:event.date]];
cell.titleField.text = [info title];
cell.bgImageView.frame = cell.frame;
cell.countdownLabel.text = [self getCountdown:event];
if (_selectedIndex == indexPath.row){
[cell layoutSelected:YES editing:[tableView isEditing]];
if ([info location])
cell.locationField.text =[NSString stringWithFormat:@"@%@",[info location]];
else
cell.locationField.text = @"Location";
if ([info notes])
cell.notesView.text = [info notes];
else
cell.notesView.text = @"Notes";
}else
[cell layoutSelected:NO editing:NO];
return cell;
}
这是布局细胞的可接受方式吗?或者我应该为不同的单元格布局创建不同的单元格子类?如果有帮助,单元格会在触摸时展开以显示更多信息,这就是为什么我让子类处理它自己的布局。
图片:http://tinypic.com/r/2vjpi12/6
单元格信息由tableView:cellForRowAtIndexPath期间分配的TimerEvent / Info确定。
答案 0 :(得分:0)
我认为你应该为每种类型的行创建不同的UITableViewCell子类。这是我如何做到的草图:
@interface UITableViewCell (MyTableViewSupport)
@property ( nonatomic, strong ) id value ; // value to display
+(NSString *)identifier ; // reuse identifier for this class
@end
@implementation UITableViewCell (MyTableViewSupport)
+(NSString*)identifier
{
return NSStringFromClass( self ) ;
}
const char * sValueKey = "TableCellValue";
-(void)setValue:(id)value
{
objc_setAssociatedObject( self, sValueKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC ) ;
}
-(id)value
{
return objc_getAssociatedObject( self, sValueKey ) ;
}
@end
@interface TableCellA : TableViewCell
@end
@interface TableCellB : TableViewCell
@end
@implementation TableCellA
-(void)layoutSubviews
{
// one type of layout
}
@end
@implementation TableCellB
-(void)layoutSubviews
{
// another type of layout
}
@end
您的表格视图数据源(可能是您的视图控制器):
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
id value = [ self _valueForRowAtIndexPath ] ;
Class cellClass = /// ...look up cell class based on section/row or type of value, etc.
UITableViewCell * cell = [ tableView dequeueReusableCellWithIdentifier:cellClass.identifier ] ;
if ( !cell )
{
cell = [ [ cellClass alloc ] init ] ;
}
cell.value = value ;
return cell ;
}
编辑:对上述内容的扩展说明:
UITableViewCell上代码的第一部分(类别)扩展了它,以提供cellIdentifier
类方法和value
属性。现在,UITableViewCell的所有实例都支持设置/获取“value”属性,包括您的子类。
假设您需要排序类型,员工和公司。您可以创建EmployeeCell
和CompanyCell
:
@interface EmployeeCell : UITableViewCell
-(void)layoutSubviews
{
// layout code for employee cells
}
-(void)setValue:(id)value
{
[ super setValue:value ] ;
// configure the subviews of this employee cell (first name label, last name label, photo, for example) based on `value`
}
@end
@implementation CompanyCell : UITableViewCell
-(void)layoutSubviews
{
// layout code for company cells
}
-(void)setValue:(id)value
{
[ super setValue:value ] ;
// configure the subviews of this company cell (company name label, address label, CEO label, for example) based on `value`
}
@end