什么是涉及分配和初始化UITableViewCell的子类的问题

时间:2014-03-26 11:31:40

标签: ios objective-c uitableview

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];

    return cell;
}

这是Apple Table View Programming Guide

的代码段

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];工作正常,不需要检查nil,因为单元格在故事板中定义,并且总是返回有效单元格。

但是,如果我不使用故事板,以编程方式在我的tableview中如何使用多个自定义单元格?涉及哪些问题allocating and initializing MyTableViewCell

5 个答案:

答案 0 :(得分:1)

您也可以这样使用自己的自定义单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"cell";

    MyTableViewCell *cell=(MyTableViewCell *)[self.yourtableview  dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:0];//change as per your need

   if(cell==nil)
    {
    [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil];
    cell=self.mytableviewcellref;
    }
    cell.textLabel.text=@"sometext";
    return cell;
}

希望它可以帮助你..

答案 1 :(得分:1)

如果你想以编程方式创建单元格,那么你需要像这样分配和初始化表格单元格。

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

{
static NSString *identifier = @"cell";

    UITableViewCell *cell = [listtableview dequeueReusableHeaderFooterViewWithIdentifier:identifier];

    if (cell ==nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }
}

答案 2 :(得分:1)

你应该使用方法

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
- (void)registerClass:(Class)cellClass forCellReuseIdentifier:(NSString *)identifier
UITableView的

。您可以阅读文档here

当您调用方法

- (id)dequeueReusableCellWithIdentifier:(NSString *)identifier

,它检查重用队列中是否有可用的单元。如果没有,它会检查它是否可以自动创建此单元格。如果您之前已为此重用标识符注册了单元类或nib,则它将使用类或nib创建新单元并将其返回。如果你没有注册任何东西,它将返回nil。

最好使用注册,因为如果您为不同的重用标识符使用不同的自定义单元格,则创建这些单元格的代码会变得混乱。这也是正确的方式。注册方法分别在iOS5和iOS6中添加。程序员创建自定义单元格的代码与旧版本的iOS相关。

答案 3 :(得分:0)

您可以使用另一种方法:

MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"> forIndexPath:indexPath];

您传递了其他参数 - indexPath。 之后检查单元格是否为零,如果是,则分配并初始化它。

答案 4 :(得分:0)

如果您没有使用故事板,则需要针对nil检查单元格,如果是,则分配新单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"MyIdentifier";
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        cell = [[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];

    return cell;
}