0

私はできる限りこれを説明しようとし、誰かが何が起こっているのか理解できることを願っています:

コアデータを使用してデータを UITableView にロードしています。ロゴを表示するために、TableView の最後に「最後のセル」を追加しようとしています。これが私のコードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  numberOfRows = section;
return     [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]+1;

}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";

cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[ReminderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cellBackground.png"]];

row = indexPath.row;


if (row == [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]) {
    NSLog(@"%u",[[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]);
    cell.productLabel.text = nil;
    cell.companyLabel.text = nil;
    cell.dateLabel.text = nil;
    cell.accessoryType = UITableViewCellAccessoryNone;
    cell.logo.hidden = NO;
    cell.renewLabel = nil;


}

else {

    Reminder *reminder = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.productLabel.text = reminder.product;
    cell.companyLabel.text = reminder.company;
    cell.dateLabel.text = reminder.date;
    cell.logo.hidden = YES;

}

return cell;

}


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    row = [indexPath row];

if (row == [[[self.fetchedResultsController sections] objectAtIndex:numberOfRows] numberOfObjects]) {
    return 50;
}

return 78;

}

おわかりのように、最後のセルにはアクセサリ タイプを持たないように指示していますが、他のすべてのセルにはアクセサリ タイプがあります。

通常のセルと付属の矢印: アクセサリーアローあり

最後のセル: 最後のセル

最後のセルがある一番下までスクロールしてから上にスクロールするまで、すべてが美しく機能します。付属の矢印があるはずの表のセルの一部で、付属の矢印が消えます!! (しかし、それらのすべてではありません)

同じセルですが、矢印が消えました: 矢印がありません

ここで何が起こっているのですか?

4

4 に答える 4

2

これは、キューイング メカニズムによるものです。tableView は、キャッシュから任意のセルをデキューします。そのセルが以前に設定したセルの 1 つである場合:

cell.accessoryType = UITableViewCellAccessoryNone;

アクセサリーインジケーターはありません。それを修正する最も簡単な方法 (私の意見では、もちろん、異なる再利用識別子を使用することもできます) は、次のようにコードを変更することです。

else {

    Reminder *reminder = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.productLabel.text = reminder.product;
    cell.companyLabel.text = reminder.company;
    cell.dateLabel.text = reminder.date;
    cell.logo.hidden = YES;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

}
于 2012-10-28T19:28:56.617 に答える
1

dequeReusableCellWithIdentifier:すべてのセルが同じ識別子を持っているため、問題は の呼び出しです。これは、「最後のセル」が表示されてからスクロール オフすると、それが再利用可能なセルの次のキューであることを意味します。また、すべてのセルが同じ識別子を持っているため、これらのセルの 1 つが画面から消えるたびに、次のセルが表示されます。ワンオンには付属品がありません。「最後のセル」に別の識別子を与える実装を考え出す必要があります。

于 2012-10-28T19:24:52.300 に答える
1

通常のセル用と最後のセル用の 2 つの CellIdentifier を定義するこの方法でこれを行います。

static NSString *CellIdentifier = @"Cell";
static NSString *CellIdentifierBottom = @"CellBottom";

Yout セル i を作成する if 構文:

if (row != lastTableViewIndex) {
    //create cell with CellIdentifier
} else {
    //create cell with CellIdentifierBottom
}
于 2012-10-28T19:25:10.047 に答える
0

UITableViewDelegateの以下のコールバックを使用して、セルが表示された直後にセルのカスタマイズを試みることができます。

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row != (yourDataSource.count-1) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
}
于 2012-10-28T19:48:24.033 に答える