如何实现SegmentedControlValueChange来控制容器视图

我的问题是追踪别人的问题 。 在@ritch提供的问题中,他有以下视图控制器

"View Controller" -> (Container View)"View Controller" ->["First Controller", "Second Controller"] 

对于我的问题,我会把它们改写成

 "Parent Controller" -> (Container View)"Child Controller" ->["First Controller", "Second Controller"] 

所以我正在尝试实施该方法

 - (IBAction)SegmentedControlValueChange:(UISegmentedControl *)sender { } 

逻辑上,我认为这个方法应该在“父控制器”,而作为参考,在“子控制器”我应该有displayContentController

 FirstController *firstController = [self.storyboard instantiateViewControllerWithIdentifier:@"yourIdentifier"]; 

有人请为我澄清:SegmentedControlValueChange和instantiateViewControllerWithIdentifier之间:

  • 什么代码在“父控制器”的H和M文件?
  • 什么代码在“父控制器”的H和M文件?

最后,我采取了一个不同的方法来解决我在问题中提到的问题,因为我觉得使用故事板标识符有点“丑陋”,并且不正确,因为视图中没有任何细节。

所以这就是我所做的:

我开始通过创build用于将在容器视图中显示的视图控制器的XIB文件的类。 (如FirstController,SecondController等)

然后我把它放在ViewController的ViewDidLoad方法中(父视图控制器 – 具有分段控件的控件)

 - (void)viewDidLoad { [super viewDidLoad]; // First Controller self.firstViewController = [[FirstViewController alloc] init]; // Second Controller self.secondViewController = [[SecondViewController alloc] init]; // Add the controllers to an Array self.controllers = @[self.firstViewController, self.secondViewController]; // Set the container to show the first view controller on load [self displayContentController:[self.controllers firstObject]]; } 

然后我设置了三个方法来处理容器视图的显示和隐藏视图

 - (void)displayContentController:(UIViewController *)content { [self addChildViewController:content]; content.view.frame = [self frameForContentController]; [self.view addSubview:content.view]; [content didMoveToParentViewController:self]; // Set current controller self.currentController = content; } - (void)hideContentController: (UIViewController*)content { [content willMoveToParentViewController:nil]; [content.view removeFromSuperview]; [content removeFromParentViewController]; } - (CGRect)frameForContentController { return self.contentController.frame; } 

最后,我select了不同的分段控制值时处理事件。

 - (IBAction)segmentedControlValueChanged:(UISegmentedControl *)sender { // Hide current view controller [self hideContentController:self.currentController]; // Show new selected view controller [self displayContentController:[self.controllers objectAtIndex:sender.selectedSegmentIndex]]; } 

希望这可以帮助。