我正在尝试向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>)>>
答案 0 :(得分:0)
在回答实际问题之前,请允许我在您的代码中指出其他一些问题。
EventsSentCell *cell = [[EventsSentCell alloc] init];
cell = (EventsSentCell *)[nibObjcet objectAtIndex:0];
首先,这两行没有意义。您在没有笔尖的情况下分配和初始化EventSentCell
的实例。执行此操作后,您将覆盖cell
以指向由loadNibNamed:
初始化的实例。您可以将其简化为EventsSentCell = (EventsSentCell *)nibObject[0];
但即使经过这些优化,这仍然不是实施cellForRowAtIndexPath:
的推荐方法。您应该在registerNib:forCellReuseIdentifier:
中使用viewDidLoad
,然后使用
dequeueReusableCellWithIdentifier:forIndexPath:
获取一个单元格,并完全不用自己加载笔尖。
接下来,
@property (nonatomic,strong) IBOutlet UISwipeGestureRecognizer *leftSwipe;
您将此属性声明为IBOutlet
,但您只在代码中设置它(据我所知),更具体地说是init
方法。你可以完全忽略IBOutlet
。
此init
方法可能也是导致问题的原因。使用loadNibNamed
实例化视图时,会调用initWithCoder:
而不是init
。
答案 1 :(得分:0)
您的'init'方法未被调用,因此手势识别器无法设置。
您可以尝试在awakeFromNib
初始化,但无论如何,您的细胞创建看起来都是非常规的。
假设您正在使用带有Xib文件的自定义单元格类,我就是这样做的。
创建EventsSentCell
对象.m和.h文件
创建一个xib文件“EventsSentCell.xib”
在xib文件中,删除默认的顶级视图并将其替换为UITableViewCell(您可以从对象库中拖出一个)。在身份检查器中,将其类更改为EventsSentCell
在你的表viewController的viewDidLoad
...
UINib* EventsSentNib = [UINib nibWithNibName:@"EventsSentCell"
bundle:nil];
[self.tableView registerNib:EventsSentNib
forCellReuseIdentifier:@"EventsSentCell"];
在cellForRowAtIndexPath
方法中:
UITableViewCell *cell =
[tableView dequeueReusableCellWithIdentifier:@"EventsSentCell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:@"EventsSentCell"];
}
在EventsSentCell.m中,从-awakeFromNib
您的初始化代码:
leftSwipe = [[UISwipeGestureRecognizer alloc] init];
leftSwipe.direction= UISwipeGestureRecognizerDirectionLeft;
[leftSwipe addTarget:self action:@selector(swipedLeft)];
[self addGestureRecognizer:leftSwipe];
将按原样运作。
您获得了对您的gestureRecogniser委托方法的UILongPressGestureRecognizer:...
响应,因为这是Apple提供的内置手势识别器,其代理设置为单元格。当您的代码正常运行时,如果您还将您的手势识别器的委托设置为单元格(leftSwipe.delegate = self
),您可能会看到UISwipeGestureRecognizer:...
同时注意到UILongPressGestureRecognizer的视图不是单元格,而是单元格的contentView
。这是您的单元格视图层次结构的超级视图,您应该将所有单元格的内容附加到该层次结构。虽然您将手势识别器附加到单元格时可以正常工作,但我建议您在此处关注Apple:
[self.contentView addGestureRecognizer:leftSwipe];
然后手势将正确地跟随单元格的视图层次结构。