UITableView список не отображает все элементы - PullRequest
0 голосов
/ 02 января 2012

В моем UITableView я пытаюсь отобразить все элементы в моем списке, но не все элементы отображаются.На самом деле это показывает большую часть, но нижние элементы повторяются по какой-то странной причине.Я в основном хочу показать все ключи в листе с их соответствующими значениями.Список слишком длинный для отображения?там около 30 наименований.

Сначала я попытался отсортировать ключи и подумал, что это проблема, поэтому потом я совсем не сортировал, и у меня возникла та же проблема, опустив список, пункты повторяются ине отображаются последние 3 элемента.Есть ли предел?

Ниже приведен код, который я только что изменил, чтобы подогнать его:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"PreferencesCell1";
    static NSString *CellIdentifier2 = @"PreferencesCell2";
    static NSString *CellIdentifier3 = @"PreferencesCell3";

    UITableViewCell *cell;     

    NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys];
    NSString *prefName = [keys objectAtIndex:indexPath.row];

    if (indexPath.section == 0 || indexPath.section == 2) {

        if(indexPath.section == 0)
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        else if(indexPath.section == 2)
            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

        if (cell == nil) {

            if(indexPath.section == 0)
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease];
            else if(indexPath.section == 2)
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease];

            cell.accessoryType = UITableViewCellAccessoryNone;

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect];
            settingName.font = [UIFont boldSystemFontOfSize:17.0];
            settingName.backgroundColor = [UIColor clearColor];
            settingName.text = prefName;


            [cell.contentView addSubview: settingName];
            [settingName release];

        }

    } else if(indexPath.section == 1) {

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease];

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *label = [[UILabel alloc] initWithFrame:labelRect];
            label.font = [UIFont boldSystemFontOfSize:17.0];
            label.backgroundColor = [UIColor clearColor];

            label.text = prefName;

            [cell.contentView addSubview: label];
        }

        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    } 

    return cell;
}

Я обнаружил, что если я не использую метки и простоперейдите на общий подход cell.textLabel.text, тогда все элементы отображаются правильно.Однако, если я использую подход UILabel, нижние элементы не отображаются.Мне нужно идти по этому пути, поскольку я добавляю другие элементы в ячейку.

Рабочий код.

Сначала необходимо создать инициализацию и создание ячейки, затем с помощью этой ячейки удалить из суперпредставления, а затем визуализировать подпредставления.Так что переупорядочение кода сверху.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *CellIdentifier1 = @"PreferencesCell1";
        static NSString *CellIdentifier2 = @"PreferencesCell2";
        static NSString *CellIdentifier3 = @"PreferencesCell3";

        UITableViewCell *cell;     

        NSArray *keys = [[[preferences objectAtIndex:indexPath.section] objectForKey:@"Rows"] allKeys];
        NSString *prefName = [keys objectAtIndex:indexPath.row];

        // Create/Initialize Cell first

        if (indexPath.section == 0 || indexPath.section == 2) {

            if(indexPath.section == 0)
                cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
            else if(indexPath.section == 2)
                cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

            if (cell == nil) {

                if(indexPath.section == 0)
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease];
                else if(indexPath.section == 2)
                    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier2] autorelease];   
            }

        } else if(indexPath.section == 1) {

            cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier3];

            if (cell == nil) {
                cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier3] autorelease];
            }
        } 

        // remove from superview

        [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

        // render the subviews

        if (indexPath.section == 0 || indexPath.section == 2) {

            cell.accessoryType = UITableViewCellAccessoryNone;

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *settingName = [[UILabel alloc] initWithFrame:labelRect];
            settingName.font = [UIFont boldSystemFontOfSize:17.0];
            settingName.backgroundColor = [UIColor clearColor];
            settingName.text = prefName;


            [cell.contentView addSubview: settingName];
            [settingName release];

        } else if(indexPath.section == 1) {

            CGRect labelRect = CGRectMake(10, 5, 300, 31);
            UILabel *label = [[UILabel alloc] initWithFrame:labelRect];
            label.font = [UIFont boldSystemFontOfSize:17.0];
            label.backgroundColor = [UIColor clearColor];

            label.text = prefName;

            [cell.contentView addSubview: label];

            cell.accessoryType = UITableViewCellAccessoryNone;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
        }

        return cell;
    }

Ответы [ 2 ]

1 голос
/ 02 января 2012

Похоже, что ячейки используются повторно, и вы просто добавляете новые представления к их существующему содержимому.Вам необходимо сбросить содержимое, как описано здесь: UITbleViewCell Reference Class .Если бы вы просто устанавливали ячейку textLabel каждый раз, здесь было бы достаточно установить новое значение, но если вы добавляете подпредставления, вам может понадобиться что-то более похожее на [cell.contentView.subviews makeObjectsPerformSelector: @selector(removeFromSuperview)];

0 голосов
/ 02 января 2012

Предел для просмотра таблицы - это размер свободной оперативной памяти.

Пожалуйста, отправьте код. Но я думаю, что это может быть проблемой с кэшированием ячеек.

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