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