didSelectRowAtIndexPath:未被调用

时间:2012-01-21 11:40:05

标签: iphone ios uitableview didselectrowatindexpath

我有一个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没有被调用,因为我已经在方法本身和其中的代码行上设置了断点,并且都没有被调用。我也知道数据源工作正常,因为我有其他功能可以在运行时修改单元格,并且它们工作正常。我使用最新的Xcode和iOS 5.0设置作为开发目标。我搜索并搜索了一个答案。有人有什么想法吗?

修改 我找到了答案。我为myTableView的superView设置了UITapGestureRecognizer。这超出了选择呼叫。相信任何人都认为可能是它。在我将其标记为正确之前,您的答案已被删除。

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

14 个答案:

答案 0 :(得分:283)

我找到了答案。我为myTableView的superView设置了UITapGestureRecognizer。这超出了选择呼叫。相信任何人都认为可能是它。在我将其标记为正确之前,您的答案已被删除。

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

答案 1 :(得分:12)

  

针对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()

答案 2 :(得分:10)

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

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

应该是

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

答案 3 :(得分:7)

您是否为tableview定义了具有相同名称的实例变量。 如果没有,则可能是问题 -

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

或 -

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

答案 4 :(得分:7)

毕竟也许这是一个错字。检查您的功能是否为didDeselectRowAtIndexPath: de 选择而不是选择)。

答案 5 :(得分:5)

我的解决方案是:

  1. cancelsTouchesInView设置为任意tapGesture的No

  2. 我在自定义单元格中找到了userInteractionEnable     NO,只需删除userInteractionEnable = No并解决问题。

答案 6 :(得分:3)

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

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

答案 7 :(得分:1)

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

您仍然可以拥有手势识别器,但是您需要将“取消触摸视图”设置为“否” - 然后手势将被传递到视图,您的UITableView将正常工作。

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

答案 8 :(得分:1)

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

tableView.editing = YES;

但是

tableView.allowsSelectionDuringEditing = NO;

根据

的文档
- tableView:didSelectRowAtIndexPath:
  

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

答案 9 :(得分: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

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

答案 10 :(得分:0)

用户可以选择一个单元格(点击该行),通过调用&#34; tableView.selectRowAtIndexPath(..)&#34;或&#34; cell.setSelected(true,...)。

  • 如果通过调用&#34; cell.setSelected(true)&#34;选择单元格,则用户 不能再取消选择细胞了。

  • 如果通过调用选择了单元格 &#34; tableView.selectRowAtIndexPath()&#34;,用户可以取消选择单元格 预期

答案 11 :(得分:0)

我遇到了didSelectRowAtIndexPath的间歇性失败:在我的自定义单元格按下时被调用。

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

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

答案 12 :(得分: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;

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

答案 13 :(得分:-1)

对我来说这是工作,可以尝试!

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