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

时间:2012-08-27 17:35:05

标签: iphone objective-c

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

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

我理解分段控制器部分是如何工作的,但我只是坚持如何在一个或另一个显示在同一区域中的两个视图。 如何在一个视图控制器中使用两个视图(如果可能,使用故事板)?

提前致谢!

3 个答案:

答案 0 :(得分:7)

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

有很多方法可以解决这个问题,正确的方法是创建一个容器UIViewController,并添加你想要显示的2个viewcontrollers作为其子项,它们只是将视图设置为你想要的视图控制器显示,但这可能会过于复杂,因为你提到你是iOS开发的新手。

因此,一个简单的解决方案(不确定你是否可以在故​​事板中实现它 - 因为我不喜欢它),将是一个视图控制器,带有选项卡,以及主视图的2个子视图,然后你可以通过这样的方式在视图之间切换:

[self.view addSubview:view1];

//切换

[view1 removeFromSuperview];
[self.view addSubView:view2];

或者,您实际上不需要从superview中删除它,只需隐藏它,然后使用bringSubViewToFront来显示您需要的视图。

如果您想使用其他方法,我建议您在WWDC 2011视频标题为“实施UIViewController遏制”的视频中查找此视频。这个问题应该对UISegmented control with 2 views

有用

希望有所帮助。

答案 1 :(得分:4)

使用storyboard api,您可以在2个viewControllers之间切换

 - (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提到的iOS tutorial。希望这有帮助

答案 2 :(得分:0)

使用Storyboard可以这样做。

  1. 使用UISegmentControl和UITableView + UITableViewCell创建UIViewController。
  2. storyboard tableview with segment control http://i39.tinypic.com/dwrn5y.png

    1. 现在你想要添加MKMapView,hoverer,如果你只是尝试将MapView放在ViewController上,它将被添加为新的TableView单元格,这不是我们想要的。
    2. Storyboard mapview added as tableviewcell http://i39.tinypic.com/ix9fu0.png

      这就是你不应该这样做的原因。相反,必须将MapView添加到Storyboard的ViewControllers列表

      MapView added to Stroyboard viewcontroller view http://i42.tinypic.com/33lcqwy.png

      1. 将MapView的大小和原点调整为与TableView相同。
      2. Adjusting size and origin for MapView http://i42.tinypic.com/2vkhnnl.png

        1. 现在,对于MapView的TableView,setHidden为YES,为它们创建和合成出口。然后在Segment控件中Value Changed方法实现切换:

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