Iphone 如何创建一个UIViewController,其中包含两个视图,根据单击的按钮显示一个或另一个视图

Iphone 如何创建一个UIViewController,其中包含两个视图,根据单击的按钮显示一个或另一个视图,iphone,objective-c,Iphone,Objective C,我对iOS开发还很陌生,我被卡住了。目前,我使用一个选项卡控制器在两个视图控制器(列表和地图视图)之间切换。这使得使用故事板来配置两个视图的外观变得更容易 现在,要求已经改变,应用程序需要一个视图控制器,带有分段控件,单击该控件可以显示列表或地图视图。为了做到这一点,我需要制作一个能够显示列表/地图视图的视图控制器 我理解分段控制器部分是如何工作的,但我只是停留在如何让两个视图在同一区域中显示一个或另一个。 我如何在一个视图控制器中拥有两个视图(如果可能,使用情节提要) 提前谢谢 一个视图控制器

我对iOS开发还很陌生,我被卡住了。目前,我使用一个选项卡控制器在两个视图控制器(列表和地图视图)之间切换。这使得使用故事板来配置两个视图的外观变得更容易

现在,要求已经改变,应用程序需要一个视图控制器,带有分段控件,单击该控件可以显示列表或地图视图。为了做到这一点,我需要制作一个能够显示列表/地图视图的视图控制器

我理解分段控制器部分是如何工作的,但我只是停留在如何让两个视图在同一区域中显示一个或另一个。 我如何在一个视图控制器中拥有两个视图(如果可能,使用情节提要)


提前谢谢

一个视图控制器中不应该有两个主视图,而是需要为每个要显示的视图创建一个视图控制器。但是,您当然可以在单个视图控制器中拥有多个子视图,这可能正是适合您的

有许多方法可以解决这个问题,正确的方法是创建一个容器UIViewController,并将要显示的两个ViewController添加为其子对象,它们只需将视图设置为要显示的视图控制器,但这可能过于复杂了,因为您提到您是iOS开发的新手

因此,一个简单的解决方案(不确定是否可以在故事板中实现这一点-因为我不喜欢它),就是使用一个带有选项卡的视图控制器和主视图的两个子视图,然后您可以通过执行以下操作在视图之间切换:

[self.view addSubview:view1];
//转换

[view1 removeFromSuperview];
[self.view addSubView:view2];
或者,您实际上不需要将其从superview中删除,只需将其隐藏,然后使用
将SubViewToFront
显示所需的视图

如果您想使用另一种方法,我建议您观看这段视频,即名为“实现UIViewController包容”的WWDC 2011视频。另一个问题应该有助于:


希望对您有所帮助。

使用故事板api,您可以在2个ViewController之间切换

 - (void)viewDidLoad {
    [super viewDidLoad];
    UIViewController *viewController = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
    [self addChildViewController:viewController];
    viewController.view.frame = self.contentView.bounds;
    [self.contentView addSubview:viewController.view];
    self.currentViewController = viewController;
}
- (UIViewController *)viewControllerForSegmentIndex:(NSInteger)index {
    UIViewController *viewController;
    switch (index) {
        case 0:
            viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
            break;
        case 1:
            viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
            break;
    }
    return viewController;
}
- (IBAction)segmentChanged:(UISegmentedControl *)sender {
    UIViewController *viewController = [self viewControllerForSegmentIndex:sender.selectedSegmentIndex];
    [self addChildViewController:viewController];
    [self transitionFromViewController:self.currentViewController toViewController:viewController duration:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
        [self.currentViewController.view removeFromSuperview];
        viewController.view.frame = self.contentView.bounds;
        [self.contentView addSubview:viewController.view];
    } completion:^(BOOL finished) {
        [viewController didMoveToParentViewController:self];
        [self.currentViewController removeFromParentViewController];
        self.currentViewController = viewController ;
    }];
    self.navigationItem.title = viewController.title;
}

这是Raywenderlich提到的。希望这对故事板有所帮助,这样做是可能的

  • 创建添加了UISegmentControl和UITableView+UITableViewCell的UIViewController
  • 现在您还需要添加MKMapView,hover,如果您只是尝试将MapView放置在ViewController上,它将作为新的TableView单元格添加,这不是我们想要的
  • 这就是为什么你不应该这样做。相反,MapView必须添加到情节提要的ViewController列表中

     - (void)viewDidLoad {
        [super viewDidLoad];
        UIViewController *viewController = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
        [self addChildViewController:viewController];
        viewController.view.frame = self.contentView.bounds;
        [self.contentView addSubview:viewController.view];
        self.currentViewController = viewController;
    }
    - (UIViewController *)viewControllerForSegmentIndex:(NSInteger)index {
        UIViewController *viewController;
        switch (index) {
            case 0:
                viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
                break;
            case 1:
                viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
                break;
        }
        return viewController;
    }
    - (IBAction)segmentChanged:(UISegmentedControl *)sender {
        UIViewController *viewController = [self viewControllerForSegmentIndex:sender.selectedSegmentIndex];
        [self addChildViewController:viewController];
        [self transitionFromViewController:self.currentViewController toViewController:viewController duration:0.0 options:UIViewAnimationOptionTransitionNone animations:^{
            [self.currentViewController.view removeFromSuperview];
            viewController.view.frame = self.contentView.bounds;
            [self.contentView addSubview:viewController.view];
        } completion:^(BOOL finished) {
            [viewController didMoveToParentViewController:self];
            [self.currentViewController removeFromParentViewController];
            self.currentViewController = viewController ;
        }];
        self.navigationItem.title = viewController.title;
    }
    

  • 将MapView的大小和原点调整为与TableView相同
  • 现在,对于MapView的任一TableView,将Hidden设置为YES,为其创建并合成插座。然后在段内控制值更改方法中执行切换:

    - (IBAction)switchView:(id)sender {
        self.theTableView.hidden = !self.theTableView.hidden;
        self.theMapView.hidden = !self.theMapView.hidden;
    
        if (!self.theTableView.hidden) {
            [self.theTableView reloadData];
        }
    }