типичен UITableView неразпознат селектор, изпратен до екземпляра

Имам тази грешка „tableView:cellForRowAtIndexPath:]: неразпознат селектор, изпратен до екземпляр“, почти съм сигурен, че това е някакъв проблем с управлението на паметта, но в момента съм доста уморен от намирането на грешката. TableView показва клетките добре, стига да не превъртите надолу, ако го направите... приложението се срива. Единственото свойство, което използвам, се нарича "places", вече проверих дали не съм пропуснал "self.".

така.. ето моят код:

#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

Благодаря ви много за помощта и наистина съжалявам, че ви накарах всички да свършите малко работа за мен.


person pchang    schedule 05.05.2011    source източник
comment
Можете ли да оставите цялата // Configure the cell... част и да превъртите? Знам, че това няма да показва текст, но срива ли се? Моля, публикувайте проследяването на стека и пълния изход на конзолата.   -  person Nick Weaver    schedule 05.05.2011
comment
Какъв клас наследи PlacesViewController? Трябва да прегледате делегата на вашия изглед на маса   -  person Tony    schedule 29.05.2013
comment
Опитахте ли да зададете точка на прекъсване на изключение във вашия проект? Къде се изпраща съобщението? Кой е приемникът?   -  person Jarsen    schedule 29.06.2013


Отговори (2)


Не предоставихте много информация за грешката, така че мога само да предполагам:

Грешката показва, че обектът, който получава съобщението cellForRowAtIndexPath:, всъщност няма внедрен този метод. Но тъй като го внедрихте, единствената причина, за която се сещам, е, че се забърквате със свойството "dataSource" на tableView и го променяте на нещо, което не трябва.

Уверете се, че източникът на данни е вашият PlacecViewController.

person Avi Shukron    schedule 05.05.2011

От това, което ми изглежда, методът getter за вашето свойство places не запазва стойността, която връща. Вие го настройвате на автоматично пуснат екземпляр на NSArray, който получавате от метода sortedArray. Готов съм да се обзаложа, че ще бъде пуснат, след като покаже вашите първоначални клетки за изглед на таблица.

person phoenixeyes    schedule 16.03.2012