典型的UITableView无法识别的选择器发送到实例

时间:2011-05-05 07:19:36

标签: objective-c ios selector

我有这个“tableView:cellForRowAtIndexPath:]:无法识别的选择器发送到实例”错误,我几乎可以肯定是某种内存管理问题但是现在我已经厌倦了必须找到这个bug 。 只要不向下滚动,TableView就会显示单元格,如果你这样做的话。 应用程序崩溃。 我使用的唯一属性被称为“地方”,我已经检查过我是否没有错过“自我”。

所以..这是我的代码:

#import "PlacesViewController.h"
#import "FlickrFetcher.h"
#import "SinglePlaceViewController.h"

@implementation PlacesViewController

@synthesize places;

- (NSArray *)places
{
    if (!places) {
        NSSortDescriptor *content = [[NSSortDescriptor alloc] initWithKey:@"_content" ascending:YES];
        NSArray *unsortedPlaces = [FlickrFetcher topPlaces];    
        places = [unsortedPlaces sortedArrayUsingDescriptors:[NSArray arrayWithObjects: content, nil]];
    }
    return places;
}

#pragma mark -
#pragma mark Initialization

#pragma mark -
#pragma mark View lifecycle


- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Top Places";
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}


// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    return YES;
}


#pragma mark -
#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 self.places.count;
}

- (NSDictionary *)placeAtIndexPath:(NSIndexPath *)indexPath
{
    return [self.places objectAtIndex:indexPath.row];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"PlacesTableViewCell";
    NSLog(@"%@", [FlickrFetcher topPlaces]);
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    NSString *location = [[self placeAtIndexPath:indexPath] objectForKey:@"_content"];
    NSArray *splitLocation = [location componentsSeparatedByString:@", "];
    cell.textLabel.text = [splitLocation objectAtIndex:0];
    if (splitLocation.count == 2)
        cell.detailTextLabel.text = [splitLocation objectAtIndex:1];
    if (splitLocation.count == 3)
        cell.detailTextLabel.text = [[[splitLocation objectAtIndex:1] stringByAppendingString:@","] stringByAppendingString:[splitLocation objectAtIndex:2]];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}


#pragma mark -
#pragma mark Table view delegate

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

    // Navigation logic may go here. Create and push another view controller.

    SinglePlaceViewController *spvc = [[SinglePlaceViewController alloc] init];
    // Pass the selected object to the new view controller.
    spvc.placeId = [[self placeAtIndexPath:indexPath] objectForKey:@"place_id"];
    [self.navigationController pushViewController:spvc animated:YES];
    [spvc release];

}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc. that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc {
    [places release];
    [super dealloc];
}


@end

非常感谢你的帮助,我真的很抱歉让你们所有人都为我做了一些工作。

2 个答案:

答案 0 :(得分:0)

您没有提供有关错误的详细信息,所以我只能猜测:

该错误表示获取消息cellForRowAtIndexPath:的对象实际上没有实现此方法。 但是既然你已经实现了它,我能想到的唯一原因就是你在搞乱你的tableView的“dataSource”属性并将它改成你不应该的东西。

确保dataSource是您的PlacecViewController

答案 1 :(得分:0)

从我看来,places属性的getter方法不会保留它返回的值。您将其设置为NSArray方法的sortedArray自动释放实例。我愿意打赌它会在显示你的初始tableview单元后被释放。