静态uitableviewcells,自定义类不显示内容

时间:2015-03-03 21:12:33

标签: ios objective-c uitableview xcode6

我正在使用Xcode 6.1.1,我有一个表视图控制器,静态单元格有4个部分。

  • 第0部分:包含两行,每行包含2个标签
  • 第1部分:包含7个图像视图
  • 第2部分:包含1行,带有1个标签
  • 第3节:包含一个或多个变量,每个包含2个图像 视图

我想用数据加载表视图控制器中的所有单元格。

我给每个不同的行一个重用标识符(总共5个重用标识符),我还为每个不同类型的单元格创建了一个类(5个类)

我在课程中创建了插座,并在故事板中将它们链接到标签/图像视图。

但是我不知道下一步该怎么做。

如果我实现了表格视图数据源功能,我获得了正确数量的单元格,但它们都是空白的。

以下是我创建单元格的方法:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    if (indexPath.section == 0 && indexPath.row == 0) {
        static NSString *CellIdentifier = @"MyCell1";
        MyTableViewCell1 *cell = (MyTableViewCell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[MyTableViewCell1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        }
    } else {
        //create other cells here
    }
    cell.label1.text=@"testing 123";
    return cell;
}

但是,我总是得到默认样式的单元格(我的标签或图片视图没有出现)

我错过了什么?我应该在自定义表格视图单元格类中编写什么代码?

编辑:在加文的建议之后,我修改了委托函数以使用dequeueReusableCellWithIdentifier:forIndexPath

我还添加了:[self.tableView registerClass:[MyTableViewCell1 class] forCellReuseIdentifier:@" MyCell1"]到我的viewdidload方法。

这是我的最终代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerClass:[MyTableViewCell1 class] forCellReuseIdentifier:@"MyCell1"];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (section == 3 ) {
        return 1;
    } else {
        return [super tableView:tableView numberOfRowsInSection:section];
    }
}

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
    if (indexPath.section == 3) {
        // make dynamic row's cell
        static NSString *CellIdentifier = @"MyCell1";
        MyTableViewCell1 *cell = (MyTableViewCell1*) [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

        [cell configureCellWithValues:@"17" andV2:@"13"];
        return cell;
    } else {
        return [super tableView:tableView cellForRowAtIndexPath:indexPath];
    }
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.section == 3) {
        MyTableViewCell1 *c = (MyTableViewCell1 *) cell;
        NSLog(@"willdisplay cell with values %@, %@",c.i1, c.i2);
        [c.image1 setImage:[UIImage imageNamed:@"2"]];
    }
}

这是我自定义单元格的课程:

@implementation MyTableViewCell1

- (void)awakeFromNib {
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

- (void) configureCellWithValues: (NSString*) v1 andV2:(NSString*) v2 {
    self.i1=v1;
    self.i2=v2;
    self.image1.image = [UIImage imageNamed:v1];
    self.image2.image = [UIImage imageNamed:v2];
}

@end

第3部分中的单元格仍然没有显示图像(甚至不是图像视图)

2 个答案:

答案 0 :(得分:0)

看起来你正在使用tableView可重用单元格出列的方法 - 新函数接受indexPath以及单元格标识符;它现在也保证返回一个单元格(所以不需要进行零检查)。

这是您的委托功能已清理:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {
    if (indexPath.section == 0 && indexPath.row == 0) {
        static NSString *CellIdentifier = @"MyCell1";
        MyTableViewCell1 *cell = (MyTableViewCell1*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    } else {
        //create other cells here
    }
    cell.label1.text=@"testing 123";
    return cell;
}

另一个提示是将标签值的设置封装到每个单独的单元子类中,例如向configure添加一个名为MyTableViewCell1的方法,将标签值设置为您想要显示的内容。

答案 1 :(得分:0)

似乎我们无法生成自定义静态单元并尝试访问它们的插座并更改它们(因为它们的静态)请纠正我,如果我错了,因为我根本无法访问它们。

我通过将TableView类型更改为动态单元格来解决我的问题,我没有在tableview中放置任何原型单元格,并且我创建了3个不同的单元格类(带有它们的笔尖)

我已经使用tableview注册了nib文件,方法是将它添加到viewdidload方法中:

[self.tableView registerNib:[UINib nibWithNibName:@"MyCellType1" bundle:nil] forCellReuseIdentifier:@"CellType1"];
[self.tableView registerNib:[UINib nibWithNibName:@"MyCellType2" bundle:nil] forCellReuseIdentifier:@"CellType2"];
[self.tableView registerNib:[UINib nibWithNibName:@"MyCellType3" bundle:nil] forCellReuseIdentifier:@"CellType3"];

然后我完全自定义了我的tableview方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    switch (section) {
        case 0:
            return 2;
            break;
        case 1:
            return 1;
        case 2:
            return [self.myarray count];
        default:
            break;
    }
    return 0;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    switch (indexPath.section) {
        case 0: {
            MyCellType1 *cell = (MyCellType1 *) [tableView dequeueReusableCellWithIdentifier:@"CellType1" forIndexPath:indexPath];
            //this section always has 2 rows
            if (indexPath.row==0) {
                cell.lblTitle.text = @"ID";
                cell.lblValue.text = [NSString stringWithFormat:@"%i",1277];
            } else {
                cell.lblTitle.text = @"Date";
                cell.lblValue.text = @"02/03/2015";
            }
            return cell;
        }
            break;
        case 1: {
                MyCellType2 *cell = (MyCellType2 *)[tableView dequeueReusableCellWithIdentifier:@"CellType2" forIndexPath:indexPath];
                cell.image1.image = [UIImage imageNamed:@"3"];
                cell.image2.image = [UIImage imageNamed:@"4"];
                return cell;
        }
        case 2: {
            MyCellType3 *cell = (MyCellType3 *)[tableView dequeueReusableCellWithIdentifier:@"CellType3" forIndexPath:indexPath];
            cell.lblName.text = @"New Row";
            return cell;
        }
        default:
            break;
    }
    return nil;
}