2008-12-01 26 views
6

UITableView! 'Dan UITableViewCells'ı ekleyerek ve silerek oldukça acı çekiyorum! Bu kod 5 bölümleri oluştururAynı anda UITableViewCell ekleme ve silme Çalışmıyor


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 5; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    if (iSelectedSection == section) return 5; 
    return 1; 
} 


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

    //NSLog(@"drawing row:%d section:%d", [indexPath row], [indexPath section]); 

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    if (iSelectedSection == [indexPath section]) { 
     cell.textColor = [UIColor redColor]; 
    } else { 
     cell.textColor = [UIColor blackColor]; 
    } 


    cell.text = [NSString stringWithFormat:@"Section: %d Row: %d", [indexPath section], [indexPath row]]; 

    // Set up the cell 
    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Navigation logic -- create and push a new view controller 

    if ([indexPath row] == 0) { 

     NSMutableArray *rowsToRemove = [NSMutableArray array]; 
     NSMutableArray *rowsToAdd = [NSMutableArray array]; 

     for(int i=0; i<5; i++) { 

      //NSLog(@"Adding row:%d section:%d ", i, [indexPath section]); 
      //NSLog(@"Removing row:%d section:%d ", i, iSelectedSection); 

      [rowsToAdd addObject:[NSIndexPath indexPathForRow:i inSection:[indexPath section]]]; 
      [rowsToRemove addObject:[NSIndexPath indexPathForRow:i inSection:iSelectedSection]]; 

     } 

     iSelectedSection = [indexPath section]; 

     [tableView beginUpdates]; 
     [tableView deleteRowsAtIndexPaths:rowsToRemove withRowAnimation:YES]; 
     [tableView insertRowsAtIndexPaths:rowsToAdd withRowAnimation:YES]; 
     [tableView endUpdates]; 

    } 
} 

:

Normalde kod sonrası yok, ama bu ben sorun yaşıyorum yeri gösteren en iyi yolu olduğunu düşünmüş İlk 5 satır ile 1 (0'dan endeksli). Bir bölüm seçtiğinizde - daha önce seçtiğiniz bölümdeki satırları kaldırır ve seçtiğiniz bölüme satır ekler.

http://www.freeimagehosting.net/uploads/1b9f2d57e7.png http://www.freeimagehosting.net/uploads/1b9f2d57e7.png

Görüntü burada: Ben uygulamasını yüklediğinizde

Pictorally, ben böyle bir şey var http://www.freeimagehosting.net/uploads/1b9f2d57e7.png

bölüm 2'nin bir tablo satırını 0 seçtikten sonra, o zaman silme (varsayılan olarak seçilidir) bölüm 1 satır ve bölüm 2. satır eklemek Ama bu olsun:

http://www.freeimagehosting.net/uploads/6d5d904e84.png http://www.freeimagehosting.net/uploads/6d5d904e84.png

Resimde: http://www.freeimagehosting.net/uploads/6d5d904e84.png

... Beklediğim şey bu değil! Kesin olarak silinse bile bölüm 2'nin ilk satırı bir şekilde kalıyor gibi görünüyor.

Ben sadece bir [tableView reloadData], her şey normal görünür yaparsanız

... ama belli ki güzel animasyonlar forefit.

Birisi burada biraz ışık parlatabilirse gerçekten çok memnun olurum! Beni biraz delirtiyor! Bir kez daha, Nick.

cevap

0

Bilginize: Bu hata 2.2 iPhone güncelleme ile tamamen giderildi görünüyor. Teşekkürler Apple! Nick.

0

Gönderdiğiniz kodda, döngü dizininiz 0'dan 4'e kadar çalışır, bu da bölüm 1'deki satırların tüm'unu sileceğini ve ardından 2. bölüme beş yeni satır ekleyeceğini önerir. Bir satır 0, bu tabloya bölüm 2, satır 0'ın bir ikinci ikinci örneğini ekler.

Ben 1'den 4'e kadar sizin döngü çalıştırmak zorunda öneririm:

for (int i=1; i<5; i++) 
{ 
    // ... 
}
+0

eJames Hey, yorum için teşekkürler - gerçekten geçerli bir nokta !! Bir dakikalığına sorunumu çözebileceğini düşündüm - ama yine de aynı sıkıntım var. Aslında bir iPhone olabileceğini düşünüyorum, ancak bir bölümdeki öğeleri çıkarmaya çalıştığınızda ve aynı anda başka bir bölüme eklediğinizde ... –

1

O numberOfRowsInSection hatırlar gibiyim: çağrılacaktır, sen DeleteRows arayabilir veya insertRow, gerçekten dikkatli olmak gerekir zaman o gerçeklik numberOfRowsInSection cliams değişikliklerinizle eşleşir. Bu durumda iSelectedSection = [indexPath bölümünü] hareket ettirmeyi deneyebilirsiniz; endUpdates sonrası satır.

1

Bunu okumak ama tablo görünümü temsilci işlevlerinden biri içinden tablo satırı güncellemelerini (eklemeler ve silmeler) gerçekleştirmez gerektiğine inanıyoruz nerede hatırlamıyorum. Bence daha iyi bir alternatif, bir nesne olarak güncellemeleri gerçekleştirmek için gerekli olan gerekli bilgileri ileterek performSelectorOnMainThread yapmaktır.gibi bir şey:

- (void)tableView:(UITableView *)tableView 
    didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // .... 
    [self performSelectorOnMainThread: @selector(insertRows:) 
          withObject: someObjectOrNil]; // double check args 
} 

- (void) insertRows: (NSObject*)someObjectOrNil { 
    [tableView beginUpdates]; 
    // update logic 
    [tableView endUpdates]; 

    // don't call reloadData here, but ensure that data returned from the 
    // table view delegate functions are in sync 
} 
6

Bunu işe almak için mücadele etti. İşte benim tableView bir satır eklemek için benim kod:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
[tableView beginUpdates]; 
[dataSource insertObject:[artistField text] atIndex:0]; 
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop]; 
[tableView endUpdates];