60

我有一个UITableView作为 my 的子视图UIScrollVIew,这是由 my 控制的主视图MainViewController

在 MainViewController.h

@interface MainViewController : UIViewController <UIGestureRecognizerDelegate, UITableViewDelegate, UITableViewDataSource>

// other stuff here...

@property (weak, nonatomic) IBOutlet UITableView *myTableView;

在 MainViewController.m

@synthesize myTableView;

// other stuff here...

- (void)viewDidLoad {
    myTableView.delegate = self;
    myTableView.datasource = self;
}

// other stuff here...

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
   [self performSegueWithIdentifier:@"listAttributesSegue" sender:self];
}

我知道它didSelectRowAtIndexPath没有被调用,因为我在方法本身和其中的代码行上都设置了断点,并且都没有被调用。我也知道数据源工作正常,因为我有其他函数可以在运行时修改单元格并且它们工作得很好。我正在使用将 iOS 5.0 设置为开发目标的最新 Xcode。我已经搜索并搜索了答案。有人有想法么?

编辑: 我找到了答案。我UITapGestureRecognizer有一套 myTableView 的 superView。这覆盖了选择调用。感谢任何建议这可能是它的人。在我将其标记为正确之前,您的答案已被删除。

编辑2: 很多人对此发表了评论,所以我想分享一下。如果您遇到此问题,只需设置myGestureRecognizer.cancelsTouchInViewfalse,一切正常。

4

14 回答 14

307

我找到了答案。我为 myTableView 的 superView 设置了一个 UITapGestureRecognizer。这覆盖了选择调用。感谢任何建议这可能是它的人。在我将其标记为正确之前,您的答案已被删除。

cancelsTouchesInView在手势识别器上将该属性设置NO为允许表格视图拦截事件。

于 2012-02-12T12:38:36.917 回答
15

为 Swift 3 更新:

如果您在代码中使用了 UITapGestureRecognizer:- # Swift 3 使用以下代码行:

extension YourViewController{
    func hideKeyboardWhenTappedAround() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(YourViewController.dismissKeyboard))
        view.addGestureRecognizer(tap)
        tap.cancelsTouchesInView = false
    }

    func dismissKeyboard() {
        view.endEditing(true)
    }
}

如何调用:- 在 ViewDidLoad()

self.hideKeyboardWhenTappedAround()
于 2017-07-10T06:43:20.800 回答
10

您的问题是区分大小写。你的代码:

- (void)tableVIew:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {

应该

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath {
于 2012-01-21T12:08:50.893 回答
7

您是否为具有相同名称的 tableview 定义了实例变量。如果不是,那么这可能是问题所在-

_myTableView.delegate = self;
_myTableView.datasource = self;

或者-

self.myTableView.delegate = self;
self.myTableView.datasource = self;
于 2012-01-21T12:04:17.650 回答
7

也许这毕竟是一个错字。检查您的函数是否不是didDeselectRowAtIndexPath:de select 而不是 select)。

于 2012-01-21T13:22:48.877 回答
7

我的解决方案是:

  1. 设置cancelsTouchesInViewNo任何 tapGesture

  2. 我在我的自定义单元格中发现, userInteractionEnable设置为 NO,只需删除即可userInteractionEnable = No解决问题。

于 2015-08-12T04:34:21.740 回答
3

取消除必需的视图之外的其他视图。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
    if (touch.view == your view) {
        return YES;
    }
    return NO;
}
于 2016-11-29T06:56:17.520 回答
1

抱歉,没有足够的积分来添加评论 - Garret 的回答很棒,但我会补充:

您仍然可以使用手势识别器,但您需要将“取消视图中的触摸”设置为 NO - 然后手势将传递到视图并且您的 UITableView 将正常工作。

在尝试了很多很多方法之后,这似乎是正确的做事方式:带有“取消触摸视图”的点击手势识别器就像在所有事件之上都有一个不可见的层,它可以抓取所有事件并将它们路由到视图控制器(代理)。视图控制器然后查看手势以查看它是否具有动作绑定(按钮等),并将路由这些和任何剩余的将只是转到手势处理程序。使用 UITableView 时,它期望接收点击,但是当您有“取消视图中的触摸”时,视图控制器会对其进行捕捉。

于 2014-07-08T14:42:02.923 回答
1

我有这个问题有一段时间了,我在这里没有看到任何参考,所以作为参考,另一个原因可能是:

tableView.editing = YES;

tableView.allowsSelectionDuringEditing = NO;

根据文档

- tableView:didSelectRowAtIndexPath:

当表格的编辑属性设置为YES(即表格视图处于编辑模式)时,不会调用此方法。有关与此方法相关的更多信息(和代码示例),请参阅 iOS 表视图编程指南中的“管理选择”。

于 2015-07-17T20:22:06.397 回答
1

我的情况很奇怪。我的 tableView 有 2 个部分。第 1 节的单元格工作正常tableView:didSelectRowAt:,但第 2 节的单元格不会触发didSelectRowAt:

上述问题发生在iPhone 4s, iOS 9.3. 但是在 中iPhone 5s, iOS 10.3,没有问题,这些单元格工作正常。这似乎是iOS 9关于UITableView.

经过多次测试,我发现一行代码产生了这个错误。

tableView.estimatedSectionHeaderHeight = 60.0

因为第二部分没有标题视图。我删除了这条线,一切正常。

于 2017-07-19T09:00:18.330 回答
0

用户可以通过调用“tableView.selectRowAtIndexPath(..)”或“cell.setSelected(true, ...)”来选择一个单元格(点击行)。

  • 如果通过调用“cell.setSelected(true)”选择单元格,则用户不能再取消选择单元格。

  • 如果通过调用“tableView.selectRowAtIndexPath()”选择单元格,用户可以按预期取消选择单元格。

于 2016-09-01T11:40:29.217 回答
0

我有间歇性的 didSelectRowAtIndexPath 故障:在我的自定义单元格印刷机上被调用。

我发现如果我停止经常调用 [tableView reloadData](10 Hz),并将其更改为每 2 秒更新一次,几乎每次按下都会成功调用 didSelectRowAtIndexPath:

似乎重新加载视图块按下。

于 2017-11-17T18:42:31.480 回答
0

我的问题是该单元格是自定义单元格,并且该操作对其不起作用。另外,UITapGestureRecognizer在超类中有一个定义。

首先,设置tapGesture.cancelsTouchesInView = false

    override func viewDidLoad() {
        super.viewDidLoad()
        
        initUI()
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(endEditing))
        tapGesture.cancelsTouchesInView = false
        view.addGestureRecognizer(tapGesture)
    }

其次, isUserInteractionEnabled = true;我没有在表格视图中设置,而是在单元格上设置了操作。

在 ViewDidLoad()

        super.viewDidLoad()
        
        tableView.delegate = self
    }

然后在

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell: UITableView = tableView.dequeueReusableCell(for: indexPath)
        cell.isUserInteractionEnabled = true;

如果您正在创建自定义单元格,则可以尝试此解决方案。

于 2020-06-24T20:16:55.127 回答
-1

这对我有用,你可以试试!

let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) tap.cancelsTouchesInView = false view.addGestureRecognizer(tap)

于 2018-08-24T08:22:10.270 回答