NavigationControllers具有ViewController堆栈来管理和限制动画过渡.
将视图控制器作为子视图添加到现有视图控制器需要将事件传递给子视图控制器,这很难管理,几乎没有烦恼,并且通常在实现时感觉像是一个糟糕的黑客(Apple也建议不要这样做).
呈现模式视图控制器再次将视图控制器放在另一个上面,虽然它没有上面描述的事件传递问题,但它并没有真正"交换"视图控制器,而是堆叠它.
故事板仅限于iOS 5,几乎是理想的,但不能在所有项目中使用.
有人可以在没有上述限制的情况下更改视图控制器的方式提供一个SOLID代码示例,并允许它们之间的动画过渡?
一个接近的例子,但没有动画: 如何在没有导航控制器的情况下使用多个iOS自定义视图控制器
编辑:导航控制器使用很好,但需要动画过渡样式(不仅仅是幻灯片效果),显示的视图控制器需要完全交换(不是堆叠).如果第二个视图控制器必须从堆栈中删除另一个视图控制器,那么它的封装不够.
编辑2:iOS 4应该是这个问题的基本操作系统,我应该在提到故事板时澄清(上图).
在WWDC 2012会议上标题为iOS上的视图控制器的演变, - (void)willMoveToParentViewController:(UIViewController *)parent并且- (void)didMoveToParentViewController:(UIViewController *)parent已经提到在视图转换的自定义容器实现中使用.
如果我没有弄错的话,似乎需要在之前或之后明确地调用这些方法- (void)removeFromSuperview- (void)addSubview:(UIView *)view
但是,当我在子类实现中记录它们时,它表明它们被称为IMPLICITLY.他们已经被自动调到了正确的位置.
所以,如果真的需要明确调用这些方法,就像在WWDC会话中指示的那样,我有点困惑,或者可以不遵循它并清除不必要的代码行.
假设我有一个自定义容器视图控制器(MainViewController),我在这里执行以下操作:
- (void)viewDidLoad
{
[super viewDidLoad];
HomeViewController *homeVC = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
[self addChildViewController:homeVC];
[self.view addSubview:homeVC.view];
}
Run Code Online (Sandbox Code Playgroud)
HomeViewController将有一个按钮,例如"go",按下时需要前进到下一个视图控制器.所以我需要通知MainViewController这个动作.做这个的最好方式是什么?
我正在使用自定义容器,因为我需要在视图控制器之间进行自定义转换.当按下"go"时,HomeViewController上的一些视图将动画,而新视图控制器的视图将动画到位.
显然,我可以给HomeViewController一个MainViewController类型的属性,并以这种方式进行调用,但我希望有一个更简洁的方法与容器视图控制器API.
uiviewcontroller parentviewcontroller ios childviewcontroller
我需要在另一个顶部添加一个新视图(w/ViewController).用户暂时与此新视图交互,然后我想删除它.在较旧版本的Xcode中,我能够将其添加为子视图.我现在收到一个EXC_BAD_ACCESS错误.
我不希望将添加的视图作为模态.我需要通过添加的视图查看原始背景.我已经阅读了很多关于新的自定义containerViews,addChildView和presentView的内容.我看不出其中任何一个都是明确的答案.
这是以前工作的旧代码 - 主ViewController中的Action:
-(IBAction)showWhiteView:(id)sender
{
WhiteViewController *whiteView = [[WhiteViewController alloc] initWithNibName:@"WhiteViewController" bundle:nil];
[self.view addSubview:whiteView.view];
}
Run Code Online (Sandbox Code Playgroud)
在添加的视图中删除它的操作:
-(IBAction)removeView:(id)sender
{
[self.view removeFromSuperview];
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
也许一个VISUAL EXAMPLE将有助于解释 - 假设主视图是海洋,动画波浪和云移动由MainView控制器控制.用户点击了一些东西,我想在主视图中添加一条船(WhiteView).我希望用户与船进行交互:点击这里帆打开,点击那里锚点等等(需要WhiteViewController的方法)最终我想从海洋中移除船.
谢谢Tim - 新增代码:
-(IBAction)showWhiteView:(id)sender
{ WhiteViewController *whiteView = [[WhiteViewController alloc] initWithNibName:@"WhiteViewController" bundle:nil];
[self addChildViewController:whiteView];
[whiteView didMoveToParentViewController:self];
[self.view addSubview:whiteView.view]; }
Run Code Online (Sandbox Code Playgroud)
并在WhiteViewController中删除:
-(IBAction)removeView:(id)sender
{ [self.view removeFromSuperview];
[self removeFromParentViewController]; }
Run Code Online (Sandbox Code Playgroud)
我期待着有关改善这一点的任何进一步建议.谢谢大家!
我有一个UIViewController(DetailViewController),它包含一个顶部的导航栏和一个覆盖屏幕其余部分的UIView.是否可以使用除DetailViewController之外的UIViewController来控制UIView?
我有一种情况,其中子视图控制器正在尝试显示多个视图控制器,并且在执行该子视图控制器时需要从父视图控制器访问播放暂停操作方法.如何实现暂停音频播放器,暂停计时器和暂停层的播放暂停动作方法:self.view.layer并在父视图控制器中定义,可以由childviewcontroller使用.
我将非常感谢各种帮助来解决这个问题.
谢谢