Проблема в пользовательской ячейке UITableView - PullRequest
1 голос
/ 23 августа 2010

Я пытаюсь добавить пользовательские метки в свою ячейку в UITableView. Когда я пытаюсь сделать это, дисплей не работает, и я не могу понять, что именно происходит. Пожалуйста, найдите изображение ниже, и я опубликую метод, который я написал ..

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


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    //cell.textLabel.font=[UIFont systemFontOfSize:16];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    NSString *contact=[contactKeys objectAtIndex:[indexPath section]];
    NSArray *contactSection=[contactNames objectForKey:contact];
    NSMutableArray *sugar=[db sugarId];

    if (isSearchOn) { 
        NSString *cellValue = [searchResult objectAtIndex:indexPath.row]; 
        NSArray *splitText = [cellValue componentsSeparatedByString:@":"];
        NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];
        //NSString *result=[contactText stringByAppendingString:[sugar objectAtIndex:[indexPath row]]];
        firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];                                                  
        firstLabel.tag =40; //This should be a constant probably
        firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
        firstLabel.text = contactText;
        [firstLabel sizeToFit];
        [cell.contentView addSubview:firstLabel];

        sugarLabel = [[UILabel alloc] initWithFrame:
                      CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
        sugarLabel.tag =40; //This should be a constant probably
        //sugarLabel.font = [UIFont boldSystemFontOfSize:16];
        sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
        [sugarLabel setHidden:YES];        
        [cell.contentView addSubview:sugarLabel];


        cell.textLabel.text =firstLabel.text;
        } else {
         NSString *cellText = [contactSection objectAtIndex:[indexPath row]];

            // split the text by the : to get an array containing { "AAA", "BBB" }
            NSArray *splitText = [cellText componentsSeparatedByString:@":"];

            // form a new string of the form "BBB AAA" by using the individual entries in the array
            NSString *contactText = [NSString stringWithFormat:@"%@ %@", [splitText objectAtIndex:1], [splitText objectAtIndex:0]];

            firstLabel=[[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 40)]autorelease];                                                  
            firstLabel.tag =40; //This should be a constant probably
            //firstLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize]];
            firstLabel.text = contactText;
            [firstLabel sizeToFit];
            [cell.contentView addSubview:firstLabel];

            sugarLabel = [[UILabel alloc] initWithFrame:
                                    CGRectMake(10+firstLabel.frame.size.width+2, 10, 300, 60)];
            sugarLabel.tag =40; //This should be a constant probably
            //sugarLabel.font = [UIFont boldSystemFontOfSize:16];
            sugarLabel.text = [sugar objectAtIndex:[indexPath row]];
            [sugarLabel setHidden:YES];        
            [cell.contentView addSubview:sugarLabel];

            NSString *result=[NSString stringWithFormat:@"%@ %@",firstLabel.text,sugarLabel.text];
            cell.textLabel.text=result;

    }

alt text

Рисунок 2: Это модификация кода, предложенная BP. Результат здесь под .. alt text

EDIT:

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

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Причиной появления элементов UILabel: ... является последняя строка метода, где вы устанавливаете cell.textLabel.textВы не хотите этого делать, если вы создаете ячейку с собственными полями внутри нее.

2 голосов
/ 23 августа 2010
NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel]

следует читать:

NSString *result=[NSString stringWithFormat:@"%@ %@",contactText,sugarLabel.text]

Вы передаете UILabel, а не NSString

редактировать

Попробуйте создать и добавить UILabels только в блоке if (cell == nil) {.

при доступе к свойствам меток и записи в него вне этого блока все в порядке

2 голосов
/ 23 августа 2010

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

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

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

Если бы вы сделали что-то вроде приведенного ниже кода, вы бы увидели что-то похожее.

UILabel *label = [[UILabel alloc] init];<br> NSLog(@"%@", label);<br> [label release];<br>

Редактировать: видя отредактированный скриншот, я предполагаю, что вы прокрутиливниз к разделу «S».В этом случае вы видите надписи над другими надписями.Как я уже говорил, вы создаете новый ярлык каждый раз и помещаете его поверх ярлыка, который вы создали в первый (и второй, третий и т. Д.) Раз, когда вы использовали ячейку.

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