3

ラベルと 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

復元プロセス用。

この件に関するいくつかの考え。使用initWithCoderviewDidLoad、子ビューコントローラーを作成し、現在のビューコントローラーをコンテナービューコントローラーの子として追加する場合、復元プロセスの後、現在のビューコントローラーを変更し、必要に応じて交換する必要があります。何が間違っていると思いますか。viewWillAppear現在のViewControllerを追加するために使用する場合、復元プロセスでは正常ですが、このメソッドは複数回呼び出される可能性があります。

復元子ビューコントローラーを復元するには2つの方法があると思います:

  1. インスタンス化して同様viewDidLoadに復元します(ここで見ました - https://stackoverflow.com/a/16647606/2492707-(void)decodeRestorableStateWithCoder:(NSCoder *)coder[self.viewControllerA decodeRestorableStateWithCoder:coder]

  2. -(void)decodeRestorableStateWithCoder:(NSCoder *)coderのように完全に復元self.viewControllerA = [coder decodeObjectForKey: @"AKey"];

どちらの方法が良いですか?

UINavigationController (visibleViewController が設定されている場所) の回復プロセスを理解することも役に立ちます。

前もって感謝します。

4

0 に答える 0