第一个UITableViewCell没有调用didSelectRowAtIndexPath

时间:2014-02-27 10:00:25

标签: ios objective-c uitableview didselectrowatindexpath

当我选择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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

所有的拳头:

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

应该是

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

其次

您应该在 indexPath 方法中使用didSelectRowAtIndexPath

实施例

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

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

答案 2 :(得分:1)

没有调用didSeletRowAtIndexPath()的常见原因是你的viewcontroller上有一个UITapGestureRecognizer,其中“在视图中取消触摸”设置为'YES'。

正确且唯一合理的解决方法是将“在视图中取消触摸”设置为“否”。然后你的表行选择应该很好。

显然这对你的手势处理程序有一些影响 - 你可能需要在你的手势处理程序中添加一些代码来阻止你的观点进行一些触摸,例如。

- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender {

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