使用initWithStyle以编程方式自定义UITableViewCell

时间:2015-08-28 15:52:24

标签: objective-c uitableview bemsimplelinegraph

我使用自定义UITableViewCell和界面构建器在我的tableview上创建了一些标签。现在我正在使用一些名为BEMLineGraph的第三方控件,我想使用代码将它添加到我的tableview单元格中。它还有一些代理和数据源方法。我正在做以下但问题是我在上下滚动时得到重复的图形并弄乱了数据。

ProductsTableViewCell.m

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        self.productGraph = [[BEMSimpleLineGraphView alloc] initWithFrame:self.graphContainter.frame];
        //_myGraph.enableTouchReport = YES;
        self.productGraph.tag = 100;
        self.productGraph.animationGraphStyle = BEMLineAnimationNone;
        //_myGraph.enablePopUpReport = YES;
        self.productGraph.enableXAxisLabel = YES;
        self.productGraph.colorTouchInputLine = [UIColor whiteColor];
        self.productGraph.colorXaxisLabel = [UIColor darkGrayColor];
        self.productGraph.colorTop = [UIColor clearColor];
        self.productGraph.colorBottom = [UIColor clearColor];
        self.productGraph.colorLine = [UIColor colorWithRed:255.0/255.0 green:255.0/102.0 blue:255.0/102.0 alpha:1];
        self.productGraph.colorPoint = [UIColor lightGrayColor];
        [self addSubview:self.productGraph];
    }
    return self;
}

TableViewController.m

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

    ProductsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

        cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.productGraph.frame = CGRectMake(0, 0, cell.graphContainter.frame.size.width, cell.graphContainter.frame.size.height);
    cell.productGraph.dataSource = self;
    cell.productGraph.delegate = self;

   //All the other stuff is set here and works well.

   }

- (NSInteger)numberOfPointsInLineGraph:(BEMSimpleLineGraphView *)graph
{
if (graph.tag == 100)
{
    return productDetail.count;
}
else
{
    return  numbers.count;
}

2 个答案:

答案 0 :(得分:1)

有一件事我可以看到你的代码:

  if (cell == nil)
    {
        cell = [cell initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }

它应该是:

if (cell == nil)
{
    cell = [[ProductsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

但这不能解决重复图表的问题

正如您已将子单元格子类化,为什么不将productGraph的委托和数据源保留在单元格本身中

答案 1 :(得分:1)

如果您已使用alert(5.0); // don't expect a float from this注册ProductsTableViewCell课程,则UITableView将为您创建该课程的对象,并调用其dequeueReusableCellWithIdentifier:方法(针对单元格)在Interface Builder中定义)。因此,请取消对initWithCoder:的调用,并使用initWithStyle:reuseIdentifier: initWithCoder:方法进行初始化。

然后,在你的ProductsTableViewCell中只做那个特定于那个细胞的东西。这取决于Graph类的实现,但它需要确保旧图不再可见。