UIStoryboardSegue动画子类中的属性

时间:2018-10-23 08:21:10

标签: ios iphone swift storyboard

我有一个UIStoryboardSegue子类,用于用下一个视图控制器替换当前的视图控制器。

由于接口编辑器中有一个Animates属性,因此我想在子类中访问此属性。

enter image description here

我的代码如下:

class ReplaceSegue: UIStoryboardSegue {

    override func perform() {
        var viewControllers = source.navigationController?.viewControllers.dropLast() ?? []
        viewControllers.append(destination)
        source.navigationController?.setViewControllers(viewControllers.map {$0}, animated: true) // I dont want this `true` to be hardcoded
    }
}

2 个答案:

答案 0 :(得分:2)

根据UIStoryBoardSegue类中的评论

  

segue运行时将在调用+ [UIView setAnimationsAreEnabled:]之前   基于“动画”复选框的值调用此方法   在属性的“属性”检查器中。

因此很明显,您可以使用

来读取“动画”复选框的值。
UIView.areAnimationsEnabled

所以在我的自定义界面中

class MySegue: UIStoryboardSegue {
    override func perform() {
        debugPrint(UIView.areAnimationsEnabled)
    }
}

如果动画复选框为false,则打印unchecked;如果为true,则打印checked:)

所以就您而言

class ReplaceSegue: UIStoryboardSegue {
    override func perform() {
            var viewControllers = source.navigationController?.viewControllers.dropLast() ?? []
            viewControllers.append(destination)
            source.navigationController?.setViewControllers(viewControllers.map {$0}, animated: UIView.areAnimationsEnabled)
    }
}

我希望发生的事情已经清楚了,以防万一您仍然有疑问,这是解释,iOS检查animations复选框的值,并使用它通过设置值为{{1}在调用setAnimationsAreEnabled方法之前,先在接口中设置动画复选框。

因此,当控件到达内部时,可以确保iOS已读取“动画”复选框的值,并使用它来设置perform(),现在要做的就是请setAnimationsAreEnabled进行设置。获取动画值复选框。

因此应该为您提供动画值复选框:)

希望它会有所帮助:)

答案 1 :(得分:0)

您不需要为此的UIStoryboardSegue子类。 The docs声明“在要在视图控制器之间提供自定义过渡的情况下,可以继承UIStoryboardSegue的子类”。这意味着没有动画的替换不是自定义过渡,因此不应使用segue子类。

进行替换的正确方法是使用Show Detail(例如Replace)设置,并在管理子视图控制器的父视图控制器内部实现方法showDetailViewController并替换子视图,例如

@implementation DetailNavigationController

- (void)showDetailViewController:(UIViewController *)vc sender:(id)sender{
    [self setViewControllers:@[vc] animated:NO];
}

如果您不知道,“显示详细信息”序列(在神奇地实例化了目标视图控制器之后)有一个perform方法,该方法只对self调用showDetailViewController,而基本的UIViewController实现会搜索视图控制器层次结构寻找覆盖showDetailViewController的层次结构,以便您可以拦截它并执行您的自定义代码,然后再说它由另一个可能实现它的父级(也像拆分视图)一样。