0

単純なチャート ビューのようなカスタム ビューを描画するための UITableViewCell の上に UIView を配置しました。次に、新しいデータが来たら 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

メソッドtableView:cellForRowAtIndexPath:は、自分で実装したものです。指定されたインデックス パスで使用される新しいテーブル セルを作成します。既存のセルを返す必要はありません (使用されなくなったセルのリサイクルを除く)。

したがって、基本的に2つのオプションがあります。

  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 に答える
0

ChartView インスタンスにアクセスして を呼び出すとrefreshScreen、ビューが更新されます。提供されたコードから、これが起こっている証拠は見当たりません。実際、すでに初期化されている ChartView を初期化しようとしているように見えますが、これは常に悪いニュースです。

于 2012-04-16T18:02:43.727 に答える