0

我将 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);

}
4

2 回答 2

0

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

于 2012-04-16T18:02:43.727 回答
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:您可以使用最新数据创建新单元格的位置。

于 2012-04-16T18:09:11.230 回答