如何在没有 NavigationController 的情况下推送子 ViewController?

Posted

技术标签:

【中文标题】如何在没有 NavigationController 的情况下推送子 ViewController?【英文标题】:How to push sub-ViewControllers without NavigationController? 【发布时间】:2011-05-22 19:14:06 【问题描述】:

我想将 viewControllers 推送到我的主 viewController 上的一个区域。据我了解,除非您将其添加到 UIWindow,否则您不能使用 NavigationController。

这个动画让人想起 UIScrollView 水平滚动。但我希望它像 NavigationController 一样工作。当用户按下特定操作时,ViewController 将发生变化。

ViewController2 将是一个带有一些其他按钮的 tableView。

ViewController3 将成为从 tableView 更改对象的表单。

【问题讨论】:

【参考方案1】:

我最近在 UIView 中发现了一种方法,它可以创建“推送或弹出”的感觉来切换视图。

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

这直接来自 UIView 文档,因此我建议您查看UIView Class Reference 以了解详细信息。基本上,它将一个视图切换到另一个视图,而 options: 部分可让您从多种不同的样式中进行选择。

【讨论】:

你知道如何用这种方法做一个“幻灯片”吗? @DanyalAytekin 我上次查看时,无法通过幻灯片进行转换,但现在可能有更新的选项适用于 ios 7 架构。 UIViewAnimationOptions 是个不错的地方。也可以覆盖动画并插入您自己的动画,但这可能不是最好的主意,因为它可能会变得混乱。 谢谢@slev。我不认为有一个内置的。我最终编写了一个简单的动画。【参考方案2】:

我实际上是通过玩 UIView 动画解决了这个问题。

-(void)slideInView:(UIView*)newView toView:(UIView*)oldView 
    /* Sets the view outside the right edge and adds it to mainView */
    newView.bounds = mainView.bounds;
    newView.frame = CGRectMake(newView.frame.origin.x + 784, newView.frame.origin.y, newView.frame.size.width, newView.frame.size.height);
    [mainView addSubview:newView];

    /* Begin transition */
    [UIView beginAnimations:@"Slide Left" context:oldView];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDelay:0.0f];
    [UIView setAnimationDuration:0.5f];
    [UIView setAnimationDidStopSelector:@selector(slideInCompleted:finished:context:)];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
    newView.frame = CGRectMake(0,0, newView.frame.size.width, newView.frame.size.height);
    oldView.frame = CGRectMake(oldView.frame.origin.x - 784, oldView.frame.origin.y, oldView.frame.size.width, oldView.frame.size.height);
    [UIView commitAnimations];


-(void)slideInCompleted:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
    UIView *view = (UIView*)context;
    [view removeFromSuperview];

并使用它

menuController = [[MenuViewController alloc] init];
[self slideOutView:menuController.view toView:loginController.view];
[oldController release];

请记住,您已经分配了一个 UIViewController,您需要在使用完毕后释放它!在示例中,我完成了 loginController 并发布它。

【讨论】:

retainCount 没用。不要叫它。 只要你知道怎么用就行。此外,它不应该在那里,谢谢你的通知。 如果你知道如何使用retainCount,你就会知道永远不要使用它。对于极其罕见的情况,总有更好的方法。【参考方案3】:

如果没有UINavigationController,绝对没有办法“推动”本机任何控制器。但是,您可以对视图进行动画处理。

对于您发布的示例,看起来简单的UIScrollView 将是您最简单的选择。

【讨论】:

【参考方案4】:

我会使用 UIScrollView,因为它能够捕捉到内置的“页面”。您也可以使用 setContentOffset:animated: 滚动到任何部分。

【讨论】:

以上是关于如何在没有 NavigationController 的情况下推送子 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章

如何返回根视图控制器

我如何能够推动自己的观点而不必每次都实例化自己

iOS 不向 NavigationController 推送新视图

以编程方式导航到另一个视图控制器/场景

如何在没有引用的情况下复制对象?

如何在没有 createSlice 的情况下使用 createThunkAsync