2013-02-12 49 views
0

我有一個奇怪的問題 - 當我在cellForRowAtIndexPath方法中註冊TapGestureRecognizer時,它的工作原理非常完美,但是當我在單元的initWithStyle方法中註冊TapGestureRecognizer時,點擊識別不起作用,斷點不會在處理程序中命中。TapGestureRecognizer無法在自定義TableViewCell中工作

以下的作品。

我已經創建了具有相應xib文件的自定義表格視圖單元並註冊了它。

[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" 
               bundle:[NSBundle mainBundle]] 
     forCellReuseIdentifier:@"cell"]; 
... 

and in the cellForRowAtIndexPath 
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
... 
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self 
                      action:@selector(didTapCell:)]; 
    [tap setNumberOfTapsRequired:1]; 
    [cell addGestureRecognizer:tap]; 

下不起作用

@implementation MyCell 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleCellTap:)]; 
     [tgr setDelegate:self]; 
     [tgr setNumberOfTapsRequired:1]; 
     [tgr setNumberOfTouchesRequired:1]; 

     [self addGestureRecognizer:tgr]; 
     //[self.contentView addGestureRecognizer:tgr]; also doesn't work 
    } 
    return self; 
} 

我可以離開工作的解決方案,但我想通過我的代表對移動手勢識別細胞的初始化和消防水龍頭事件。

爲什麼如果我在單元初始化中註冊識別器,輕拍識別不起作用?

+0

更改此行[tgr setNumberOfTouchesRequired:1];與[tgr setNumberOfTouchesRequired:2] ;,它爲我工作... – 2013-02-12 11:07:27

回答

1

您已註冊特定單元標識符的xib。現在,如果需要的話,tableview會自動實例化一個單元格(當你調用dequeReusableCell時),但initWithStyle:reuseIdentifier方法沒有被調用,所以你的手勢識別器不會被創建/添加。

如果您在使用註冊的xib時需要'init'的東西,請覆蓋您的自定義單元類中的awakeFromNib並將代碼放在那裏。我通常把我的'init'代碼放在一個單獨的方法中,並從initWithStyle和awakeFromNib覆蓋中調用它。

+0

謝謝,作品! – Madman 2013-02-12 13:27:20

2

您確定要撥打initWithStyle:reuseIdentifier嗎? Afaik如果您爲單元格註冊一個筆尖,則必須使用initWithCoder:

在我的項目,我有這個

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 
     pan.delegate = self; 
     self.gestureRecognizers = [NSArray arrayWithObject:pan]; 
    } 
    return self; 
} 

所以我使用的是平移手勢識別器,它由init方法內有效。

+1

謝謝!您的解決方案也是完美的!我給你們兩個投了票,但標記了一個較低的評級。 – Madman 2013-02-12 13:29:22

+0

謝謝!很好的解決方案以及+1 – user577732 2013-02-24 08:34:45

相關問題