是否可以在一个UiTableView中拥有两个不同的UiTableViewCell?

时间:2014-02-05 06:24:42

标签: ios iphone objective-c uitableview

我遇到了问题,想知道我想做的事情是否可行。

我有一个ViewUtroller,它有一个UITableView作为子视图。然后我加载了一个自定义单元格,它工作正常。但是,我在同一个tableview中需要另一个自定义单元格 - 这个第二个单元格也有一个单独的笔尖。

这可能吗?

UITableView中on section的两个不同的自定义单元格?

我确实尝试过这样的事情:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath      *)indexPath
{
    static NSString *CellIdentifier1 = @"ContentCell";
    static NSString *CellIdentifier2 = @"SpaceCell";

    // Space Cell
    if (indexPath.row== 0) {
        CellSpace *cell = (CellSpace *)    [tableViewdequeueReusableCellWithIdentifier:CellIdentifier2];
        return cell;
    }

    // Content cell
    else {
        CellView *cell = (CellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        // Configure cell
        return cell;
    }
}

然而似乎else语句永远不会被触发,我通常会崩溃说该方法返回nil。

更新

我在这里使用了建议和代码并想出了这个:

#pragma mark - UITableView Delegate Methods 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{

    return 160;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 22;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


    static NSString *CellIdentifier1 = @"UsernameCell";
    static NSString *CellIdentifier2 = @"PasswordCell";

    if(indexPath.row == 0) {


        BBUsernameRegistrationCell *cell = (BBUsernameRegistrationCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        if(cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier1 owner:self options:nil];             // set properties
            cell = nib[0];
        }
            // set properties
        return cell;
    }

        // Content cell
    else {
        BBPasswordTableViewCell *cell = (BBPasswordTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        if(cell == nil) {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellIdentifier2 owner:self options:nil];             // set properties
            cell = nib[0];
        }
            // set properties
        return cell;
    }
}

但是我只在桌面视图中看到第一个Cell。如果我切换第二个负载周围的单元格。但不是两个在同一时间。有谁知道为什么?

3 个答案:

答案 0 :(得分:3)

是的,有可能......

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"ContentCell";
    static NSString *CellIdentifier2 = @"SpaceCell";

    // Space Cell
    if (indexPath.row== 0) {
        CellSpace *cell = (CellSpace *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        if(cell == nil) {
            cell = [[CellSpace alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1];
            // set properties
        }
        // set properties
        return cell;
    }

    // Content cell
    else {
        CellView *cell = (CellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
        if(cell == nil) {
            cell = [[CellView alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2];
            // set properties
        }
        // set properties
        return cell;
    }
}

在自定义单元格中,在initWithStyle方法中执行以下操作:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CellView" owner:self options:nil];

    for (id currentObj in topLevelObjects ) {
        if ([currentObj isKindOfClass:[CellView class]]) {
        self = (CellView*) currentObj;
        }
    }
    return self;
}

答案 1 :(得分:1)

这是可能的。但在使用此dequeueReusableCellWithIdentifier:之前。只需注册您的单元格和相应的nib文件。

代码为..

-(void)initiateCellRegisteration
{
    static NSString *CellIdentifier1 = @"ContentCell";
    static NSString *CellIdentifier2 = @"SpaceCell";
    [self.tableView registerClass:[ContentCell class] forCellReuseIdentifier:CellIdentifier2];
    [self.tableView registerNib:[UINib nibWithNibName:CellIdentifier2 bundle:nil] forCellReuseIdentifier:CellIdentifier2];


    [self.tableView registerClass:[SpaceCell class] forCellReuseIdentifier:CellIdentifier1];
    [self.tableView registerNib:[UINib nibWithNibName:CellIdentifier1 bundle:nil] forCellReuseIdentifier:CellIdentifier1];


}

viewDidLoad

中调用此方法

答案 2 :(得分:0)

如果您正在使用细胞笔尖,那么您需要一些棘手的方法来获得像

这样的细胞笔尖
static NSString *CellIdentifier = @"ProductCell";
    IVProductCell *cell = (IVProductCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        NSArray* objects  = [[NSBundle mainBundle] loadNibNamed:@"IVProductCell" owner:nil options:nil];
        for (id currentObject in objects) {
            if ([currentObject isKindOfClass:[IVProductCell class]]){
                cell = (IVProductCell*) currentObject;
            }
        }
    }