我有一个UIStoryboardSegue
子类,用于用下一个视图控制器替换当前的视图控制器。
由于接口编辑器中有一个Animates
属性,因此我想在子类中访问此属性。
我的代码如下:
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
}
}
答案 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
的层次结构,以便您可以拦截它并执行您的自定义代码,然后再说它由另一个可能实现它的父级(也像拆分视图)一样。