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

Posted

技术标签:

【中文标题】如何创建一个 UIViewController 具有两个视图,根据单击的按钮显示一个或另一个【英文标题】:How can I create one UIViewController with two views that display one or the other depending on button clicked 【发布时间】:2012-08-27 17:35:04 【问题描述】:

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

现在需求发生了变化,应用程序需要一个视图控制器,该控制器带有一个分段控件,点击后可以显示列表或地图视图。为此,我需要制作一个可以显示列表/地图视图的视图控制器。

我了解分段控制器部分的工作原理,但我只是坚持如何让两个视图显示在同一区域中。 我怎样才能在一个视图控制器中拥有两个视图(如果可能,使用情节提要)?

提前致谢!

【问题讨论】:

【参考方案1】:

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

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

因此,一个简单的解决方案(不确定您是否可以在情节提要中实现它 - 因为我不喜欢它),将有一个视图控制器,带有选项卡和主视图的 2 个子视图,然后您可以通过执行以下操作简单地在视图之间切换:

[self.view addSubview:view1];

//切换

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

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

如果您想使用其他方法,我建议您观看 WWDC 2011 视频,标题为“实施 UIViewController Containment”。这个其他问题应该对:UISegmented control with 2 views

希望对您有所帮助。

【讨论】:

【参考方案2】:

使用 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 的引用。希望这会有所帮助

【讨论】:

【参考方案3】:

使用 Storyboard 可以通过这种方式实现。

    创建 UIViewController 并添加 UISegmentControl 和 UITableView+UITableViewCell。

    现在您还想添加 MKMapView,hoverer,如果您只是尝试将 MapView 放在 ViewController 上,它将被添加为新的 TableView 单元格,这不是我们想要的。

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

    调整MapView的大小和原点与TableView相同。

    现在,为 MapView 的 TableView 设置隐藏为 YES,为它们创建和合成 outlet。然后在Segment control 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];
        
    
    

【讨论】:

以上是关于如何创建一个 UIViewController 具有两个视图,根据单击的按钮显示一个或另一个的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 Swift 中以编程方式创建新的 UIViewController

如何在 swift 中使用 .xib 创建 UIViewController 子类?

如何从 UITableViewCell 按钮单击单独的 UIViewController 创建 UIView?

如何继承 UIViewController 的子类

如何在通用 UIViewController - 通用应用程序中仅为 iPAD 创建 IBOutlet