сбой при переключении между viewcontrollers в navigationcontroller?

#iphone #objective-c #ios #xcode

#iPhone #objective-c #iOS #xcode

Вопрос:

во-первых, спасибо stack overflow. я нашел здесь много решений для своих проблем. у меня проблема с моим приложением, оно разбилось при переходе между контроллерами просмотра навигации через определенный промежуток времени.

у меня плохой доступ

     Thread 9 Crashed:
0   libsystem_c.dylib               0x365f3096 __abort   138
1   libsystem_c.dylib               0x365f3006 abort   122
2   libc  abi.dylib                 0x31abbf64 abort_message   40
3   libc  abi.dylib                 0x31ab9346 _ZL17default_terminatev   18
4   libobjc.A.dylib                 0x37fc32dc _objc_terminate   140
5   libc  abi.dylib                 0x31ab93be _ZL19safe_handler_callerPFvvE   70
6   libc  abi.dylib                 0x31ab944a std::terminate()   14
7   libc  abi.dylib                 0x31aba798 __cxa_throw   116
8   libobjc.A.dylib                 0x37fc321c objc_exception_throw   88
9   CoreFoundation                  0x30d73208 -[__NSArrayM insertObject:atIndex:]   180
10  UIKit                           0x32e17abe -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:]   1098
11  UIKit                           0x32e1722c -[UITableView layoutSubviews]   200
12  UIKit                           0x32dbbd22 -[UIView(CALayerDelegate) layoutSublayersOfLayer:]   142
13  CoreFoundation                  0x30d7d224 -[NSObject performSelector:withObject:]   36
14  QuartzCore                      0x324d137a -[CALayer layoutSublayers]   210
15  QuartzCore                      0x324d0f92 CA::Layer::layout_if_needed(CA::Transaction*)   210
16  QuartzCore                      0x324d5114 CA::Context::commit_transaction(CA::Transaction*)   220
17  QuartzCore                      0x324d4e50 CA::Transaction::commit()   308
18  QuartzCore                      0x3251b8ae CA::Transaction::release_thread(void*)   30
19  libsystem_c.dylib               0x365ad6c8 _pthread_tsd_cleanup   164
20  libsystem_c.dylib               0x365ad344 _pthread_exit   116
21  libsystem_c.dylib               0x365bf5c4 pthread_exit   24
22  Foundation                      0x37e40384  [NSThread exit]   4
23  Foundation                      0x37ec45b8 __NSThread__main__   1072
24  libsystem_c.dylib               0x365bbc16 _pthread_start   314
25  libsystem_c.dylib               0x365bbad0 thread_start   0
  

код в RootViewController.m

 //
//  RootViewController.m
//  Q8f
//
//  Created by Abdulaziz Hamdan on 10/26/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "RootViewController.h"
#import "SubCategoryViewController.h"
#import "DestorViewController.h"

@implementation RootViewController
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;

}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.title = NSLocalizedString(@"RootView", @"First");
        self.tabBarItem.image = [UIImage imageNamed:@"first"];
    }
    return self;
}

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

    // Release any cached data, images, etc that aren't in use.
}
-(void)dealloc{
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;
    [category release];
    [cid release];
    category = nil;

    cid = nil;
    [super dealloc];

}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
    if ([[UINavigationBar class]respondsToSelector:@selector(appearance)]) {
        [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"navbar2.png"] forBarMetrics:UIBarMetricsDefault];
    }
[super viewDidLoad];
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"back.png"]];
    category = [[NSMutableArray alloc] init];
    cid = [[NSMutableArray alloc] init];
    [category addObject:@"a"];
    [category addObject:@"b"];
    [category addObject:@"c"];
    [category addObject:@"d"];
    [category addObject:@"e"];
    [category addObject:@"f"];
    [category addObject:@"g"];
    [category addObject:@"h"];
    [cid addObject:@"1"];
    [cid addObject:@"2"];
    [cid addObject:@"3"];
    [cid addObject:@"4"];
    [cid addObject:@"5"];
    [cid addObject:@"6"];
    [cid addObject:@"7"];
    [cid addObject:@"8"];



}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#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 [category 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];
    }

    // Configure the cell...
   /* UIView *backView = [[UIView alloc] initWithFrame:CGRectZero];
    backView.backgroundColor = [UIColor clearColor];
    cell.backgroundColor = [UIColor clearColor];
    cell.backgroundView = backView;
    [backView release];
    */
   // cell.backgroundColor = [UIColor groupTableViewBackgroundColor];
    cell.textLabel.text = [category objectAtIndex:indexPath.row];
    [[cell textLabel] setTextAlignment:UITextAlignmentCenter];
    cell.selectionStyle = UITableViewCellSelectionStyleGray;

    return cell;
}


#pragma mark - Table view delegate

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


    if (indexPath.row > 0) {

        SubCategoryViewController *SubCategoryView = [[[SubCategoryViewController alloc] initWithNibName:@"SubCategoryViewController" bundle:nil] autorelease];
        SubCategoryView.title = [category objectAtIndex:indexPath.row];
        SubCategoryView->cid = [cid objectAtIndex:indexPath.row];

     [self.navigationController pushViewController:SubCategoryView animated:NO];

    }else{

       DestorViewController *DestorView = [[[DestorViewController alloc] initWithNibName:@"DestorViewController" bundle:nil] autorelease];
            DestorView.title = [category objectAtIndex:indexPath.row];
            [self.navigationController pushViewController:DestorView animated:NO];



    }

}

@end
  

в SubCategoryViewController.m

 //
//  SubCategoryViewController.m
//  Q8f
//
//  Created by Abdulaziz Hamdan on 10/26/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "SubCategoryViewController.h"


@implementation SubCategoryViewController
@synthesize cid;
- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

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

#pragma mark - View lifecycle

-(void)dealloc{
    self.tableView.delegate = nil;
    self.tableView.dataSource = nil;
    [cid release];
    cid = nil;
    [xmlParser release];
    [subCate release];
   [hud release];
    hud.delegate = nil;
    xmlParser = nil;
    subCate = nil;
    [super dealloc];



}
- (void)viewDidLoad
{
    [super viewDidLoad];
    xmlParser = [[XMLParser alloc] init];
    subCate = [[subCategory alloc] init];
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"back.png"]];
[NSThread detachNewThreadSelector:@selector(startmethod) toTarget:self withObject:nil];
[self performSelectorOnMainThread:@selector(startIt) withObject:nil  waitUntilDone:FALSE];




    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
- (void)myTask {
    // Do something usefull in here instead of sleeping ...
    // Labels can be changed during the execution
    //HUD.detailsLabelText = @"Something";
    //sleep(3);
}

-(void)stopIt{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    [hud hide:YES];
    cid = nil;

}

-(void)startmethod {
    [xmlParser loadXMLByURL:cid];
    [self.tableView reloadData];
    [self stopIt];


}


-(void)startIt{
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    hud = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:hud];

    hud.delegate = self;
    hud.labelText = @"loading";
    [hud show:YES];



}


- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#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 [[xmlParser list] 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];
    }

    // Configure the cell...


    subCate = [[xmlParser list] objectAtIndex:indexPath.row];

    cell.textLabel.text = [subCate name];
  //  cell.textLabel.numberOfLines = 5; //Change this value to show more or less lines.

    cell.textLabel.textAlignment = UITextAlignmentRight;
    //[[cell textLabel] setTextAlignment:UITextAlignmentCenter];
    //cell.selectionStyle = UITableViewCellSelectionStyleGray;



    return cell;
}

#pragma mark - Table view delegate

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

    subCate = [[xmlParser list] objectAtIndex:indexPath.row];
    if ([[subCate father] isEqualToString:@"1"]) {
      SubCategoryViewController *SubCategoryView = [[[SubCategoryViewController alloc] initWithNibName:@"SubCategoryViewController" bundle:nil] autorelease];
    SubCategoryView.title = [subCate name];
    SubCategoryView->cid = [subCate cid];

    [self.navigationController pushViewController:SubCategoryView animated:NO];
    }else{
      EntryViewController *EntryView = [[[EntryViewController alloc] initWithNibName:@"EntryViewController" bundle:nil] autorelease];
        EntryView.title = [subCate name];
        EntryView->cid = [subCate cid];

        [self.navigationController pushViewController:EntryView animated:NO];



    }


}

@end
  

я надеюсь найти решение здесь.
заранее спасибо.

Комментарии:

1. Не могли бы вы, пожалуйста, опубликовать код или метод, в котором вы получили ошибку…

2. Некоторый код определенно поможет…

3. вы должны опубликовать относительный код, чтобы дать нам некоторое представление.

4. Можете ли вы подробнее задокументировать свой код и вопрос. Вы установили точку останова, вплоть до того места, где выполняется код, вы когда-нибудь вводите код своего SubCategoryViewController ? Вы знаете, что может помочь нам помочь вам.

Ответ №1:

Из вашей трассировки стека я бы предположил, что вы освободили какое-то представление, выпустив неправильный метод текущего цикла вашего UIViewController.

Но без кода это всего лишь предположение.


Это работает? SubCategoryView->cid = [cid objectAtIndex:indexPath.row]; У вас есть свойство SubCategoryView, которое синтезирует cid, почему бы не использовать :
SubCategoryView.cid = [cid objectAtIndex:indexPath.row];

Я знаю, -> что это допустимый оператор для работы со структурой, но SubCategoryView — это класс, я не эксперт в этом операторе, но вы пытались преобразовать это в вызов свойства?