Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
702 views
in Technique[技术] by (71.8m points)

iphone - UITableViewCell(s) with default image overwritten with other images upon scrolling

Oops,I am facing an issue with table view cells having no image,i.e. the cell with default image.Upon scrolling the default image disappears and some image from a cell is appearing on it.I have implemented the suggestion from Mr.Rckoenes here .Even then I was unable to fix the issue.Here is my implementation code for understanding:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    ReminderClass *reminderToDisplay = [self.remindersArray objectAtIndex:indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

    // Now create the cell to display the data
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:kHelvetica size:17.0];
        cell.textLabel.adjustsFontSizeToFitWidth = YES;
        cell.backgroundColor = [UIColor clearColor];
    }

    ......

    if (Image != nil) 
    {
        UIImageView *imageView=[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)];
        imageView.backgroundColor=[UIColor clearColor];
        [imageView setImage:Image];
        cell.accessoryView = imageView;
        [imageView release];
    }
    else
    {
        UIImageView *imageView=[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)];
        imageView.backgroundColor=[UIColor clearColor];
        UIImage *defaultImage = [UIImage imageNamed:kDefaultImage];
        [imageView setImage:defaultImage];
        cell.accessoryView = imageView;
        [imageView release];
    }
    cell.textLabel.text = reminderDetailsString;
    return cell;
}

Can any one please help me,thanks in advance :)

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

just set dequeueReusableCellWithIdentifier to nil and also reuseIdentifier to nil like bellow..

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

and

cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];

and also add your other code in this if (cell == nil) if condition..

UPDATE:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row]; 
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
        cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
        cell.textLabel.numberOfLines = 0;
        cell.textLabel.font = [UIFont fontWithName:kHelvetica size:17.0];
        cell.textLabel.adjustsFontSizeToFitWidth = YES;
        cell.backgroundColor = [UIColor clearColor];

        tableView.backgroundColor = [UIColor clearColor];

    NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease];
    [dateFormat setDateFormat:kDateFormat];
    NSDate *reminderDate = [dateFormat dateFromString:reminderToDisplay.Date]; 
    [dateFormat setDateFormat:kMinDateFormat]; 
    NSString *dateString = [dateFormat stringFromDate:reminderDate];

    NSString *valueString = [NSString stringWithFormat:kNameEvent,reminderToDisplay.Name,reminderToDisplay.Event];
    NSString *onString = [NSString stringWithFormat:kOn,dateString];
    NSString *reminderDetailsString = [valueString stringByAppendingString:onString];

    ABAddressBookRef addressbook = ABAddressBookCreate();
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressbook);
    CFIndex numPeople = ABAddressBookGetPersonCount(addressbook);
    for (int i=0; i < numPeople; i++)
    {
        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

        NSString *firstName=(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSString *lastName=(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);

        NSMutableDictionary *contactsDictionary = [[[NSMutableDictionary alloc]init]autorelease];

        if(firstName != nil && firstName != NULL)
        {
            [contactsDictionary setObject:firstName forKey:kFirstName];
            CFRelease(firstName);
        }
        else
        {
            [contactsDictionary setObject:@"" forKey:kFirstName];
        }
        if(lastName != nil && lastName != NULL)
        {
            [contactsDictionary setObject:lastName forKey:kLastName];
            CFRelease(lastName);
        }
        else
        {
            [contactsDictionary setObject:@"" forKey:kLastName];
        }

        //Get the first name and last name added to dict and combine it to form contact name
        firstName = [[[NSString alloc]initWithString:[contactsDictionary objectForKey:kFirstName]]autorelease];
        lastName = [NSString stringWithFormat:@" %@",[contactsDictionary objectForKey:kLastName]];
        self.contactName = [firstName stringByAppendingString:lastName];

        //Now check whether the contact name is same as your reminderToDisplay.Name
        if([reminderToDisplay.Name isEqualToString:contactName] && ABPersonHasImageData(person))
        {
            CFDataRef imageData = ABPersonCopyImageData(person);
            self.reminderImage = [UIImage imageWithData:(NSData *)imageData];
            CFRelease(imageData);
        }
    }

    CFRelease(allPeople);
    CFRelease(addressbook);

    if ([reminderToDisplay.reminderGroup isEqualToString:kFacebook])
    {
        NSString *imageName = [NSString stringWithFormat:kImageName,reminderToDisplay.Name];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *reminderString=[documentsDirectory stringByAppendingPathComponent:[NSString stringWithString:imageName]];
        self.reminderImage = [UIImage imageWithContentsOfFile:reminderString];
    }

    if (reminderImage != nil) 
    {
        UIImageView *imageView=[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)];
        imageView.backgroundColor=[UIColor clearColor];
        [imageView setImage:reminderImage];
        cell.accessoryView = imageView;
        [imageView release];
    }
    else
    {
        UIImageView *imageView=[[UIImageView alloc] initWithFrame:CGRectMake(240, 3, 70, 63)];
        imageView.backgroundColor=[UIColor clearColor];
        UIImage *defaultImage = [UIImage imageNamed:kDefaultImage];
        [imageView setImage:defaultImage];
        cell.accessoryView = imageView;
        [imageView release];
    }
    cell.textLabel.text = reminderDetailsString;
        }
    return cell;
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

57.0k users

...