2009-01-28 21 views

cevap

14

Ağır kaldırma işimizi yapıyoruz.

- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

    // remove the original from the data structure 
    [rows removeObjectAtIndex:fromIndexPath.row]; 

    // insert the object at the target row 
    [rows insertObject:r atIndex:toIndexPath.row]; 
    NSLog(@"result of move :\n%@", [self rows]); 
} 

Bu temel bir örnek olduğundan, tüm satırları hareketli hale getirebiliriz.

- (BOOL)tableView:(UITableView *)tableView 
canMoveRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 
+0

, ki (o ayırmanın neden belki ve) o nesnenin başvuru sayısı azaltacaktır? Ben exchangeObjectAtIndex: withObjectAtIndex: (@dreamlax tarafından önerildiği gibi) daha güvenli olduğunu düşünüyorum. –

+0

BTW, kendi sorunuzu cevaplıyorsanız, bunu bir wiki yapmak için iyi bir form olduğunu düşünüyorum. –

+0

@KristopherJohnson 'exchangeObjectAtIndex: withObjectAtIndex:' bu durumda uygun değil. TableView: moveRowAtIndexPath: toIndexPath: 'tarafından istenenlerden farklı anlamlara sahiptir. – Benjohn

0

NSMutableArrayexchangeObjectAtIndex:withObjectAtIndex: adlı bir yöntem vardır.

+3

Bunu denedim, ancak davranış farklı.Tablo satırları değiştirmez, bir satırı kaldırır, ardından farklı bir yere ekler. Bu yöntemi kullanırsam, tablo ve destek deposu, her hareketle senkronizasyondan daha fazla çıkar. –

11

Yukarıdakilerden hiçbiri çalışmaz. Orijinal olarak gönderilen kodda, tablo görünümü, kullanılmakta olan verileri kaldırdığı ve sonra da düzeltildikten sonra çökecektir, çünkü tablo bir 'yeniden düzenleme' yöntemi sayesinde doğru veriye sahip olmayacaktır.

exchangeObjectAtIndex: withObjectAtIndex: Bir tableview

Neden

yeniden düzenleme, kendi nasıl uyguladığını göre bir dizi yeniden düzenleme için çalışmaz? Kullanıcı, yeniden düzenlemek için bir tablo hücresi seçtiğinde, bu hücre, taşıdıkları hücreyle değiştirilmez. Seçtikleri hücre yeni satır dizinine eklenir ve daha sonra orijinal hücre kaldırılır. En azından, kullanıcıya göründüğü gibi.

Çözüm: Tablo görünümünün bir yeniden düzenlemeyi gerçekleştirmesi nedeniyle, doğru satırı ekleyip çıkardığımızdan emin olmak için bir denetim yapmamız gerekiyor. Bir araya getirdiğim bu kod basit ve benim için mükemmel çalışıyor. örnek olarak orijinal yayınlanan kod verilerini kullanarak

: Eğer birkaç dakikanızı ayırın ve bir Yeniden düzenle sırasında tableview neler olduğuna bir göz atacak olursak biz neden ekledin


- (void)tableView:(UITableView *)tableView 
moveRowAtIndexPath:(NSIndexPath *)fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath 
{ 
    NSLog(@"move from:%d to:%d", fromIndexPath.row, toIndexPath.row); 
    // fetch the object at the row being moved 
    NSString *r = [rows objectAtIndex:fromIndexPath.row]; 

     // checks to make sure we add and remove the right rows 
    if (fromIndexPath.row > toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:toIndexPath.row]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row + 1)]; 
    } 
    else if (fromIndexPath.row < toIndexPath.row) { 

     // insert the object at the target row 
     [rows insertObject:r atIndex:(toIndexPath.row + 1)]; 

     // remove the original from the data structure 
     [rows removeObjectAtIndex:(fromIndexPath.row)]; 

    } 

} 

anlayacaksın 1'lerin biz yaptı.

Çok yeni xcode yapıyorum, bu yüzden muhtemelen bunu yapmanın daha kolay bir yolu olduğunu biliyorum ya da kod muhtemelen basitleştirilebilir .... Sadece nerede olabileceğime yardım etmeye çalışıyorum çünkü bu beni birkaç kez aldı Bunu anlamaya saatler. Umarım bu birileri zaman kaybeder!

+1

Bu, TableView ve NSMutableArray – wayneh

+1

Thanx Wiz'in bileşimi için doğru yanıttır. Kodunuz mükemmel çalışıyor ve mantıklı. – Ali

5

Apple'ın belgelerine ve kendi deneyimlerine göre, bu oldukça iyi çalışıyor bazı basit kod şudur:

NSObject *tempObj = [[self.rows objectAtIndex:fromIndexPath.row] retain]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
[tempObj release]; 
+0

Güzel cevap. Senin her şeyiniz en doğru olanıdır. Teşekkürler dostum! – GeneCode

0

basit uygulanmasına karşı başımı kırma sonra bu tartışma bulundu ... Michael Berding çözümdür Benim için en iyisi, Apple yolu, sadece ARC'yi kullanırken korumayı kaldırmayı ve bırakmayı unutmayın. Yani, daha özlü çözüm removeObjectAtIndex denir

NSObject *tempObj = [self.rows objectAtIndex:fromIndexPath.row]; 
[self.rows removeObjectAtIndex:fromIndexPath.row]; 
[self.rows insertObject:tempObj atIndex:toIndexPath.row]; 
İlgili konular