1

我正在尝试向 tableViewCell 添加滑动手势识别器,但它不起作用。

这是我创建单元格的方式:

CellIdentifier = @"EventsSentCell";
    nibObjcet = [[NSBundle mainBundle] loadNibNamed:@"EventsSentCell" owner:self options:nil];

EventsSentCell *cell = [[EventsSentCell alloc] init];
cell = (EventsSentCell *)[nibObjcet objectAtIndex:0];

这就是我的单元格在 .m 文件中的启动方式:

-(id)init{
    self = [super init];
    if (self) {
        leftSwipe = [[UISwipeGestureRecognizer alloc] init];
        leftSwipe.direction= UISwipeGestureRecognizerDirectionLeft;
        [leftSwipe addTarget:self action:@selector(swipedLeft)];
        [self addGestureRecognizer:leftSwipe];
    }
    return self;
}

这就是我在 .h 文件中声明手势识别器的方式:

@property (nonatomic,strong) IBOutlet UISwipeGestureRecognizer *leftSwipe;

但由于某种原因,我的方法没有被调用。

有任何想法吗?

谢谢

我试过把下面的代码:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"%@",gestureRecognizer);
    return YES;
}

我向左滑动后得到的结果是:

<UILongPressGestureRecognizer: 0xa9d99a0; state = Possible; view = <UITableViewCellContentView 0xa9d8ce0>; target= <(action=_longPressGestureRecognized:, target=<EventsSentCell 0xa9d8bb0>)>>
4

2 回答 2

0

在回答实际问题之前,让我指出您代码中的其他一些问题。

EventsSentCell *cell = [[EventsSentCell alloc] init];
cell = (EventsSentCell *)[nibObjcet objectAtIndex:0];

首先,这两行没有意义。您正在分配和初始化一个EventSentCell没有 nib 的实例。完成此操作后,您将覆盖cell以指向由loadNibNamed:. 您可以将其简化为EventsSentCell = (EventsSentCell *)nibObject[0];
但是即使经过这些优化,这仍然不是推荐的实现方式cellForRowAtIndexPath:。您应该使用registerNib:forCellReuseIdentifier:inviewDidLoad然后使用 dequeueReusableCellWithIdentifier:forIndexPath:来获取一个单元格,而无需自己完全加载笔尖。

下一个,

@property (nonatomic,strong) IBOutlet UISwipeGestureRecognizer *leftSwipe;

您将此属性声明为 anIBOutlet但您仅在代码中设置它(据我所知),更具体地说是init方法。你可以完全省略掉IBOutlet

而且这种init方法可能也是您的问题的原因。使用 实例化视图时loadNibNamedinitWithCoder:会调用 , 而不是init。在那里实现您的自定义初始化代码(在这种情况下添加手势识别器),它应该可以正常工作。

于 2013-07-21T11:13:50.463 回答
0

你的“init”方法没有被调用,所以手势识别器没有设置。

您可以尝试初始化awakeFromNib,但无论如何您的单元格创建看起来非常规。

假设您正在使用带有 Xib 文件的自定义单元类,这就是我的做法。

  1. 创建您的EventsSentCell对象 .m 和 .h 文件

  2. 创建一个 xib 文件“EventsSentCell.xib”

  3. 在 xib 文件中,删除默认的顶级视图,并将其替换为 UITableViewCell(您可以从对象库中拖出一个)。在身份检查员中将其类别更改为EventsSentCell

  4. 在你的表 viewController 的viewDidLoad...

     UINib* EventsSentNib = [UINib nibWithNibName:@"EventsSentCell" 
                                           bundle:nil];
     [self.tableView registerNib:EventsSentNib 
          forCellReuseIdentifier:@"EventsSentCell"];
    
  5. 在你的cellForRowAtIndexPath方法中:

    UITableViewCell *cell = 
           [tableView dequeueReusableCellWithIdentifier:@"EventsSentCell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] 
                            initWithStyle:UITableViewCellStyleDefault   
                          reuseIdentifier:@"EventsSentCell"];
      }
    
  6. 在 EventsSentCell.m 中,触发您的初始化代码-awakeFromNib

您的初始化代码:

    leftSwipe = [[UISwipeGestureRecognizer alloc] init];
    leftSwipe.direction= UISwipeGestureRecognizerDirectionLeft;
    [leftSwipe addTarget:self action:@selector(swipedLeft)];
    [self addGestureRecognizer:leftSwipe];

将按原样工作。

您会收到UILongPressGestureRecognizer:...对您的 gestureRecogniser 委托方法的响应,因为这是 Apple 提供的内置手势识别器,它的委托设置为单元格。当您的代码正常工作时,如果您还将手势识别器的委托设置为单元格 ( leftSwipe.delegate = self),您可能会看到类似的日志UISwipeGestureRecognizer:...

它还注意到 UILongPressGestureRecognizer 的视图不是单元格,而是单元格的contentView. 这是您的单元格视图层次结构的超级视图,您应该将所有单元格的内容附加到该超级视图。虽然您的手势识别器在您将其附加到单元格时可以工作,但我建议您在此处关注 Apple:

        [self.contentView addGestureRecognizer:leftSwipe];

然后手势将正确地遵循单元格的视图层次结构。

于 2013-07-21T11:21:43.847 回答