2012-03-27 8 views
25

मेरे आईओएस ऐप में एक UITableView है जो समय-समय पर रीफ्रेश हो जाता है। उपयोगकर्ता हर समय टेबलव्यू पंक्तियों को स्थानांतरित करने में भी सक्षम होता है (तालिकादृश्य हमेशा संपादन मोड में होता है)।UITableViewCell की शुरुआत कैसे करें आरंभ करें और

उपयोगकर्ता रीफ्रेश टाइमर को रोकना चाहता हूं जब उपयोगकर्ता पंक्ति को खींचना शुरू कर देता है और पंक्ति को गिराए जाने पर इसे फिर से शुरू करना चाहता है।

अंतिम भाग moveRowAtIndexPath के साथ आसान होना चाहिए, लेकिन ड्रैग शुरू करने के बारे में अधिसूचित कैसे किया जाए?

धन्यवाद!

उत्तर

34

आपका UITableViewDelegate पुन: क्रम कार्रवाई के जवाब में निम्नलिखित सूचनाएं प्राप्त नहीं होंगी:

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

मुझे UITableView.h इंटरफ़ेस में घोषित इन प्रतिनिधि विधियों को नहीं दिखाई देता है। क्या आप कृपया बता सकते हैं कि हम उन्हें कहां पा सकते हैं? – imnk

+2

@mprudhom मुझे कॉलबैक प्राप्त हुए लेकिन वे अनियंत्रित हैं। क्या आपके पास उत्पादन प्रतिनिधि में ये प्रतिनिधि विधियां हैं? क्या यह निजी एपीआई माना जाता है? – Torsten

+0

इन विधियों को वास्तव में UITableView के प्रतिनिधि पर बुलाया जाता है। चूंकि वे अनियंत्रित हैं, इसलिए ऐप्पल उन्हें आईओएस की भावी रिलीज में तोड़ सकता है, लेकिन आईओएस 5 और आईओएस 7 तक, यह अभी भी काम करता है। मुझे अभी पता लगाना है कि ऐप्पल वास्तव में ऐप स्टोर (मुझे शुभकामनाएं, मुझे लगता है) पर प्रकाशित होने के लिए लागू किए गए तरीकों के साथ एक ऐप की अनुमति देगा, लेकिन मुझे नहीं लगता कि इसका कोई अच्छा कारण नहीं है: अगर मैं लागू करता हूं मेरे UIViewController में इन 3 विधियों, और वे दस्तावेज नहीं हैं और वे अंडरस्कोर या जो कुछ भी शुरू नहीं करते हैं, वे मेरे अपने तरीकों से अलग कैसे हैं? – Argentumko

9

मैं कुछ समय पहले एक ही समस्या में भाग गया और मुझे कोई समाधान नहीं मिला। जबकि मैंने इस जवाब को एक स्पष्टीकरण के साथ शुरू किया, यह क्यों नहीं किया जा सकता है, मुझे वास्तव में पता चला कि यह कैसे किया जा सकता है! :-)

संक्षेप में: आपको UITableViewCell का कस्टम सबक्लास बनाना होगा। को UILongPressGestureRecognizer से UITableViewCellReorderControl संलग्न करने के लिए ओवरराइड करें। प्रोटोकॉल को परिभाषित करें और किसी भी प्रतिनिधि को सूचित करने के लिए जो भी आप ड्रैगिंग स्थिति के बारे में जानना चाहते हैं।

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 

ध्यान दें, इस कोड किसी भी निजी एपीआई का उपयोग नहीं करता है, तो यह अभी भी एप्पल अपने आंतरिक कार्यान्वयन में परिवर्तन काम करना बंद कर सकता है हो सकता है (यानी UITableViewCellReorderControl के वर्गनाम को बदलकर)।

+0

धन्यवाद पीटर, मुझे पुनर्विचार करना होगा मेरे वर्तमान कार्यान्वयन वर्ग के नाम पर भरोसा करने के जोखिम के लायक है या यदि मैं बेहतर रूप से "टेबलव्यू हमेशा संपादन" प्रतिमान बदलता हूं ताकि उपयोगकर्ता संपादन को टैप करने के बाद इसे अपडेट करना बंद कर सकूं। अधिक विश्वसनीय लगता है, बस यह सुनिश्चित न करें कि मेरे यूआई में इसे कैसे एकीकृत किया जाए;) – Cornelius

+0

यह स्वीकार्य उत्तर था, ऐप्पल ने जोड़ा और नए प्रतिनिधि तरीकों को दस्तावेज करने के बाद इसे @mprudhom से जवाब में बदल दिया। – Cornelius

+1

@ कॉर्नेलियस ऐप्पल ने नए प्रतिनिधि तरीकों को जोड़ा और दस्तावेज किया था? मैं आईओएस 8 पर हूं और वे अभी भी निजी एपीआई हैं। –

0

जब आप आगे बढ़ कोशिकाओं काम हो गया इस विधि कहा जाता हो जाता है:

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

बस मैं एक हैक पाया, क्योंकि सेब अल्फा को कम करेगा, हम इसका उपयोग कर सकते हैं कि मुझे लगता है कि

@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]; 
    } 
} 
संबंधित मुद्दे