2010-04-02 18 views
10

, satır alternatif 2 renk var ... vs, vs, üçüncü siyah, ilk siyah ikinci beyaz gibiiPhone'da UITableView için alternatif renkler içeren satırları nasıl oluşturabilirim? ben yapardım

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
static NSString *CellIdentifier = @"Cell"; 
cell = ((MainCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]); 
if (cell==nil) { 

    NSArray *topLevelObjects=[[NSBundle mainBundle] loadNibNamed:@"MainCell" owner:self options:nil]; 

    for (id currentObject in topLevelObjects){ 
     if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
      if ((indexPath.row % 2)==0) { 
       [cell.contentView setBackgroundColor:[UIColor purpleColor]]; 

      }else{ 
       [cell.contentView setBackgroundColor:[UIColor whiteColor]]; 

      } 
      cell = (MainCell *) currentObject; 
      break; 
     } 
    } 

}else { 

    AsyncImageView* oldImage = (AsyncImageView*) 
    [cell.contentView viewWithTag:999]; 
    [oldImage removeFromSuperview]; 
}return cell; 

sorun olduğunu ben hızlı kaydırma, ne zaman hücrelerin arka plan son 2 hücre siyahı, ilk 2 hücre beyazı ya da bunun gibi bir şey gibi olur, ama eğer yavaş kaydırırsa iyi çalışır. Bence sorun, reusableCell'in önbelleği.

Herhangi bir fikrin var mı?

TIA

+0

Eğer CellIdentifier'ı bir dize değişmez, statik yapmayın –

+1

@Jared P: Bir dize literal statik bir işaretçi yapmakta yanlış bir şey yoktur. –

+0

Ben hala java düşünün! .. ama statik tanımlayıcı ile bildiğim için nesnenin değeri ilk kez ayrılan aynı kalır ... – Mat

cevap

25

Hücreler (yani bunları sıradan çıkarma ve nil olup olmadığını kontrol ederken de bunu yapıyoruz) geri dönüşümlü olsun. Bu nedenle, hücreyi oluştururken arka plan rengini ayarlamak yerine, bir süre sonra ayarlayın. Yani:

if(!cell) { 
    // create the cell and stuff 
} 
if([indexPath row] % 2) 
    [cell setBackgroundColor:[UIColor whiteColor]]; 
else 
    [cell setBackgroundColor:[UIColor purpleColor]]; 
+0

Tamam, çok iyi çalışıyor ..! – Mat

+0

Bu yaklaşım benim için çalışmadı. Her tür şeyi denedikten sonra, bunu yapmanın tek yolu, farklı renkteki hücreler için farklı reuseIdentifier kullanmaktı. – autremoi

+0

Hücre arka planlarını cellForRowAtIndexPath'de ayarlayamazsınız. Bunu willDisplayCell yönteminde ayarlayabilirsiniz. –

2

Ne oluyor inanmak, yeniden kullanılabilir bir hücreyi sıradan çıkarma yaparken, bir tanımlanmış sırayla bunu kalmamasıdır. Olduğu gibi, yavaşça ilerlediğinizde, hücreler her seferinde bir kullanılabilir hale gelir ve sırayla, size göre dequeued. Hızlı bir şekilde ilerlediğinizde, sipariş, dequeued oldukları sıradaki gibi tanımsız hale gelir. Apple'ın UITableView API'sini tanımlayıcı tarafından dequeue olarak tasarlamasının nedeni budur. Bu yüzden farklı renklerdeki gibi farklı hücre türlerini kolaylıkla yeniden kullanabilirsiniz. Bu nedenle, her hücre renginin kendi tanımlayıcısına sahip olması için kodu değiştirmenizi öneririz. (Ayrıca, mümkünse, bu tabloya veri kaynağını doğrudan hücreye bağlayan bir çıkışa sahip olun veya bir kez yükledikten sonra bir ivar'a kaydedin ve sonra üst düzey nesneler aracılığıyla bisiklet sürmekten kopyalayın)

+0

Bunu yapma. Arka plan rengini değiştiriyorsanız, hücre içeriği gibidir, bu nedenle aynı tanımlayıcıyı kullanın. Farklı hücre düzenlemeleri veya benzeri bir şeyiniz varsa farklı tanımlayıcılar kullanırsınız. Bunun gibi bir şey için farklı tanımlayıcılar kullanarak kaynakları harcıyorsunuz. –

+0

2 farklı tanımlayıcı ile 2 nib dosyası gibi mi? – Mat

+0

@Mat: Hücreleriniz için farklı düzenleriniz varsa farklı tanımlayıcılar kullanırsınız. Yani evet, tamamen farklı olan içeriğe dayalı olarak yüklediğiniz iki ucu varsa. Bu durumda yanlışlıkla yanlış tipte bir hücreyi geri almak istemezsiniz. Ama bunu arka plan rengi gibi basit değişiklikler için kullanmazsınız. –