Modalviewとして表示され、rootviewcontrollerがFirstViewControllerであるnavigationControllerがあります。ある時点で、navigationControllerのrootviewcontrollerをSecondViewControllerに変更したいと思います。
[self.navigationController initWithRootViewController:SecondViewController];
私がやったことが正しいかどうか、FirstViewControllerがリリースされたかどうかはわかりませんか?
前もって感謝します!
どちらかを行う
[firstViewController.navigationController setViewControllers: [NSArray arrayWithObject: secondViewController]
animated: YES];
または
firstViewController.navigationController.viewControllers = [NSArray arrayWithObject: secondViewController];
ここで、firstViewController
はそれぞれFirstViewController
のインスタンスであり、secondViewController
はSecondViewController
クラスのインスタンスです。後者のバリアントは、アニメーションなしのsetViewControllers:animated:
のショートカットです。
- (void) changeRootViewControllerOFNavigationControlllerAtRuntime:(UIViewController *) viewController {
UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:viewController];
[UIApplication sharedApplication].delegate.window.rootViewController=navController;
}
Swift
fileprivate func changeRootVC() {
if let newVC = self.storyboard?.instantiateViewController(withIdentifier: "MyStoryboardID"), let nc = self.navigationController {
nc.setViewControllers([newVC], animated: true)
}
}
カスタムUINavigationControllerを作成する必要があります
@interface mySwitchRootViewNavigationController()
@property (nonatomic, retain) myFirstViewController * FirstViewController;
@property (nonatomic, retain) mySecondViewController * SecondViewController;
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.FirstViewController = [[myFirstViewController alloc] init];
self.SecondViewController = [[mySecondViewController alloc] init];
}
-(void) setRootViewControllerWithID:(int) viewControllerID
{
if (viewControllerID == 1) {
self.viewControllers = [NSArray arrayWithObject:self.SecondViewController];
} else
{
self.viewControllers = [NSArray arrayWithObject:self.FirstViewController];
}
}
-(void)viewWillAppear:(BOOL)animated
{
[self setRootViewControllerWithID:intVar];
[super viewWillAppear:animated];
}
初期化
mySwitchRootViewNavigationController * switchView = [mySwitchRootViewNavigationController alloc] init];
これは正しい方法ではありません。すでに初期化されたオブジェクトでinit
を呼び出すことはめったにありません(私は考えていません)。
この問題を解決する方法は、UINavigationControllerのサブクラスを作成することです。
このサブクラスでは、initwithrootviewcontroller:
- (id) initWithRootViewController:(UIViewController *)rootViewController
{
UIViewController *fakeController = [[[UIViewController alloc] init] autorelease];
self = [super initWithRootViewController:fakeController];
if(self)
{
self.fakeRootViewController = fakeController;
rootViewController.navigationItem.hidesBackButton = YES;
[self pushViewController:rootViewController animated:NO];
}
return self;
}
FakeRootViewControllerは実際には何もしません。これはiOSでrootviewcontrollerを設定する可能性がないための回避策です。
別の関数(setRootViewController:aViewController)では、新しい「rootviewcontroller」の戻るボタンを非表示にして、偽のrootviewcontrollerがあることをユーザーが見ないようにします。そして、それをfakerootviewcontrollerの上にプッシュします
Poptorootviewcontrollerは、常にスタックのインデックス0ではなくインデックス1にポップするように上書きする必要があります。
ビューコントローラのゲッターを変更して、fakerootviewcontroller(removeobjectatindex: 0
)
お役に立てれば!