IOS 不能觸發didSelectRowAtIndexPath事件的原因
阿新 • • 發佈:2019-02-10
IOS 不能觸發didSelectRowAtIndexPath事件
今天遇到這個問題,在網上找到了答案,紀錄一下
可能原因:
- delegate沒有設定。
- 可能tableview被其他控制元件覆蓋。
- 新增UITapGestureRecognizer手勢識別後,UITableView的didSelectRowAtIndexPath失效,兩者之間手勢發生衝突。
答案:
- 前兩種情況有沒有問題,有的話解決掉,沒有就跳過。
- 如果前兩種情況都不是,那看看是不是你在什麼地方添加了手勢,如果添加了可能原因是:
UITapGestureRecognizer截獲了touch事件,導致didSelectRowAtIndexPath方法無法響應。
查閱了相關文件後找到了一種可行的解決方法:重寫UIGestureRecognizerDelegate中的- (BOOL)gestureRecognizer:(UIGestureRecognizer )gestureRecognizer shouldReceiveTouch:(UITouch )touch方法。
重寫內容如下:
- (void)viewDidLoad
{//註冊手勢的部分程式碼如下:
[super viewDidLoad];
UITapGestureRecognizer *oneTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyBoard)] autorelease];
oneTap.delegate = self;
oneTap.numberOfTouchesRequired = 1;
[self.view addGestureRecognizer:oneTap];
}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
// 輸出點選的view的類名
NSLog(@"%@", NSStringFromClass([touch.view class]));
// 若為UITableViewCellContentView(即點選了tableViewCell),則不截獲Touch事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
再次除錯,這回didSelectRowAtIndexPath響應了,解決UITapGestureRecognizer手勢截獲Touch事件的問題!