Последняя индексированная ячейка в UITableView принимает неправильный шрифт - PullRequest
1 голос
/ 30 ноября 2008

У меня есть следующий код, который на первый взгляд тривиален. Я просто установил хочу установить тип шрифта Georgia со значением 14, если ячейка получена в результате поиска или если в моем массиве студентов есть ноль.

Однако, с этой конкретной ячейкой кода, последней в моем tableView, используется шрифт Georgia с размером 14. Все остальные ячейки работают нормально. Где в моем коде неправильная логика?

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger row = [indexPath row];
    NSInteger section = [indexPath section];

    static NSString *CellIdentifier = @"Student";
    cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }
    // Configure the cell
    if([studentsSearch count] > 0) {
        cell.text = (NSString *)[[[studentsSearch objectAtIndex:section] objectAtIndex:row] valueForKey:@"name"];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    } else {
        if(isSearching == YES) 
            cell.text = @"No students available.";
        else 
            cell.text = @"No students have been added for this school.";

        cell.font = [UIFont fontWithName:@"Georgia" size:14];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

EDIT

Похоже, что происходит, когда создается экземпляр контроллера вида и помещается поверх стека контроллера навигации, мой массив studentsSearch равен nil. Я заполняю это в этом контроллере.

Таким образом, при инициализации для шрифта ячейки устанавливается значение Georgia с размером 14, потому что count равен <0. Однако, когда я заполняю массив <code>studentsSearch и перезагружаю данные tableView, кажется, что шрифт торчит с момента инициализации представления.

Полагаю, теперь мне нужно найти, как вернуть шрифт в эту ячейку по умолчанию.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2008

Имейте в виду, что ячейки таблицы перерабатываются. Допустим, в вашей таблице 15 видимых строк. Это означает, что у вас есть примерно 15 (или несколько) ячеек, которые были созданы и, как я уже сказал, переработаны. Даже если в вашей таблице сотни строк, она все равно будет использовать те же 15 ячеек.

В этом случае вы никогда не сбрасываете размер шрифта, поэтому после того, как вы установите этот размер шрифта для ячейки, он будет использоваться в любой строке после того, как он повторно использует ячейку.

Таким образом, если ваш показатель studentSearch> 0, вам необходимо установить размер шрифта, равный базовому (17?).

2 голосов
/ 30 ноября 2008

Я не вполне уверен, что вы спрашиваете, но я отмечаю, что вы устанавливаете шрифт для Georgia 14, только когда у вас есть результат поиска; в противном случае вы игнорируете это. Если у вас есть ячейка с установленным шрифтом во второй ветви if / then, а затем извлечь эту ячейку (используя dequeueReusableCellWithIdentifier :), у нее уже будет установлен шрифт.

Самое простое решение - добавить

cell.font = [UIFont systemFontOfSize: 14];

после

    cell.text = (NSString *)[[[...
    cell.accessoryType = ...

в первой ветке.

1 голос
/ 01 декабря 2008

Я бы посоветовал вам определить «специальную» ячейку, присвоив ей другой идентификатор ячейки.

В этом случае вам потребуется специальная ячейка с идентификатором повторного использования, например, @ "Нет", и если ячейка еще не создана, создайте ее и установите ее шрифт.

Таким образом, вы создаете дополнительную ячейку со специальным идентификатором, и она хранится отдельно от других обычных ячеек в вашей таблице.

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSInteger row = [indexPath row];
    NSInteger section = [indexPath section];

    static NSString *StudentCellIdentifier = @"Student";
    static NSString *NoneCellIdentifier = @"None";

    // did we find students?
    BOOL found = [studentsSearch count] > 0;

    // get/create correct cell type
    cell = [tv dequeueReusableCellWithIdentifier:(found ? StudentCellIdentifier : NoneCellIdentifier)];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero 
               reuseIdentifier:(found ? StudentCellIdentifier : NoneCellIdentifier)];
    }

    // return a student, or None cell if no studnts found
    if( found ) 
    {
        cell.text = (NSString *)[[[studentsSearch objectAtIndex:section] objectAtIndex:row] valueForKey:@"name"];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    } 
    else 
    {
        if(isSearching == YES) 
            cell.text = @"No students available.";
        else 
            cell.text = @"No students have been added for this school.";
        cell.font = [UIFont fontWithName:@"Georgia" size:14];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return [cell autorelease];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...