【问题标题】:didSelectRowAtIndexPath: not being calleddidSelectRowAtIndexPath:未被调用
【发布时间】:2012-02-15 16:25:17
【问题描述】:

我有一个UITableView 作为我的UIScrollVIew 的子视图,这是我的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。我已经搜索并搜索了答案。有人有什么想法吗?

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

编辑 2: 很多人都在评论这件事,所以我想分享一下。如果您遇到此问题,只需将 myGestureRecognizer.cancelsTouchInView 设置为 false 即可,一切正常。

【问题讨论】:

  • 你实现tableView:willSelectRowAtIndexPath:了吗?也许它返回 nil 从而阻止didSelectRowAtIndexPath: 调用?
  • 感谢您返回解决方案。我认为将编辑作为答案可能会更好。
  • 我会,但我在提出问题后至少 8 小时内无法回答自己的问题。
  • 我担心其他事件正在吞噬回调过程。这证实并能够修复。谢谢!

标签: iphone ios uitableview didselectrowatindexpath


【解决方案1】:

我的问题是该单元格是自定义单元格,并且该操作对其不起作用。另外,在超类中定义了一个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;

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

【讨论】:

    【解决方案2】:

    对我有用,你可以试试!

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

    【讨论】:

      【解决方案3】:

      我有间歇性的 didSelectRowAtIndexPath 故障:在我的自定义单元按下时被调用。

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

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

      【讨论】:

        【解决方案4】:

        为 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()
        

        【讨论】:

          【解决方案5】:

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

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

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

          tableView.estimatedSectionHeaderHeight = 60.0
          

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

          【讨论】:

            【解决方案6】:

            取消除必需的其他视图触摸。

            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {
                if (touch.view == your view) {
                    return YES;
                }
                return NO;
            }
            

            【讨论】:

              【解决方案7】:

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

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

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

              【讨论】:

                【解决方案8】:

                我的解决办法是:

                1. cancelsTouchesInView设置为任意点击手势的No

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

                【讨论】:

                  【解决方案9】:

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

                  tableView.editing = YES;
                  

                  但是

                  tableView.allowsSelectionDuringEditing = NO;
                  

                  根据文档

                  - tableView:didSelectRowAtIndexPath:
                  

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

                  【讨论】:

                    【解决方案10】:

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

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

                    应该是

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

                    【讨论】:

                    • 这是一个很好的发现,但这个错误只是将我的代码复制到问题中时的拼写错误,它就在我的应用程序中
                    • 第一个“tableView”中的“i”在第一个(错误)版本中大写。
                    【解决方案11】:

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

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

                    【讨论】:

                    • 这对我来说是个问题,我的同事将一个 UITapGestureRecognizer 添加到一个接近根级别的视图中,该视图正在吞噬我的点击事件。然而,令人误解的是,表格单元格在被点击时仍会突出显示,所以我没有怀疑有任何东西在拦截这些事件。
                    • 这也是我的问题。确保检查手势识别器的 cancelsTouchesInView 属性。如果是 YES,那么它会吃掉这个事件。
                    • 非常感谢,真的拯救了我的一天。没有意识到从情节提要添加的 UITapGestureRecognizer 会阻止调用该函数!奇怪的是 UITableViewCells 仍然在 Taps 上突出显示。
                    • 我在单元格类中覆盖了touchesBegantouchesEnded,但我忘记了。感谢您为我节省了大量时间。
                    • 我今天遇到了同样的问题。我在代码中添加了一个 UITapGestureRecognizer (当用户在搜索字段外点击时关闭键盘),这正在吞下水龙头。以下是识别这种情况的方法:您的行突出显示,但 didSelectRowAtIndexPath 仅在您点击、按住、向左或向右滑动手指然后释放时才会触发(因为这不会被识别为点击)。简单的修复:tap.cancelsTouchesInView = NO;
                    【解决方案12】:

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

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

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

                    【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                      • 我将我的代码阅读了 20 次 20 遍,并将其与一本书的文本进行比较,但仍然没有注意到我有“取消”选择!
                      • 当依赖代码补全出错时,只花了一个小时,谢谢你为我节省了更多。
                      【解决方案14】:

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

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

                      或者-

                      self.myTableView.delegate = self;
                      self.myTableView.datasource = self;
                      

                      【讨论】:

                      • 太棒了!搜索这个问题,问题是我没有设置:self.tableView.delegate = self;
                      猜你喜欢
                      • 2010-09-20
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-10-07
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多