从容器视图内的视图将视图推送到导航堆栈?

时间:2014-07-25 09:42:36

标签: ios objective-c uinavigationcontroller uicontainerview

当前设计

我目前在故事板上有一个视图控制器,它有一个嵌入式标签控制器和一个嵌入式导航控件。此视图控件还具有容器视图,该视图显示视图,该视图取决于位于导航栏中的分段控件中选择的值。

Storyboard View

加载容器视图的视图

容器视图的视图是XIB文件(不是基于故事板的),并以编程方式加载:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // First Controller
    self.firstViewController = [[FirstViewController alloc] init];

    // Second Controller
    self.secondViewController = [[SecondViewController alloc] init];

    // Add the controllers to an Array
    self.controllers = @[self.firstViewController, self.secondViewController];

    // Set the container to show the first view controller on load
    [self displayContentController:[self.controllers firstObject]];
}

- (void)displayContentController:(UIViewController *)content
{
    [self addChildViewController:content];
    content.view.frame = [self frameForContentController];
    [self.view addSubview:content.view];
    [content didMoveToParentViewController:self];

    // Set current controller
    self.currentController = content;
}

我面临的问题

我遇到的问题是容器视图的一个视图是一个包含照片的集合视图,我需要能够在选择其中一个单元格时推送包含大尺寸图像的视图。

如何在容器视图内的视图中将视图推送到导航控制器?

2 个答案:

答案 0 :(得分:2)

你的containerViewController是否嵌入了navigationController?

如果是这样,您只需在self.navigationControllerfirstViewController

内拨打secondViewController即可

它会向上遍历parentViewController链,直到达到UINavigationController(或子类) - 然后你会在该navigationController上调用 - pushViewController:animated:

实际上对于您自己的containerController,您还应该为UIViewController提供一个类别,为您的容器添加一个简单的getter:

@interface UIViewController (YourContainer)

    - (YourContainer *)yourContainer;

@end

@implementation UIViewController (YourContainer)

- (YourContainer *)yourContainer
{
    if ([self isKindOfClass:[YourContainer class]]) {
        return (YourContainer *)self;
    }    

    UIViewController *parent = self.parentViewController;

    while (! [parent isKindOfClass:[YourContainer class]] && parent != nil) {
        parent = parent.parentViewController;
    }

    return (YourContainer *)parent;
}

@end

这将为UINavigationControllerUITabBarController提供的childViewControllers提供相同的行为。实际上,如果您查看这些类的标题,您会看到它们也通过UIViewController上的类别提供此功能 - 所以从现在开始,每个childViewController都可以调用self.yourContainer获取对自定义容器的引用,如果未包含在自定义容器中,则为nil。

答案 1 :(得分:0)

history feedback item

之前添加导航控制器

添加导航控制器,

1.选择history feedback item控制器,

2.从`编辑>嵌入> NavigationController如下图:

enter image description here

现在您的手机/照片选择方法使用

[self.navigationController pushViewController:YourUIViewController  animated:YES];