Как мне сбросить UINavigationController? - PullRequest
6 голосов
/ 23 октября 2009

У меня проблема с UINavigationController.

У меня есть приложение с тремя контроллерами представления, между которыми я переключаюсь, используя функциональность push и pop навигационных контроллеров.

Проблема заключается в следующем: Я стою в контроллере третьего вида и звоню
[self.navigationController popToRootViewControllerAnimated: YES];
это приводит меня к первому контроллеру вида (что именно то, что я хочу), но когда я затем пытаюсь перейти ко второму контроллеру вида, я по какой-то причине оказываюсь в третьем.

Можно ли как-нибудь сбросить навигационный контроллер или я делаю это неправильно?

Вот код, который я использую, чтобы нажать и выдвинуть контроллер навигации:

Следующий код вызывается в корневом контроллере представления, когда пользователь решает запустить камеру.

if(self.cameraViewController == nil)
{
        CollageCameraViewController *camView = [[CollageCameraViewController alloc] init];//WithNibName:nil bundle:[NSBundle mainBundle]];
        self.cameraViewController = camView;
        [camView release];

}
[self.navigationController pushViewController:self.cameraViewController animated:NO];

Следующий код вызывается из CollageCameraViewController (секунда) после того, как пользователь сделал свои фотографии:

if(self.renderView == nil)
{
    CollageRenderViewController *renderViewController = [[CollageRenderViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
    self.renderView = renderViewController;
    [renderViewController release];
}
[self.navigationController pushViewController:self.renderView animated:YES];

Следующий код вызывается из CollageRenderViewController, когда пользователь решает вернуться к основному (корневому) представлению:

[self.navigationController popToRootViewControllerAnimated:YES];

Теперь, если я попытаюсь снова нажать CollageCameraViewController, то вместо этого я попаду в CollageRenderViewController, почему это так?

Ура, Andreas

Ответы [ 2 ]

5 голосов
/ 04 декабря 2012

У меня есть несколько VC в моем стеке в качестве экранов настройки, прежде чем я перехожу на настоящий домашний экран.

Я заставил мою работать так:

HomeViewController *hvc = [[HomeViewController alloc] init];
[self.navigationController pushViewController:hvc animated:YES];
self.navigationController.viewControllers = [[NSArray alloc] initWithObjects:hvc, nil];

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

2 голосов
/ 24 октября 2009

Как только вы попадаете в контроллер корневого представления, он «сбрасывается». Следующим действием с навигационным контроллером должно быть нажатие (или повторное нажатие) соответствующего контроллера представления. Вы не должны пытаться «перемещаться» по стеку.

ОБНОВЛЕНО:

Я создал проект iPhone для навигации, чтобы проверить ваш код, и он работает. Каждое из моих трех представлений имеет одну кнопку, которая отправляет своему контроллеру сообщение IBAction при нажатии.

Вот мой код:

RootViewController.h:

@class SecondViewController;

@interface RootViewController : UIViewController {
    SecondViewController *secondViewController;
}

@property (nonatomic, retain) SecondViewController *secondViewController;

- (IBAction)pushSecondVC;

@end

RootViewController.m:

#import "RootViewController.h"
#import "SecondViewController.h"

@implementation RootViewController

@synthesize secondViewController;

- (IBAction)pushSecondVC {
    if(self.secondViewController == nil)
    {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        self.secondViewController = secondVC;
        [secondVC release];
    }
    [self.navigationController pushViewController:self.secondViewController animated:NO];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"Root View";
}

SecondViewController.h:

#import <UIKit/UIKit.h>

@class ThirdViewController;

@interface SecondViewController : UIViewController {
    ThirdViewController *thirdViewController;
}

@property (nonatomic, retain) ThirdViewController *thirdViewController;

- (IBAction)pushThirdVC;

@end

SecondViewController.m:

#import "SecondViewController.h"
#import "ThirdViewController.h"

@implementation SecondViewController

@synthesize thirdViewController;

- (IBAction)pushThirdVC {
    if(self.thirdViewController == nil)
    {
        ThirdViewController *thirdVC = [[ThirdViewController alloc] initWithNibName:nil bundle:[NSBundle mainBundle]];
        self.thirdViewController = thirdVC;
        [thirdVC release];
    }
    [self.navigationController pushViewController:self.thirdViewController animated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"2nd View";
}

ThirdViewController.h:

#import <UIKit/UIKit.h>

@interface ThirdViewController : UIViewController {
}

- (IBAction)popToRoot;

@end

ThirdViewController.m:

#import "ThirdViewController.h"

@implementation ThirdViewController

- (IBAction)popToRoot {
    [self.navigationController popToRootViewControllerAnimated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @"3rd View";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...