2011-02-10 113 views
2

希望有人能帮助我。单击“后退”按钮时,UINavigationController应用程序崩溃

didSelectRowAtIndexPath方法中,我正在加载和推送详细视图控制器,当您点击详细视图中的“后退”按钮返回到根视图时,应用程序将崩溃。没有错误日志或任何东西。

我95%确定它有一些事情要做的“游乐设施”对象被释放得太早,但无法弄清楚。

感谢您的帮助!

#import "RidesViewController.h" 
#import "RideDetailViewController.h" 
#import "JSON.h" 

@implementation RidesViewController 
@synthesize rides; 

#pragma mark - 
#pragma mark View lifecycle 
- (void)viewDidLoad { 

    [super viewDidLoad]; 

    self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"table-view-background.png"]]; 

    rides       = [[NSDictionary alloc] init]; 

    NSString  *filePath  = [[NSBundle mainBundle] pathForResource:@"rides" ofType:@"JSON"]; 
    NSData   *jsonData  = [NSData dataWithContentsOfFile:filePath]; 
    NSString  *responseString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 

    NSDictionary *results  = [responseString JSONValue]; 

    rides       = [results objectForKey:@"rides"]; 

    [rides retain]; 
} 

#pragma mark - 
#pragma mark Table view data source 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 
} 

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

    return [rides count]; 
} 

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

    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

    cell.textLabel.text  = [[rides valueForKey:@"title"] objectAtIndex:indexPath.row]; 
    cell.accessoryType  = UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
} 

#pragma mark - 
#pragma mark Table view delegate 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

    RideDetailViewController *rideDetailViewController = [[RideDetailViewController alloc] initWithNibName:@"RideDetailViewController" bundle:nil]; 

    NSString  *aTitle   = [[NSString alloc] initWithString:[[rides valueForKey:@"title"] objectAtIndex:indexPath.row]]; 
    NSString  *aImagePath  = [[NSString alloc] initWithString:[[rides valueForKey:@"imagePath"] objectAtIndex:indexPath.row]]; 
    NSString  *aDescription = [[NSString alloc] initWithString:[[rides valueForKey:@"description"] objectAtIndex:indexPath.row]]; 
    NSString  *aVideoPath  = [[NSString alloc] initWithString:[[rides valueForKey:@"videoPath"] objectAtIndex:indexPath.row]]; 

    [rideDetailViewController initWithTitle:aTitle imagePath:aImagePath description:aDescription videoPath:aVideoPath]; 

    [self.navigationController pushViewController:rideDetailViewController animated:YES]; 

    [rideDetailViewController release]; 
    [aTitle      release]; 
    [aImagePath     release]; 
    [aDescription    release]; 
    [aVideoPath     release]; 
} 

#pragma mark - 
#pragma mark Memory management 
- (void)didReceiveMemoryWarning { 

    [super didReceiveMemoryWarning]; 
} 

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


@end 
+2

当你的开发版本的应用程序崩溃,立即打开调试器,看看哪一行代码导致崩溃。然后张贴这段代码在这里,我们可以帮助你......... – Satyam

回答

1

定义您NSString的在你的头,然后将它们放置在cellForRowAtIndexPath:

+0

哪些NSString?aTitle,aImagePath等等或者viewDidLoad中的filePath字符串?我不能在didSelectRowAtIndexPath中使用NSString,因为我需要indexPath.row变量。 –

+0

其实,在你的'cellForRowAtIndexPath:'委托中尝试它们。 – WrightsCS

+0

Awesome这是有效的,我唯一需要做的就是保留每个NSString,而且我还必须添加[self。 tableView reloadData]放在viewDidAppear方法中。 –

1

viewwillapper方法只是剪切从viewdidload粘贴整个事情。

+0

已经尝试过那个:(仍然崩溃。 –

+0

可能我有你的崩溃日志? – GameLoading

+0

没有崩溃日志,它只是崩溃。 –

相关问题