проблема с методом cellForRowAtIndexPath в UITableView iphone (indexPath.row является нулевым) - PullRequest
0 голосов
/ 25 августа 2010

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

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


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

    UILabel *nameLabel,*sugarLabel,*searchNameLabel,*searchSugarLabel;

    if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        CGFloat width = [UIScreen mainScreen].bounds.size.width - 50;
        CGFloat height = 20;
        CGRect frame = CGRectMake(10.0f, 10.0f, width, height);
        if(isSearchOn)
        {
            searchNameLabel = [[UILabel alloc] initWithFrame:frame];
            searchNameLabel.textColor = [UIColor blackColor];
            searchNameLabel.backgroundColor = [UIColor clearColor];
            searchNameLabel.textAlignment = UITextAlignmentLeft;
            searchNameLabel.font = [UIFont systemFontOfSize:14.0f];
            searchNameLabel.tag=260;
            [cell.contentView addSubview:searchNameLabel];
            [searchNameLabel release];

            searchSugarLabel= [[UILabel alloc] initWithFrame:frame];
            searchSugarLabel.textColor = [UIColor blackColor];
            searchSugarLabel.backgroundColor = [UIColor clearColor];
            searchSugarLabel.textAlignment = UITextAlignmentLeft;
            searchSugarLabel.font = [UIFont systemFontOfSize:14.0f];
            searchSugarLabel.tag=160;
            [searchSugarLabel setHidden:YES];
            [cell.contentView addSubview:searchSugarLabel];
            [searchSugarLabel release];
        }
        else{       
        nameLabel = [[UILabel alloc] initWithFrame:frame];
        nameLabel.textColor = [UIColor blackColor];
        nameLabel.backgroundColor = [UIColor clearColor];
        nameLabel.textAlignment = UITextAlignmentLeft;
        nameLabel.font = [UIFont systemFontOfSize:14.0f];
        nameLabel.tag=60;
        [cell.contentView addSubview:nameLabel];
        [nameLabel release];

        sugarLabel= [[UILabel alloc] initWithFrame:frame];
        sugarLabel.textColor = [UIColor blackColor];
        sugarLabel.backgroundColor = [UIColor clearColor];
        sugarLabel.textAlignment = UITextAlignmentLeft;
        sugarLabel.font = [UIFont systemFontOfSize:14.0f];
        sugarLabel.tag=160;
        [sugarLabel setHidden:YES];
        [cell.contentView addSubview:sugarLabel];
        [sugarLabel release];
        }
    }
    else {        

        if(isSearchOn)
        {
            searchNameLabel=(UILabel *)[cell.contentView viewWithTag:260];
            searchSugarLabel=(UILabel *)[cell.contentView viewWithTag:160];
        }
        else{
            nameLabel=(UILabel *)[cell.contentView viewWithTag:60];
            sugarLabel=(UILabel *)[cell.contentView viewWithTag:160];
        }

    }


    if (isSearchOn) { 

        cellValue = [searchResult objectAtIndex:indexPath.row]; 
        searchSugarLabel.text=cellValue.sugarId;
        NSString *searchText = [NSString stringWithFormat:@"%@ %@", cellValue.firstName, cellValue.lastName];
        searchNameLabel.text=searchText;
        NSLog(@"%@",searchNameLabel.text);
        NSLog(@"%@",searchSugarLabel.text);
    }


     else {

            NSString *contact=[contactKeys objectAtIndex:[indexPath section]];
            NSArray *contactSection=[contactNames objectForKey:contact];
            sugar=[db getSugarId:@"Contacts" bySection:contact andIndex:indexPath.row];


            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]];
            nameLabel.text = contactText;
            sugarLabel.text = sugar;
}
    return cell;
}

Контакты - это класс, в котором есть свойства firstName, lastName и sugar id. Я назначаю свойства класса контактов переменным в методе базы данных и возвращаю массив объектов контактов. searchResult теперь является массивом контактных объектов. Проблема заключается в том, что когда я регистрирую содержимое на консоли, база данных получает все в нем и возвращает массив контактов. Контакты в searchResult указывают на разные области памяти, но когда я пытаюсь отладить Метод cellForRowAtIndexPath после получения 6 контактов. 7-й контакт указывает на ту же область памяти, что и 1-й, и повторяется, таким образом, в searchNameLabel.text он возвращает ноль, а indexPath указывает на ноль ... и я признаю, что я очень плох в этом .. Мне нужно понять это, так как я собираюсь закончить свой проект этим ... пожалуйста, ребята, помогите мне ...

Это происходит только тогда, когда я пытаюсь найти контакты. Работает нормально, когда я пытаюсь загрузить все контакты на стол.

1 Ответ

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

Вы инициализируете свои подпредставления в блоке if(cell== nil), но в соответствующем блоке else вы перезаписываете их снова.

Вы должны переосмыслить свой дизайн: не загружайте различные виды на searchon, а устанавливайте их свойства в зависимости от searchon

if(cell == nil){
   //do all initializing
}

if(searchon){
    //set view/label properties for searching style
} else {
    //set view/label properties for not-searching style
}

. Другой подход может состоять в том, чтобы полностью разделить файлы NIB.для поиска /! searchon

if(searchon){
    static NSString *SearchOnCellIdentifier = @"SearchOnCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SearchOnCellIdentifier];
    if (cell == nil){
        //load cell from extra nib
    }

} else {
    static NSString *SearchOFFCellIdentifier = @"SearchOFFCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SearchOFFCellIdentifier];
    if (cell == nil){
        //load cell from extra nib
    }
}

ПРИМЕЧАНИЕ : я этого никогда не делал, и он не тестировался.

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