我有一个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
即可,一切正常。
答案 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)
我的解决方案是:
将cancelsTouchesInView
设置为任意tapGesture的No
我在自定义单元格中找到了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)