2012-04-16 10 views
0

シンプルなチャートビューのようなカスタムビューを描画するためのUIViewをUITableViewCellに配置しました。 次に、新しいデータが来たらUIViewを更新しようとしました。しかし、それは動作しません。私は自分のやり方が正しいかどうかを知りたがります。または、UIViewを更新する別の方法があります。あなたはChartViewインスタンスへのアクセスを取得した場合cellForRowAtIndexPathの外でUITableViewCellの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); 

} 
+1

whoa ...なぜrealTimeData:chartbackでChartViewでinitを呼び出していますか? –

+0

initはデータを供給するだけです。ルックコードを取る - (ボイド)initWithPrices:(CGFloat)lstPrice withsPrice:(CGFloat)sPrice withcPrice:(CGFloat)cPrice withlPrice:(CGFloat)lPrice withhPrice:(CGFloat)hPrice { _lstPrice = lstPrice。 _sPrice = sPrice; _cPrice = cPrice; _hPrice = hPrice; _lPrice = lPrice; [self refreshScreen]; } – yongjoon

答えて

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:を呼び出します。

+0

次に、このように試すことはできますか? NSIndexPath * cellIndexPath = [NSIndexPath indexPathForRow:i inSection:0]; \t [tableView beginUpdates]; \t [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:cellIndexPath、nil] withRowAnimation:\t \t UITableViewRowAnimationNone]; [tableView endUpdates]; UITableViewCell * cell = [myTableView cellForRowAtIndexPath:cellIndexPath]; ChartView * chartView =(ChartView *)[cell.contentView.subviews objectAtIndex:0]; [chartView initWithPrices:sPrice withcPrice:cPrice withlPrice:lPrice withhPrice:hPrice]; – yongjoon

+0

質問の最後にコードを挿入する方がよいでしょう。読むのがはるかに簡単です。そして、コード以外のもの(コメント、さらなる質問、フィードバック)も傷つけませんでした。 – Codo

+0

ごめんなさい。私の質問はそれです。 1.あるセルをリロードした後、graphViewをセル参照で更新することができますか?私は正しい? – yongjoon

0

、それはビューをリフレッシュする必要があり、refreshScreenを呼び出します。提供されたコードから、私はこの事実の証拠を見ません。実際には、すでに初期化されているChartViewを初期化しようとしているようですが、これは常に悪いニュースです。

+0

セル内 – yongjoon

関連する問題