2013-03-11 19 views
10
Bu kodu kullanarak benim UITableViewCells belirli sıralar bir 'asma kilit simgesini göstermesi çalışıyorum

:UITableView hücre accessoryView resim sorunu

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
      cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
      [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 

    } 

    return cell; 
} 

Ben komik bir sonuç alıyorum - asma kilit başlangıçta sıralar 5 gösterilir , 9 ama listede aşağı doğru kaydırdığımda, simge diğer hücrelerin aksesuarında da rasgele yeniden görüntülenir (sadece 1 bölüm btw var) ve kaydırma oldukça sarsıcı ve laggy oluyor ... Daha fazla yukarı/aşağı kaydırıyorum daha fazla örneği görüntülenir! Neden? Buradaki böcek nerede?

yardım, teşekkürler!

+0

, sana bunu nasıl üst üste 5 ve 9 –

+0

için farklı CellReuseIdentifier kullanmak gerektiğini düşünüyorum? – mindbomb

cevap

21

Hücreler yeniden kullanılır. Her seferinde aksesuarı sıfırlamanız gerekir. sadece küçük bir değişiklik Onun:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]]; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 
    } else { 
     cell.accessoryView = nil; 
    } 

    return cell; 
} 

Sadece tamamlanması için, ayrıca böyle Eric'in çözümü kullanabilirsiniz - ImageView her zaman oluşturulmadı çünkü, daha hızlı olabilir. Ama bu sadece küçük bir fark. Muhtemelen gecikmelerinizin başka sebepleri vardır. Eğer kaydırırken hücre diğer satırlar için yeniden edildiği için

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = nil; 
    if(indexPath.row == 5 || indexPath.row == 9) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCellWithImage"]; 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 
    } else { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 
    } 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    return cell; 
} 
+0

Tamam, teşekkürler! Daha sonra kontrol edeceğim. ama aslında 'açıklama' gri sağ açı simgesi – mindbomb

+0

göstermek için görüntü yok hücrelere ihtiyacım var evet 5 ve 9 hala görüntüyü gösterecektir. diğerleri değil. sadece dene. – calimarkus

+0

ve uitableview belgelerini okuyun - yeniden anlatmayı açıklar. – calimarkus

0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    if(indexPath.row == 5 || indexPath.row == 9) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCellWithImage"]; 
    } else { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"TopicCell"]; 
    } 

    GPBTopic *topic = [self.topics.list objectAtIndex:indexPath.row]; 
    cell.textLabel.text= topic.name; 

    if ((indexPath.row == 5) || (indexPath.row == 9)) 
    { 
     cell.accessoryView = [[ UIImageView alloc ] initWithImage:[UIImage imageNamed:@"lock_icon.png"]];; 
     [cell.accessoryView setFrame:CGRectMake(0, 0, 24, 24)]; 

    } 

    return cell; 
} 
+0

Üzgünüm, doğru değil, jaydee3'ün çözümü çok daha kolay .. teşekkürler! – mindbomb