我遇到了iOS中典型的容器视图问题。我有一个带有两个子视图的ViewController:一个UISegmentedControl和一个容器视图。现在,将我的容器视图放置在情节提要中后,我不确定如何继续。自然地,我认为下一步是将UIContainerView子类化,以完成我在iOS文档中阅读的所有内容。但是没有像UIContainerView这样的类。因此,现在,除了我能够放置在情节提要中的东西之外,我还是被困住了。希望有人能帮助我,我将提出一个简单的方案。

想像:

  • 一个ViewController,带有两个按钮(Cat,Dog)和一个ContainerView。
  • 当用户单击catButton时,ContainerView应该显示CatViewController(对dogButton的操作与此类似)
  • 我已经安装了情节提要的图像。
  • 为简单起见,让CatViewController包含一个带有CAT字的UILabel(对于DogViewController也类似)。
  • ,在情节提要中,我已经将CatViewController和DogViewController创建为两个独立的,不可访问的View Controller。

  • 因此,在这一点上,我该如何进行?由于无法将此类归类为UIContainerView,因此该怎么办?

    我相信这种情况足够简单,有人可以提供示例,但是如果您认为它太复杂了,请提供一个示例来简化这种情况。我只想看看如何完成一个简单的任务。

    附言我已经在StackOverflow上进行过浏览,例如:

    Swapping child views in a container view

    而且我已经阅读了https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html#//apple_ref/doc/uid/TP40007457-CH18-SW6上的文档

    最佳答案

    ios - 如何设置容器 View 以交换两个 child-LMLPHP

    我认为最好使用UISegmentedControl而不是两个UIButton。
    容器视图子视图(_vwContainer.subviews)最初包含CatViewController的视图,该视图会自动实例化。

    //  ViewController.m
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIView *vwContainer;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        _vwContainer.clipsToBounds = YES;
    }
    
    - (IBAction)onSegmentValueChanged:(UISegmentedControl *)sender {
        NSLog(@"Value changed to: %zd",sender.selectedSegmentIndex);
        NSLog(@"BEFORE: self.childViewControllers: %@",self.childViewControllers);
        NSLog(@"BEFORE: _vwContainer.subviews: %@",_vwContainer.subviews);
    
        // set oldVC & newVC
        UIViewController *oldVC = self.childViewControllers.firstObject;
        NSString *strIdNewVC;
        switch (sender.selectedSegmentIndex) {
            case 0:    strIdNewVC = @"catVC";   break;
            default:   strIdNewVC = @"dogVC";
        }
        UIViewController *newVC = [self.storyboard instantiateViewControllerWithIdentifier:strIdNewVC];
    
        //
        [oldVC willMoveToParentViewController:nil];
        [self addChildViewController:newVC];
    
        // Prepare animation transition, for example left to right
        newVC.view.frame = oldVC.view.frame;
        CGPoint pntEnd = oldVC.view.center;
        CGPoint pntInit = pntEnd;
        pntInit.x += oldVC.view.frame.size.width;
        newVC.view.center = pntInit;
    
        [self transitionFromViewController:oldVC toViewController:newVC
                                  duration:0.25 options:0
                                animations:^{
    
                                    newVC.view.center = pntEnd;
    
                                  } completion:^(BOOL finished) {
                                      [oldVC removeFromParentViewController];
                                      [newVC didMoveToParentViewController:self];
                                      NSLog(@"AFTER: self.childViewControllers: %@",self.childViewControllers);
                                      NSLog(@"AFTER: _vwContainer.subviews: %@",_vwContainer.subviews);
                                  }];
    }
    
    @end
    

    09-04 14:01
    查看更多