DidSelectRowAtIndexPath 未被调用

Posted

技术标签:

【中文标题】DidSelectRowAtIndexPath 未被调用【英文标题】:DidSelectRowAtIndexPath not being called 【发布时间】:2013-02-15 21:08:20 【问题描述】:

我有 3 个不同的 detailTableView,我的 masterTableView 中的单元格在触摸时会调用它们。

请查看我的 master.m 文件:

#import "GuideTableViewController.h"
#import "GuideDetailTableViewController.h"
#import "GuideDetailTableViewController2.h"
#import "GuideDetailTableViewController3.h"
#import <QuartzCore/QuartzCore.h>

@interface GuideTableViewController ()

    NSMutableData *weatherResponseData;

    NSArray *headGuide;

    NSArray *leftImages;



@property (weak, nonatomic) IBOutlet UITableView *tableView;

@property (weak, nonatomic) IBOutlet UIImageView *imgHeader;

@property (weak, nonatomic) IBOutlet UIImageView *ImgTitle;

@property (weak, nonatomic) IBOutlet UIImageView *ImgWeather;

@property (weak, nonatomic) IBOutlet UIButton *btnMap;

@property (weak, nonatomic) IBOutlet UILabel *LabelWeather;

@property (weak, nonatomic) IBOutlet UILabel *LabelWeather2;

@end

@implementation GuideTableViewController


//Weather method

- (void) loadWeather

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:
                                [NSURL  URLWithString:@"http://api.wunderground.com/api/3919480da5014c98/conditions/q/BR/Sao_Sebastiao .json"]];
    NSURLConnection *theConnection=[[NSURLConnection alloc]
                                initWithRequest:theRequest delegate:self];
    if(theConnection)
        weatherResponseData = [[NSMutableData alloc] init];
     else 
        NSLog(@"failed");
    


//Delegates for WeatherData

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse  *)response

    [weatherResponseData setLength:0];


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

    [weatherResponseData appendData:data];


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    NSString *msg = [NSString stringWithFormat:@"Failed: %@", [error description]];
    NSLog(@"%@",msg);



- (void)connectionDidFinishLoading:(NSURLConnection *)connection

    NSError *myError = nil;
    NSDictionary *res = [NSJSONSerialization JSONObjectWithData:weatherResponseData options:NSJSONReadingMutableLeaves  error:&myError];
    NSArray *results =  [res objectForKey:@"current_observation"];
    NSString *cur = [results valueForKey:@"weather"];
    NSString *tmp = [results valueForKey:@"temperature_string"];
    NSString *wind = [results valueForKey:@"wind_string"];

    NSLog(@"Current conditions: %@, %@º, %@", cur, tmp, wind);

    self.LabelWeather.text = cur;

    self.LabelWeather2.text = tmp;



//JSONmethod

- (void) loadJSON
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
        //code
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://dl.dropbox.com/u/100670549/guide.json"]];

        NSError *error;

        if (data)
         
            headGuide = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];

            for (NSDictionary *dictionary in headGuide)
               // NSLog([dictionary description]);
            

        else
        
             NSLog(@"Could not load data");
        

        dispatch_sync(dispatch_get_main_queue(), ^
             // code

            [self.tableView reloadData];
        );
    );



//Load

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.


    [self loadJSON];
    [self loadWeather];

    leftImages = [NSArray arrayWithObjects:@"btn_Stay.png", @"btn_Eat.png", @"btn_Todo.png", nil];


    // set background
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.jpg"]];

    // rounded corners

    [self.tableView.layer setCornerRadius:9.0];

    [self.ImgWeather.layer setCornerRadius:9.0];



#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    // Return the number of sections.
    return 1;


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

    // Return the number of rows in the section.
    return headGuide.count;


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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];


    NSArray *dict = [headGuide objectAtIndex:indexPath.row];

    cell.textLabel.text = [dict valueForKey:@"title"];

    NSString *cellImage = [leftImages objectAtIndex:indexPath.row];
    UIImage *cellIcon = [UIImage imageNamed:cellImage];

    cell.imageView.image = cellIcon;

    return cell;



- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    if ([segue.identifier isEqualToString:@"whereStay"])
        GuideDetailTableViewController *vc = [segue destinationViewController];
        NSIndexPath *index = sender;
        NSDictionary *dict = [headGuide objectAtIndex:index.row];
        vc.stayGuide = dict;
    
    else if ([segue.identifier isEqualToString:@"whereEat"])
         GuideDetailTableViewController2 *vc1 = [segue destinationViewController];
         NSIndexPath *index = sender;
         NSDictionary *dict = [headGuide objectAtIndex:index.row];
        vc1.eatGuide = dict;
    
    else if ([segue.identifier isEqualToString:@"whatTodo"])
        GuideDetailTableViewController3 *vc2 = [segue destinationViewController];
        NSIndexPath *index = sender;
        NSDictionary *dict = [headGuide objectAtIndex:index.row];
        vc2.todoGuide = dict;
    



#pragma mark - tableView delegate

- (void)tableView:(UITableView *)tableView didselectRowAtIndexPath:(NSIndexPath       *)indexPath
    if(indexPath.row == 0)
        [self performSegueWithIdentifier:@"whereStay" sender:indexPath];
    else if(indexPath.row ==1 )
        [self performSegueWithIdentifier:@"whereEat" sender:indexPath];
    else
         [self performSegueWithIdentifier:@"whatTodo" sender:indexPath];
     

    [tableView setAllowsSelection:YES];


@end

【问题讨论】:

【参考方案1】:

您的方法签名也没有正确大写:

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

应该是

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

方法名称区分大小写。

此外,请确保您将 tableView 的委托设置为

self.tableView.delegate = self;

【讨论】:

就是这样……太容易了,我花了很长时间才发现……可耻。非常感谢@Tim! *** 上的标准程序是单击帮助您将其标记为正确的答案旁边的复选标记。【参考方案2】:

您似乎没有将此对象设置为表格视图的委托。在您的-viewDidLoad 方法中,您应该调用[[self tableView] setDelegate:self];

【讨论】:

是的,情况也是如此。谢谢!【参考方案3】:

tableview 委托和数据源的协议在哪里?

@interface GuideTableViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

//Attributes...
IBOutlet UITableView *tableView;

在 viewDidLoad 中,你应该设置代理:

tableView.delegate = self;
tableView.dataSource = self;

您还可以在 xib 文件中设置委托...

所以您的代表方法应该可以工作...查看有关 tableview 的苹果文档: http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

【讨论】:

以上是关于DidSelectRowAtIndexPath 未被调用的主要内容,如果未能解决你的问题,请参考以下文章

表视图控制器未调用 didSelectRowAtIndexPath

框架中的 UITableViewController 未调用 didSelectRowAtIndexPath

未调用自定义单元格 didSelectRowAtIndexPath

未调用 tableview 上的 Xcode didSelectRowAtIndexPath

在前 5 个单元格后未调用 didSelectRowAtIndexPath

UITableView didSelectRowAtIndexPath 方法未触发