双向故事板旅行,无需堆叠
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