кнопка возврата на корневом контроллере uinavigationcontroller

#iphone #objective-c #ipad #uinavigationcontroller

#iPhone #objective-c #iPad #uinavigationcontroller

Вопрос:

У меня есть приложение UINavigationController с корневым контроллером представления, и каждый раз, когда я помещаю контроллер представления в стек. Допустим, стек представляет собой A B C D, где A здесь является контроллером корневого представления. Проблема в том, что когда я нахожусь на контроллере просмотра D и выполняю popToRootViewController, он возвращается к A, но на нем есть кнопка возврата. Когда я нажимаю «Назад», задняя часть просто скользит и исчезает, почему это происходит?

РЕДАКТИРОВАТЬ: на самом деле я подклассирую свой UINavigationController, чтобы я мог установить свой RootViewController следующим образом:

 #import "CustomNavigationController.h"

@implementation CustomNavigationController

@synthesize fakeRootViewController;

//override to remove fake root controller
-(NSArray *)viewControllers {
    NSArray *viewControllers = [super viewControllers];     
if (viewControllers != nil amp;amp; viewControllers.count > 0) {  
NSMutableArray *array = [NSMutableArray arrayWithArray:viewControllers];        
[array removeObjectAtIndex:0];  
    return array;   } 
    return viewControllers; }

//override so it pops to the perceived root
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
    //we use index 0 because we overrided “viewControllers”
    ((UIViewController *)[self.viewControllers objectAtIndex:0]).navigationItem.hidesBackButton = YES;
    return [self popToViewController:[self.viewControllers objectAtIndex:0] animated:animated]; }

//this is the new method that lets you set the perceived root, the previous one will be popped (released)
-(void)setRootViewController:(UIViewController *)rootViewController {
    rootViewController.navigationItem.hidesBackButton = YES;
    [self popToViewController:fakeRootViewController animated:NO];
    [self pushViewController:rootViewController animated:NO]; }

- (void)dealloc {
    self.fakeRootViewController = nil;
    [super dealloc]; }


-(id)initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if(self){
        UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];
        self.fakeRootViewController = fakeController;
        NSMutableArray *array = [NSMutableArray arrayWithArray:[super viewControllers]];
        [array insertObject:fakeController atIndex:0];
        self.viewControllers = array;
    }
    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

/* // Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView { }
*/

/* // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad]; }
*/

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

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

@end
  

ДОПОЛНИТЕЛЬНЫЕ ОБНОВЛЕНИЯ:

Итак, после того, как я установил свой RootViewController, а затем нажал ViewController, а затем попытался вызвать popToRootViewController из этого представления, все работало нормально. Однако, если я нажму другой ViewController после второго, а затем вызову popToRootViewController, теперь я вижу эту странную кнопку возврата в корне.

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

1. Возможно ли, что вы нажимаете A на стек (снова), прежде чем нажимать другие представления в стеке?

2. Если вы попытаетесь подключиться к root, избавиться от дополнительной кнопки «Назад», вернуться в стек и снова подключиться к root, кнопка «Назад» все еще там? Если это не так, это будет означать, что вы помещаете A в стек при инициализации.

3. В качестве проверки работоспособности вы можете перечислить свойство UINavigationController ViewControllers и проверить, какие контроллеры были добавлены в стек. Это решило бы вопрос о том, был ли дополнительный экземпляр A помещен в стек. Указывает ли заголовок кнопки возврата на то, какой это контроллер?

4. извините.. Я пропустил очень важную часть этого, я фактически подклассировал свой собственный UINavigationController, чтобы я мог установить корневой контроллер представления, как указано выше..

Ответ №1:

Я тоже сталкиваюсь с той же проблемой. Итак, в вашем корневом контроллере назначьте leftBarButtonItem равным нулю.

 self.navigationItem.leftBarButtonItem = nil;
  

Если ваш корневой контроллер повторно используется в программе. Затем вам нужно проверить ->

 BOOL needBackBarButton = (1 < [self.navigationController.viewControllers count]) ? YES : NO ; 
if (! needBackBarButton)
{
    self.navigationItem.leftBarButtonItem = nil;
}
  

Для других контроллеров

 if (needBackBarButton)
{
          // Create custom navigationItem here.
}
else 
{
    self.navigationItem.leftBarButtonItem = nil;
}
  

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

1. но тогда как мне сделать кнопку возврата для тех, которые мне нужны?

2. Вам не нужно думать о других контроллерах. Вы просто добавляете self.navigationItem.leftBarButtonItem = nil; это в методе viewDidLoad вашего корневого Viewcontroller viewDidLoad. Я надеюсь, что это должно решить вашу проблему.

3. У меня это было, и это ничего не изменило