我对 iOS 开发很陌生,我被困住了。目前我正在使用一个选项卡控制器在两个视图控制器(列表和地图视图)之间切换。这使得使用故事板配置两个视图的外观变得更加容易。
现在需求发生了变化,应用程序需要一个视图控制器,该控制器带有一个分段控件,单击时可以显示列表或地图视图。为此,我需要制作一个可以显示列表/地图视图的视图控制器。
我了解分段控制器部分的工作原理,但我只是坚持如何让两个视图显示在同一区域中。我怎样才能在一个视图控制器中拥有两个视图(如果可能,使用情节提要)?
提前致谢!
我对 iOS 开发很陌生,我被困住了。目前我正在使用一个选项卡控制器在两个视图控制器(列表和地图视图)之间切换。这使得使用故事板配置两个视图的外观变得更加容易。
现在需求发生了变化,应用程序需要一个视图控制器,该控制器带有一个分段控件,单击时可以显示列表或地图视图。为此,我需要制作一个可以显示列表/地图视图的视图控制器。
我了解分段控制器部分的工作原理,但我只是坚持如何让两个视图显示在同一区域中。我怎样才能在一个视图控制器中拥有两个视图(如果可能,使用情节提要)?
提前致谢!
您不应该在单个视图控制器中有两个主视图,而是需要为每个要显示的视图创建一个视图控制器。但是,您当然可以在单个视图控制器中拥有多个子视图,这可能对您有用。
有很多方法可以解决这个问题,正确的方法是创建一个容器 UIViewController,并将您要显示的 2 个视图控制器添加为其子项,它们只需将视图设置为您要显示的视图控制器,但这可能会过于复杂,因为您提到您是 iOS 开发的新手。
因此,一个简单的解决方案(不确定您是否可以在情节提要中实现这一点 - 因为我不喜欢它),将有一个带有选项卡的单个视图控制器,以及主视图的 2 个子视图,然后您可以简单地切换通过执行以下操作在视图之间:
[self.view addSubview:view1];
//换成
[view1 removeFromSuperview];
[self.view addSubView:view2];
或者,您实际上并不需要将其从超级视图中删除,只需将其隐藏,然后用于bringSubViewToFront
显示您需要的视图。
如果您想使用其他方法,我建议您观看此视频,即 WWDC 2011 视频,标题为“实现 UIViewController Containment”。这个其他问题应该对:UISegmented control with 2 views有用
希望有帮助。
使用情节提要 api,您可以在 2 个视图控制器之间切换
- (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 教程。希望这可以帮助
使用 Storyboard 可以通过这种方式实现。
这就是为什么你不应该这样做。相反,必须将 MapView 添加到 Storyboard 的 ViewControllers 列表中
现在,为 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];
}
}