我使用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;
完成这些操作后,我的numberOfSectionsInTableView
、numberOfRowsInSection
和cellForRowAtIndexPath
方法都被调用了,我的表看起来就像我想要的那样
我遇到的问题是没有选择行,也没有调用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;