我正在尝试创建一系列的页面,这些页面使用自定义段协同工作。在我让他们在一个特定的系列中执行之前,这些片段工作得很好。从VC1开始,我通过默认模式segue转到VC2(它在原始segue上弹出)。然后,从VC2转到VC3,使用自定义水平段(下面的代码)。最后,我从VC3返回到VC1,使用自定义的水平放卷段。问题是当我回到VC1时,VC2出现了。我检查了ViewDidLoad,当它出现时,它不会在VC2中执行,但是当它被触发时,我仍然可以与它交互。我对正在发生的事情的最佳猜测是VC2覆盖了VC1,所以当我回到VC1时,VC2显示在它上面。即使这是个问题,我也不知道怎么解决。代码如下:
水平段:
class HorizontalSegue: UIStoryboardSegue {
override func perform() {
let src = self.source as UIViewController
let dst = self.destination as UIViewController
src.view.superview?.insertSubview(dst.view, aboveSubview: src.view)
dst.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseOut], animations: {
dst.view.transform = CGAffineTransform(translationX: 0, y: 0)
},
completion: { finished in
src.present(dst, animated: false, completion: nil)
})
}
}
展开水平段:
class UnwindHorizontalSegue: UIStoryboardSegue {
override func perform() {
let src = self.source as UIViewController
let dst = self.destination as UIViewController
src.view.superview?.insertSubview(dst.view, belowSubview: src.view)
src.view.transform = CGAffineTransform(translationX: 0, y: 0)
UIView.animate(withDuration: 0.2, delay: 0.0, options: [.curveEaseIn], animations: {
src.view.transform = CGAffineTransform(translationX: src.view.frame.size.width, y: 0)
},
completion: { finished in
src.dismiss(animated: false, completion: nil)
})
}
}
最佳答案
我注意到的第一件事是你说的ViewDidLoad
不需要VC2。请查看是否正在调用ViewDidAppear
(或将出现)。ViewDidLoad
仅在加载视图时调用(最初,在视图之前不存在时)。ViewDidAppear
当视图进入用户屏幕时,应始终触发。
之后,在您的自定义dst
中登录UIStoryBoardSegue
。如果这是VC2的一个实例,那么您只是推错了视图控制器。
我也看到你在你的src.present
中使用src.dismiss
和UIStoryboardSegue
。这意味着您实际上不是在推送视图,而是在活动视图控制器的“顶部”显示它们。试着重新思考这个逻辑,因为这很可能是问题所在。
我宁愿尝试推动视图控制器(通常,而不是“呈现”它们)并更改UIStoryboardSegue
外观以伪造动画(如果这是您所追求的)。
关于swift - Segue转换到错误的页面Swift Xcode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57632429/