2012-03-27 21 views
25

iOS uygulamasında düzenli olarak yenilenen bir UITableView var. Kullanıcı aynı zamanda tablo görünümü satırlarını her zaman hareket ettirebilir (tablo görünümü her zaman düzenleme modundadır).UITableViewCell taşıma işlemi başlatılır ve başlatılır

Kullanıcı bir satır sürüklemeye başladığında ve satır bırakıldığında tekrar başladığında yenileme zamanlayıcısını durdurmak istiyorum.

Son bölüm moveRowAtIndexPath ile kolay olmalı, ancak sürükle başlangıç ​​hakkında nasıl bildirim alınacak?

Teşekkürler!

cevap

34

yeniden sıralama eylemlerine yanıt olarak aşağıdaki bildirimleri alacak Sizin UITableViewDelegate: Hareket hücreleri bittikten sonra bu yöntem çağrılır

- (void)tableView:(UITableView *)tableView willBeginReorderingRowAtIndexPath:(NSIndexPath *)indexPath; 
- (void)tableView:(UITableView *)tableView didEndReorderingRowAtIndexPath:(NSIndexPath *)indexPath; 
- (void)tableView:(UITableView *)tableView didCancelReorderingRowAtIndexPath:(NSIndexPath *)indexPath; 
+0

UITableView.h arabiriminde bildirilen bu temsilci yöntemlerini göremiyorum. Onları nerede bulabileceğimizi açıklar mısın? – imnk

+2

@mprudhom Geri aramaları aldım ancak belgesizler. Bir üretim uygulamasında bu temsilci yöntemleri var mı? Bu özel API olarak kabul edilir mi? – Torsten

+0

Bu yöntemler gerçekten UITableView temsilcisine çağrılır. Belgelendirilmedikleri için, Apple bunları gelecekte iOS sürümlerinde ancak iOS 5 ve iOS 7 sürümlerinde kırıyor olabilir. Henüz Apple'ın bu uygulamaların App Store'da yayınlanmasına izin verilip uygulanmayacağına karar verdim (sanırım bana iyi şanslar), ama bunu yapmak için iyi bir neden olmadığını düşünüyorum: UIViewController'daki bu 3 yöntem ve bunlar belgelenmiyor ve altyazı ile başlamıyorlar ya da her neyse, kendi yöntemlerimden nasıl farklılar? – Argentumko

9

Bir süre önce aynı problemle karşılaştım ve bir çözüm bulamadım. Bu cevabı, neden yapılamayacağına dair bir açıklama ile başladığımda, aslında nasıl yapılabileceğini öğrendim! :-)

Özet: UITableViewCell özel alt sınıfı oluşturmanız gerekiyor. UILongPressGestureRecognizer'u UITableViewCellReorderControl'a eklemek için layoutSubviews'u geçersiz kılın. Bir protokol tanımlayın ve sürükleme durumu hakkında istediğiniz kişileri bilgilendirmek için bir temsilci kullanın.

CustomTableViewCell.h:

#import <UIKit/UIKit.h> 

@protocol CustomTableViewCellDelegate; 

@interface CustomTableViewCell : UITableViewCell { 
} 

@property (nonatomic, assign) id <CustomTableViewCellDelegate> delegate; 

@end 

@protocol CustomTableViewCellDelegate 
- (void)CustomTableViewCell:(CustomTableViewCell *)cell isDragging:(BOOL)value; 
@end 

CustomTableViewCell.m:

#import "CustomTableViewCell.h" 

@implementation CustomTableViewCell 

@synthesize delegate = _delegate; 

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer { 
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
     [_delegate CustomTableViewCell:self isDragging:YES]; // Dragging started 
    } else if (gestureRecognizer.state == UIGestureRecognizerStateEnded) { 
     [_delegate CustomTableViewCell:self isDragging:NO];  // Dragging ended 
    } 
} 

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    for (UIView *view in self.subviews) { 
     if ([NSStringFromClass ([view class]) rangeOfString:@"ReorderControl"].location != NSNotFound) { // UITableViewCellReorderControl 
      if (view.gestureRecognizers.count == 0) { 
       UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
       gesture.cancelsTouchesInView = NO; 
       gesture.minimumPressDuration = 0.150; 
       [view addGestureRecognizer:gesture]; 
      } 
     } 
    } 
} 

@end 

bu kodu herhangi özel API'ler kullanmaz ise Apple, iç uygulanmasını değiştirirse yine çalışması durabilir unutmayın (UITableViewCellReorderControl sınıf adını değiştirerek).

+0

Teşekkürler Peter, yeniden düşünmek gerekir Mevcut uygulamam, sınıf ismine güvenme riski taşıyorsa veya "tablonun daima düzenlenmesi" paradigmasını daha iyi değiştirirsem, kullanıcı düzenleme işlemini bitirdikten sonra güncellemeyi durdurabilirim. Daha güvenilir, sadece benim UI'mize nasıl entegre edileceğinden emin değil;) – Cornelius

+0

Bu kabul edilen cevaptı, Apple yeni delege yöntemlerini eklediğinden ve belgelediğinden bu yana @mprudhom'un cevabına değiştirdi. – Cornelius

+1

@Cornelius Apple, yeni delege yöntemlerini nereye ekledi ve belgeledi? IOS 8'de yaşıyorum ve hala özel API. –

0

:

- (void) tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath 
1

Sadece ben yazarlardan buldum, çünkü elma alfa azaltacaktır, biz kullanabilirsiniz sanırım biz kullanabilirsiniz sanırım

@interface CustomTableViewCell() 
@property (nonatomic, assign) BOOL isDragging; 
@end 

-(void)draggingWillBegan 
{ 
    //use a delegate method to inform tableview 
} 

-(void)draggingDidEnd 
{ 
    //use a delegate method to inform tableview 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    //Since apple wont provide en 
    if(self.alpha <= 0.95 && !self.isDragging){ 
     self.isDragging = YES; 
     [self draggingWillBegan]; 
    } 

    if(self.alpha >= 0.95 && self.isDragging){ 
     self.isDragging = NO; 
     [self draggingDidEnd]; 
    } 
} 
İlgili konular