无法在UITableViewController中选择UITableView的行



我使用storyboard创建了一个应用程序。在其他屏幕中,我直接使用了UITableViewController,并且选择按预期工作。

在这种情况下,我有一个UITableView,它是UIViewController中的几个控件之一。

我的自定义ViewController.h文件有一个类似于下面的定义:

@interface MyViewController : UIViewController <UITableViewDelegate,UITableViewDataSource>
    @property (weak,nonatomic) IBOutlet UITableView *myTableView;
@end

然后在viewDidLoad中,我正在执行以下操作:

_myTableView.delegate = self;
_myTableView.dataSource = self;

完成这些操作后,我的numberOfSectionsInTableViewnumberOfRowsInSectioncellForRowAtIndexPath方法都被调用了,我的表看起来就像我想要的那样

我遇到的问题是没有选择行,也没有调用didSelectRowAtIndexPath方法。

我已经检查了故事板视图中的"选择"是否设置为"单选",我也尝试在viewDidLoad中设置_myTableView.allowsSelection=YES;,但这似乎没有任何区别。

我知道这可能与我的表位于正常视图控制器内有关,但我不知道我错过了什么神奇的步骤来进行选择。

现在我添加了一个变通方法。在cellForRowAtIndexPath中,我为单元格中的每个视图附加了一个UITapGestureRecognizer

for(UIView *view in cell.contentView.subviews){
    [view setUserInteractionEnabled:YES];
    UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRow:)];
    [tap setNumberOfTapsRequired:1];
    [view addGestureRecognizer:tap];
    view.tag = row; // So that I can identify in the handler which row has been tapped
}

然后在处理程序中:

-(void)tapRow:(id)sender{
    UITapGestureRecognizer *gesture = (UITapGestureRecognizer*)sender;
    UIView *myView = (UIView*)gesture.view;
    int row = myView.tag;
    // Handle tap of row here
}

这达到了我所需要的,但我仍然想弄清楚我在行选择方面做错了什么!

确保在表视图的顶部没有其他视图(例如,可能会窃取触摸事件的透明视图)。还要确保为表视图及其所有父视图启用了userInteraction。

我们有时键入了错误的委托调用didSelectRowAtIndexPath,而不是didSelectRowAtIndexPath。是你的情况吗?

我看到你可以在表视图中更新你的内容,这样连接就可以了。我认为函数名有错误。

只是为了测试:用这个(复制、粘贴)替换didSelectRowAtIndexPath函数。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Selected %d",indexPath.row);
}

只是为了防止任何人仍然有这个问题。我刚刚意识到-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath方法不适用于任何设置了敲击手势识别器的视图或子视图。如果您仍然想处理触摸事件,请使用"touchesBegan"功能。`-(void)触摸Began:(NSSet*)触摸withEvent:(UIEvent*)事件{[超级触摸Began:触摸事件:事件];

UITouch*touch=[触摸任意对象];

}`

昨天,当我意识到我没有链接我的委托和表视图的dataSource时,我在两分钟内遇到了与当前项目完全相同的问题。您通过编程实现了它,因此它应该可以工作。对我来说,这是一个委托问题,你可以检查你的属性检查器,以确保一切正常。

在cellForRowAtIndexPath方法中添加此行

cell.userInteractionEnabled=NO;

最新更新