双向故事板旅行,无需堆叠

Posted

技术标签:

【中文标题】双向故事板旅行,无需堆叠【英文标题】:Bi-directional storyboard travel without stacking 【发布时间】:2013-11-20 22:37:38 【问题描述】: Push segues 堆栈视图控制器,同时弹出“unstacks”它们。 Modal segues 堆栈视图控制器,同时展开“unstacks”它们。

我正在尝试创建一个自定义 segue,以便在 VC 之间以线性(平面)层次结构在任一方向上移动,而不会在任一方向上堆叠。看起来,在 VC 之间有两个方向的 segue 可以防止被解雇。

有什么想法吗?

【问题讨论】:

您有什么特别的理由不想要这种“堆叠”吗? 每个VC都有图文。堆叠 VC 会导致内存分配过多,并在视网膜设备上崩溃。 【参考方案1】:

如果您不想要任何类型的堆栈,只需让您的 perform 方法将窗口的根视图控制器替换为目标视图控制器。然后源视图控制器将被释放(只要您没有创建对它的任何强引用)。

-(void)perform 
    UIWindow *win =[self.sourceViewController view].window;
    win.rootViewController = self.destinationViewController;

处理旋转和两个方向的更好方法是将容器视图(在 IB 中)添加到第一个控制器(使其成为整个视图的大小),然后从在容器视图中拖动时获得的嵌入式控制器。此代码将嵌入式控制器切换为另一个控制器。

-(void)perform 
    UIViewController *source = self.sourceViewController;
    UIViewController *dest = self.destinationViewController;
    UIViewController *parent = source.parentViewController;
    [parent addChildViewController:dest];
    dest.view.frame = parent.view.bounds;

    [source willMoveToParentViewController:nil];
    [parent transitionFromViewController:source toViewController:dest duration:.6 options:UIViewAnimationOptionTransitionCrossDissolve animations:^
                            completion:^(BOOL finished) 
                                [source removeFromParentViewController];
                                [dest didMoveToParentViewController:parent];
                                [self constrainView:dest.view equalToView:parent.view];
                            ];



-(void)constrainView:(UIView *) childView equalToView:(UIView *) parentView 
    [childView setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:parentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:parentView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
    NSLayoutConstraint *con3 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeWidth relatedBy:0 toItem:parentView attribute:NSLayoutAttributeWidth multiplier:1 constant:0];
    NSLayoutConstraint *con4 = [NSLayoutConstraint constraintWithItem:childView attribute:NSLayoutAttributeHeight relatedBy:0 toItem:parentView attribute:NSLayoutAttributeHeight multiplier:1 constant:0];
    NSArray *constraints = @[con1,con2,con3,con4];
    [parentView addConstraints:constraints];

【讨论】:

谢谢。有趣的是,我仍然在某些 VC 上收到内存警告,但我现在可以在 80 多个 VC 中前后移动,而不会在视网膜设备上崩溃。 @Mat,我不知道那些是关于什么的,但是如果你把日志放在 dealloc 方法中,你会看到当你执行 segue 时每个控制器都被释放了。因此,内存警告一定是由特定控制器中的某些东西引起的。 我非常感谢您提供的简单解决方案。是否可以对 root vew 控制器的这种变化进行动画处理,我正在考虑一个简单的交叉淡入淡出? @Mat,如果你不需要处理旋转,你可以像我的更新那样做。 我将保持横向。谢谢。

以上是关于双向故事板旅行,无需堆叠的主要内容,如果未能解决你的问题,请参考以下文章

故事板无需单击按钮即可应用推送(模态,推送,自定义)

将数据从父 ViewController 传递到子 VC,无需故事板 - Swift 5

通过替换 Windows 根控制器在多个故事板之间移动

如何使用单个故事板uiviewcontroller为多个子类

在多个视图控制器、多个故事板上显示用户输入的文本

在 iOS 应用程序开发中启动图像与故事板