是否可以在cellForRowAtIndexPath之外的UITableViewCell上刷新UIView

时间:2012-04-16 17:35:02

标签: iphone uitableview

我将UIView放在UITableViewCell上,用于绘制自定义视图,如简单的图表视图。 然后我尝试在新数据到来后刷新UIView。但它不起作用。我想知道我做的方式是对还是不对。或者还有另一种刷新UIView的方法。

Here is code fragment.





   UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];   
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
//


        graphView = [[ChartView alloc] initWithFrame:CGRectMake(290, 5, 18, 36)];                                 
        [cell.contentView addSubview:graphView];
        [graphView release];


         nameLabel                      = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 0.0, 105.0, 45.0)];
        [cell.contentView addSubview:nameLabel];
        [StockNameLabel release];

}

....

..
return cell;
}



- (void)realTimeData:(NSMutableDictionary *)data {  <--- its a call back method

             NSIndexPath *cellIndexPath =  [NSIndexPath indexPathForRow:i inSection:0];  
            UITableViewCell  *cell = [m_InterestTableView cellForRowAtIndexPath:cellIndexPath];
            ChartView *chartView =  (ChartView*)[cell.contentView.subviews objectAtIndex:0];
            [chartView initWithPrices:sPrice withcPrice:cPrice withlPrice:lPrice withhPrice:hPrice];

}

ChartView

- (void) refreshScreen{    
      [self setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect
{
    //get graphic context
    CGContextRef context = UIGraphicsGetCurrentContext();
     CGContextClearRect(context, rect);


    CGContextSetLineWidth(context,2.0f);
    CGContextSetShouldAntialias(context, NO);
    CGContextMoveToPoint(context,x1,y1);
    CGContextAddLineToPoint(context,x2, y2);
    [RGB(r,g, b) set];
    CGContextStrokePath(context);

    CGContextAddRect(context,fillArea);
    [RGB(r, g, b) set];
    CGContextFillPath(context);

}

2 个答案:

答案 0 :(得分:0)

如果您可以访问ChartView实例,然后调用refreshScreen,它应该刷新视图。从提供的代码中,我看不到发生这种情况的证据。实际上,看起来你正在尝试初始化已经初始化的ChartView,这总是坏消息。

答案 1 :(得分:0)

方法tableView:cellForRowAtIndexPath:是您自己实施的方法。它创建一个新的表格单元格,用于指定的索引路径。它不会也应该返回现有的(除了不再使用的细胞的再循环)。

所以你基本上有两个选择:

  1. 保留对将在稍后更新的表格单元格的引用。然后,您可以在新数据到达后直接更新它。这有点棘手,因为您需要检测表格单元格是否已移出视图并被回收以用于不同的表格行。

  2. 请求表视图重新加载效果单元格:

    NSIndexPath *cellIndexPath =  [NSIndexPath indexPathForRow:i inSection:0];
    [tableView beginUpdates];
    [tableView reloadRowsAtIndexPaths: [NSArray arrayWithObjects: cellIndexPath , nil] withRowAnimation: UITableViewRowAnimationNone];
    [tableView endUpdates];
    

    然后,表视图将调用tableView:cellForRowAtIndexPath:,您可以在其中创建包含最新数据的新单元格。