可折叠细胞

时间:2015-04-07 18:36:48

标签: ios xcode uitableview

我有一个带有两个不同自定义表格单元格的UITableView。启动应用程序后,第一个单元格显示正常。单击它们时将出现第二个单元格。

任何人都可以帮助我或有想法吗?

非常感谢。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *MyIdentifier = @"customCell2";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if(cell == nil){
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];

        cell.backgroundColor = [UIColor clearColor];
        cell.textLabel.backgroundColor = [UIColor clearColor];
        cell.textLabel.textColor = [UIColor grayColor];
        cell.textLabel.font = [UIFont fontWithName:@"STHeitiSC-Light" size:9.0];
    }
    return cell;

}

2 个答案:

答案 0 :(得分:1)

过去做过自定义UITableViewCell我经常处理自定义类本身的nib加载。

自定义单元格的基本标题。

@interface RequestsTableViewCell : UITableViewCell {
    // Ivars.
}
// Properties.
- (id) initWithRequestModel: (RequestModel *) model style:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier forQueryType:(int) requestType;
// Other methods, etc.
@end

带有指定初始化程序的自定义单元格。

@implementation RequestsTableViewCell

- (id) initWithRequestModel: (RequestModel *) model style:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier forQueryType:(int) requestType {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
       NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"RequestsTableViewCell" owner:self options:nil];
        self = [nibArray objectAtIndex:0];
        requestModel = model;
        queryType = requestType;
        [self setRequestThumbnail];
        [self setRequestCategory];
        [self setRequestAddress];
        [self setRequestStatusDate];
        [self setRequestStatus];
        [self setRequestFollowed];
        [self setRequestComment];
        [self setAppearance];
    }

    return self;
}

对于自定义UITableViewCell,还有一个自定义xib,它对应并在身份检查器中设置了自定义类。

在UITableViewController中。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellId = @"Cell Id";
    RequestModel *request = nil;

    // Other code for search, etc

    request = [self.serviceRequests objectAtIndex:indexPath.row];

    RequestsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];

    if(!cell) {
        cell = [[RequestsTableViewCell alloc] initWithRequestModel:request style:UITableViewCellStyleDefault reuseIdentifier:cellId forQueryType:queryTypeIndicator];
    }

    return cell;
}

听起来您的问题中有多个自定义单元格类型?你能详细说明它应该如何运作吗?你说你必须点击一个单元格才能显示另一个单元格,你能解释一下这种交互吗?

答案 1 :(得分:1)

我做了类似的事情,但让细胞'扩展',而不是添加新细胞。当然,你没有两个单元格,但你可以调整一个单元格的大小,添加子框架......

您可以在UITableViewCell对象(BOOL cellIsExpanded)中保留一个布尔值,并在点击手势上设置该布尔值。然后在TableViewCell的drawRect中,相应地布局您的单元格。

示例代码,在展开时,使单元格高度为20 - > 80并添加UIButton:

在TableViewController中,重载heightForRowAtIndexPath(如果'展开',这将调整你的单元格的大小):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    YourEntity *record = [self.fetchedResultsController objectAtIndexPath:indexPath];

    if (!record.cellIsExpanded)
        return 20.; // cell is smaller if collapsed
    else
        return 80.; // bigger cell
}

在TableViewCell中,添加或删除子帧:

@interface MyTableViewCell ()
@property(nonatomic) BOOL cellIsExpanded
@property(strong, nonatomic) UITextField *myTextField;
@property(strong, nonatomic) UIButton *clickMeButton;
@end

@implementation MyTableViewCell

- (void)drawRect:(CGRect)rect {
    if(!self.cellIsExpanded){
        // layout your collapsed cell, for example:
        self.myTextField = [[UITextField alloc] initWithFrame:self.frame];
        self.myTextField.text = @"Collapsed cell";
        // remove button, only present in expanded view :
        self.clickMeButton=nil;
    }
    else{
        self.myTextField.text = @"Expanded cell";
        // add button below textfield
        self.clickMeButton = [[UIButton alloc] initWithFrame:CGRectMake(20, 20, 10, 10)];
    }
}
@end