3

我需要创建带有标签和 2 个状态 A 和 B(每个状态由子视图控制器呈现并相互交换)的自定义容器视图控制器。当父容器创建时,两个子视图控制器都会实例化,并且 currentViewController 默认为 viewControllerA。所以我在容器视图控制器中有这样的东西:

@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

用于恢复过程。

关于这个主题的一些想法。如果使用initWithCoderandviewDidLoad来创建子视图控制器并将当前视图控制器作为子视图添加到容器视图控制器中,那么在恢复过程之后我需要更改当前视图控制器并在必要时交换它,我认为有什么问题。如果viewWillAppear用于添加当前的viewcontroller,那么恢复过程是正常的,但是这个方法可能会被多次调用。

我认为有两种方法可以恢复恢复子视图控制器:

  1. 实例化viewDidLoad并恢复(-(void)decodeRestorableStateWithCoder:(NSCoder *)coder[self.viewControllerA decodeRestorableStateWithCoder:coder]在这里看到了 - https://stackoverflow.com/a/16647606/2492707

  2. 完全恢复-(void)decodeRestorableStateWithCoder:(NSCoder *)coder喜欢self.viewControllerA = [coder decodeObjectForKey: @"AKey"];

哪种方式更好?

了解 UINavigationController (填充了 visibleViewController )的恢复过程也可以帮助我。

提前致谢。

4

0 回答 0