如何获得UITableViewCell移动开始和结束的通知?

时间:2012-03-27 22:03:08

标签: ios iphone uitableview drag

我的iOS应用中有一个UITableView会定期刷新。用户还可以随时移动tableview行(tableview始终处于编辑模式)。

我想在用户开始拖动行时停止刷新计时器,并在删除行时再次启动它。

使用moveRowAtIndexPath,最后一部分应该很简单,但如何获得有关拖动开始的通知?

4 个答案:

答案 0 :(得分:40)

您的UITableViewDelegate将收到以下通知以响应重新排序操作:

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

答案 1 :(得分:9)

前段时间我遇到了同样的问题但没找到解决办法。虽然我开始回答并解释为什么不能这样做,但我实际上发现了它是如何完成的! : - )

简而言之:您必须创建UITableViewCell的自定义子类。覆盖layoutSubviews以将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

请注意,虽然此代码不使用任何私有API,但如果Apple更改其内部实现(即更改UITableViewCellReorderControl的类名),它仍可能停止工作。

答案 2 :(得分:3)

我发现了一个黑客,因为苹果会减少alpha,我猜可以使用

@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];
    }
}

答案 3 :(得分:0)

当您完成移动单元格时,会调用此方法:

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