0

カスタム 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 によって決定されます。

4

1 に答える 1

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 ;
}

EDIT:上記の拡張説明:

UITableViewCell のコードの最初の部分 (カテゴリ) は、それを拡張してcellIdentifierクラス メソッドとvalueプロパティを提供します。UITableViewCell のすべてのインスタンスが、サブクラスを含む「値」プロパティの設定/取得をサポートするようになりました。

行のタイプ、 EmployeesおよびCompaniesが必要だとしましょう。作成し、次のことを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
于 2012-08-28T17:18:37.743 に答える