2009-08-25 7 views
0

私はIBで作成したカスタムUITableViewCellを持っています。 NIBからロードされたこれらの細胞のインスタンスとのUITableViewを移入するために、私は次のコードを使用します。UITableViewCellフレームのNaN値が

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

    static NSString *CellIdentifier = @"overviewCell"; 

    HOStoreOverviewCell *cell = (HOStorwOverviewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]]; 
     cell = (HOStoreOverviewCell *)c.view; 
    } 

    HOStore *itemAtIndex = (HOStore *)[self.infoController storeInListAtIndex:indexPath.row]; 

    cell.storeName.text = itemAtIndex.name; 
    cell.distance.text = [itemAtIndex niceDistance]; 
    cell.hours.text = [itemAtIndex.currentHour niceHours]; 
    NSLog(@"%@", cell); 

    return cell; 
} 

HOStoreOverviewCellはNIBの私のカスタムUITableViewCellのであり、それは3 UILabels(StoreNameを、距離、時間)が含まれてい。したがって、このコードは再利用可能なセルをデキューしようとします。できない場合は、NIBからロードして新しいセルを作成します。次に、UILabelsのテキストを配列内の項目(HOStore's)からの情報の関連ビットに設定します。かなり標準的なもの。

私の問題はこれです:ほとんどのセルは適切に表示されますが、今度は(そして、これを確実に再現することができませんでした)、UITableViewはセルを「見逃す」でしょう - たとえば、10番目のセル第12細胞ではなく、第11細胞ではない。代わりに11番目のセルがあるはずの空白の場所があり、この場所をタップしても効果はありません。空白の下の任意の場所をタップすると、didSelectRowAtIndexPath:indexPathデリゲートメソッドが生成され、indexPath.rowは常に欠落しているインデックス(たとえば11)に設定されます。 2行目のフレームに

2009-08-26 00:22:29.292 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 660; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>> 
2009-08-26 00:22:30.331 AppName[380:207] <HOStoreOverviewCell: 0x42c9880; baseClass = UITableViewCell; frame = (0 nan; 320 66); autoresize = W; layer = <CALayer: 0x42c9a60>> 
2009-08-26 00:22:32.138 AppName[380:207] <HOStoreOverviewCell: 0x42c71d0; baseClass = UITableViewCell; frame = (0 594; 320 66); autoresize = W; layer = <CALayer: 0x42c73b0>> 

注ナン:のNSLog出力(抜粋)を見ると

問題のルートが表示されます。これはcellForRowAtIndexPath:indexPathコールバックに対応し、 "空の"セルがスクロールして表示されるときに取得します。

何が原因なのかについてのアイデアはありますか?

答えて

1

コードのこのセクションは、好奇心旺盛です:

if (cell == nil) { 
      UIViewController *c = [[UIViewController alloc] initWithNibName:@"HOStoreOverviewCell" bundle:[NSBundle mainBundle]]; 
      cell = (HOStoreOverviewCell *)c.view; 
    } 

は、なぜあなたはここで、一般的なUIViewControllerをallocingていますか?それは私にメモリリークのように見える、誰もそれにリリースを呼び出すつもりはないように。

あなたはペン先から、あなたのテーブルのセルをロードした場合あなたのパフォーマンスが低下します何かもっとこのような

if (cell == nil) 
{ 
    cell = [[[HOStoreOverviewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease]; 
} 

を行うべきです。あなたはコードでそれらを割り当てる方がはるかに良いです。 Apple Devフォーラムでこれについて何度か読んだことがあります。また、Nibsを使用することでテーブルが「遅れている」ようになります。

関連する問題