第一个 UITableViewCell 没有调用 didSelectRowAtIndexPath

Posted

技术标签:

【中文标题】第一个 UITableViewCell 没有调用 didSelectRowAtIndexPath【英文标题】:First UITableViewCell not calling didSelectRowAtIndexPath 【发布时间】:2014-02-27 10:00:25 【问题描述】:

当我选择UITableViewCell 时,发生了最奇怪的事情。

如果我选择第一个,它不会做任何事情,但是当我选择第二个时,它会调用 didSelectRowAtIndexPath 方法,但使用第一个的值。

我应该提一下,我使用的是UIViewController,里面有一个UITableView。我还应该提到我刚刚开始使用ios 7

这是我的代码。

ChannelsPopoverViewController.h

@interface ChannelsPopoverViewController :UIViewController <UITableViewDelegate, UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *channelsTableView;

@end

ChannelsPopoverViewController.m

@implementation ChannelsPopoverViewController


- (void)viewDidLoad

    [super viewDidLoad];
self.channelsTableView.delegate=self;
    self.channelsTableView.dataSource=self;



-(NSInteger) tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section

    return 2;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"new account cell"];
    UIImageView *channelImage=(UIImageView *)[cell viewWithTag:100];
    UILabel *cellLabel=(UILabel *)[cell viewWithTag:101];

    if (indexPath.row==0) 
        channelImage.image=[UIImage imageNamed:@"App-dropbox-icon.png"];
        cellLabel.text=@"add dropbox";
    
    if (indexPath.row==1) 
        channelImage.image=[UIImage imageNamed:@"Google-Drive-icon.png"];
        cellLabel.text=@"add google drive";
    



    return cell;


- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

    UITableViewCell *cell=(UITableViewCell *)[self tableView:tableView cellForRowAtIndexPath:indexPath];
    UILabel *cellLabel=(UILabel *)[cell viewWithTag:101];
    if ([cellLabel.text isEqual:@"add dropbox"]) 
        [[DBSession sharedSession] linkFromController:self];
    



@end

【问题讨论】:

你怎么知道没有加载。尝试添加 NSLog(@"Row: %d", indexPath.row);到 didDeselectRowAtIndexPath:.将 isEqual: 替换为 isEqualToString。 你正在使用 didDeselectRowAtIndexPath 或者没有 didSelectRowAtIndexPath 【参考方案1】:

您使用的是 didDeselectRowAtIndexPath,而不是 didSelectRowAtIndexPath。

【讨论】:

是的,我也遇到过。【参考方案2】:

拳头

[cellLabel.text isEqual:@"add dropbox"]

应该是

[cellLabel.text isEqualToString:@"add dropbox"]

其次

你真的应该在 didSelectRowAtIndexPath 方法中使用indexPath

示例

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (indexPath.row == 0)
    
        [[DBSession sharedSession] linkFromController:self];
    
    ...

【讨论】:

【参考方案3】:

没有调用 didSeletRowAtIndexPath() 的通常原因是您的视图控制器上的 UITapGestureRecognizer 将“取消视图中的触摸”设置为“是”。

正确且唯一明智的解决方法是将“取消视图中的触摸”设置为“否”。那么您的表格行选择应该可以正常工作。

显然,这对您的手势处理程序有一些影响 - 您可能需要向您的手势处理程序添加一些代码以停止对您的视图进行的一些触摸,即

- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender 

    if (sender.view == someOldViewThatINeedToDealWith) 
        sender.cancelsTouchesInView = true;
    

【讨论】:

天哪。我的UITableViewController 的表格视图上确实有一个UITapGestureRecognizer,这样当用户在单元格之外点击时键盘就会被关闭。该死的苹果,我怎么会知道这个?感谢您的帮助。

以上是关于第一个 UITableViewCell 没有调用 didSelectRowAtIndexPath的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 内的 UIButton 没有收到点击?

在没有 Segue 的情况下从 UITableViewCell 打开视图控制器

“UITableViewCell”类型的值?没有会员'委托'

当 UISearchBar 没有结果时在 UITableViewCell 中添加一个按钮(如邮件应用程序)

initwithstyle:reuseIdentifier: 未调用

UITableViewCell 上的 UITextView