Segue 转换到错误的页面 Swift Xcode
Segue transitions to the wrong page Swift Xcode
我正在尝试创建一系列使用自定义 segues 协同工作的页面。在我让它们在某个系列中执行之前,这些 segue 工作正常。从 VC1 我通过默认模式转场转到 VC2(它在原始转场上弹出)。然后,从 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)
})
}
}
展开水平 Segue:
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
应始终在将视图带入用户屏幕时触发。
之后,在您的自定义 UIStoryBoardSegue
中登录 dst
。如果那是 VC2 的一个实例,那么您只是推错了视图控制器。
我还看到您在 UIStoryboardSegue
中使用了 src.present
和 src.dismiss
。这意味着您实际上并不是在推送视图,而是向它们展示活动视图控制器的 "on top"。尝试重新考虑该逻辑,因为这很可能是问题所在。
我宁愿尝试推动视图控制器(通常,而不是 'presenting' 它们)并更改 UIStoryboardSegue
外观以伪造动画,如果那是你想要的。
我正在尝试创建一系列使用自定义 segues 协同工作的页面。在我让它们在某个系列中执行之前,这些 segue 工作正常。从 VC1 我通过默认模式转场转到 VC2(它在原始转场上弹出)。然后,从 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)
})
}
}
展开水平 Segue:
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
应始终在将视图带入用户屏幕时触发。
之后,在您的自定义 UIStoryBoardSegue
中登录 dst
。如果那是 VC2 的一个实例,那么您只是推错了视图控制器。
我还看到您在 UIStoryboardSegue
中使用了 src.present
和 src.dismiss
。这意味着您实际上并不是在推送视图,而是向它们展示活动视图控制器的 "on top"。尝试重新考虑该逻辑,因为这很可能是问题所在。
我宁愿尝试推动视图控制器(通常,而不是 'presenting' 它们)并更改 UIStoryboardSegue
外观以伪造动画,如果那是你想要的。