2012-04-23 2 views
0

tableView内のテキストが下にスクロールして再び表示されなくなります。プログラムで塗りつぶしたTableViewで画面をリフレッシュしない

enter image description hereenter image description here

そして、私のコードは次のとおりです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    return [screenDefBuild.elementsToTableView count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *MyIdentifier = @"MyIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; 
    } 

    ScreenListElements *currentScreenElement = [screenDefBuild.elementsToTableView objectAtIndex:indexPath.row]; 
    cell.textLabel.text = currentScreenElement.objectName; 

    currentRow++;  
    return cell; 
} 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    [tableView setDataSource:self]; 
    [self.view addSubview:tableView]; 
} 

私はまた、画面全体に私のテーブルビューを埋めたいです。 (上部に灰色のストラップ)。

+0

これを非表示にする// if(cel == nil)....次に今スクロール – akk

+2

これらのコメントはどちらも例外的に悪い考えであり、テーブルビューのいくつかのシステム最適化を壊します。 – jackslash

+0

灰色のストラップの問題を解決するには、テーブルビューの背景色を白色にします。 – Charan

答えて

2

私はあなたが、私はその破壊コードを賭けたいためという使用この変数

currentRow++; 

しかし、何をやっているのか分かりません。

UITableViewは、画面上に表示されているかどうかにかかわらず、セルが画面に表示されるたびにcellForRowAtIndexPathと呼びます。スクロールダウンしてからスクロールバックすると、この変数はデータの範囲を超えて増加するため、空のセルが得られます。

いつでもテーブルビューに任意のセルを作成できるようにこのメソッドを設計する必要があります。細胞が作られる順序に頼ることはできず、スクロールすることで何度も同じ細胞を何度も作り直さなければなりません。 indexPathを使用して、現在どのセルを作成しているのか把握してください。 question-グレーストラップの第二の部分の

http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITableView_Class/Reference/Reference.html

+0

私はもはやそれを使用していません。これはもう存在しませんが、問題は依然として存在します。 – Kuba

+2

次に、何らかの理由で2回目に呼び出されたときにnilを返すので、 '[screenDefBuild.elementsToTableView objectAtIndex:indexPath.row]'または 'currentScreenElement.objectName'を見てください。 – jackslash

+0

ありがとう、よかったよ。もし私がそれを把握すれば、私は返信します。 – Kuba

0

回答。現在のビューにテーブルビューを追加するので、self.view.frameというサイズプロパティを使用する必要がありますが、起点は使用しないでください。これを0,0に設定します。

CGRect viewFrame=self.view.frame; 
viewFrame.origin=CGPointZero; 
tableView = [[UITableView alloc] initWithFrame:viewFrame]; 

変更

tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 

あなたが適切に全力を尽くすように見えるとして、それは、奇妙だあなたquestion-の最初の部分については。私が提案するかもしれない1つのことは、viewDidLoadの末尾に[tableView reloadData];を追加することです。

+2

これは当てはまりません。ビューの境界は、定義した(CGFPZeroを変更しない限り)原点「CGPointZero」を持ちます。境界は、ビューの内部空間であり、それ自身の座標です。また、 'viewDidLoad'の最後に' reloadData'を追加することは、 'tableView'が初期設定されているために役立たず、スクロール後に失敗します。 'viewDidLoad'はここではもう一度呼び出されません。 – jackslash

+0

あなたは正しいです、私はview.frameと混同しています。 'viewDidLoad'に関して - 私はそれが呼び出されていないことを知っています、それはブラインドショットのようでした –

関連する問題