我有UITableView ...当用户点击行时,会打开另一个屏幕。问题是,有时候,我点击一次,但是有几次调用RowRowAtIndexPath。如何防止?
如何重现这种情况的一个案例是(你甚至可以尝试在原生iPhone设置上重现它):
您将看到蓝色选择在多行上,并且将打开的屏幕是随机的
更新: 在didSelectRow中我刚刚启动了新的控制器,其中viewDidLoad同步开始。 如果要逐步重现我的场景,可以多次启动同步
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
SecondViewController *secondViewController =
[SecondViewController alloc] init];
[self.navigationController
pushViewController:secondViewController animated:YES];
[secondViewController release];
}
答案 0 :(得分:1)
是的,我发现了相同的情况。
然后你可以看到多次调用didSelectRowAtIndexPath方法。
我创建了一个用于测试它的新项目,并且只使用了以下代码。它每次都被复制。
所以我认为这是iOS SDK的错误!
#import "SPViewController.h"
@interface SPViewController ()
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation SPViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 30;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
cell.textLabel.text = [NSString stringWithFormat:@"Test Cell %d", indexPath.row];
return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 66;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%s %@", __FUNCTION__, indexPath);
}
@end