ラベルと 2 つの状態 A と B を持つカスタム コンテナー ビューコントローラーを作成する必要があります (各状態は子ビューコントローラーによって提示され、互いに交換されます)。親コンテナが作成され、 currentViewController がデフォルトで viewControllerA になると、両方の子ビューコントローラがインスタンス化されます。だから私はコンテナviewcontrollerでこのようなものを持っています:
@property(weak, nonatomic) id currentViewController;
@property(strong, nonatomic) id viewControllerA;
@property(strong, nonatomic) id viewControllerB;
@property(strong, nonatomic) UILabel* label;
...
// Question here
- (void)viewDidLoad
{
[super viewDidLoad];
self.viewControllerA = [ViewControllerA new];
self.viewControllerB = [ViewControllerB new];
self.currentViewController = self.viewControllerA;
[self populateCurrentViewController];
}
- (void)populateCurrentViewController
{
[self addChildViewController:self.currentViewController];
[self.view addSubview:self.currentViewController.view];
[self.currentViewController didMoveToParentViewController:self];
}
- (void)goToState: (UIViewController*)stateController
{
if(self.currentViewController != stateController)
{
[self.currentViewController willMoveToParentViewController:nil];
[self addChildViewController:state];
[self transitionFromViewController: self.currentViewController toViewController: stateController
duration: 0.25 options:UIViewAnimationOptionTransitionFlipFromLeft
animations:nil
completion:^(BOOL finished) {
[self.currentViewController removeFromParentViewController];
[stateController didMoveToParentViewController:self];
}];
}
}
- (void)goToStateA
{
[self goToState: self.viewControllerA];
self.label.text = @"A";
}
- (void)goToStateB
{
[self goToState: self.viewControllerB];
self.label.text = @"B";
}
コンテナー ビューコントローラーの状態を保持する必要があります。問題は、最初にコンテナーのビューコントローラーを作成するときと復元プロセスで、子のビューコントローラーをインスタンス化して追加する必要がある場所ですか? 子ビューコントローラーをどこに復元する必要がありますか?
多くの候補が見つかりました:
-(void)initWithCoder
-(void)awakeFromNib
-(void)viewDidLoad
-(void)viewWillAppear
と
-(void)decodeRestorableStateWithCoder
復元プロセス用。
この件に関するいくつかの考え。使用initWithCoder
しviewDidLoad
、子ビューコントローラーを作成し、現在のビューコントローラーをコンテナービューコントローラーの子として追加する場合、復元プロセスの後、現在のビューコントローラーを変更し、必要に応じて交換する必要があります。何が間違っていると思いますか。viewWillAppear
現在のViewControllerを追加するために使用する場合、復元プロセスでは正常ですが、このメソッドは複数回呼び出される可能性があります。
復元子ビューコントローラーを復元するには2つの方法があると思います:
インスタンス化して同様
viewDidLoad
に復元します(ここで見ました - https://stackoverflow.com/a/16647606/2492707)-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
[self.viewControllerA decodeRestorableStateWithCoder:coder]
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
のように完全に復元self.viewControllerA = [coder decodeObjectForKey: @"AKey"];
どちらの方法が良いですか?
UINavigationController (visibleViewController が設定されている場所) の回復プロセスを理解することも役に立ちます。
前もって感謝します。