使用自定义 Segue 快速切换到和 FromTable ViewController 问题
Posted
技术标签:
【中文标题】使用自定义 Segue 快速切换到和 FromTable ViewController 问题【英文标题】:Swift Switching To and FromTable ViewController Issue Using Custom Segue 【发布时间】:2017-06-29 16:01:03 【问题描述】:我在使用自定义 segue 时遇到了问题。我有两个表视图,我正试图来回切换。当我单击 tableview1 中的单元格时,它应该带我到 tableview2。我在 tableview2 上有一个连接到情节提要出口的按钮。从那里它应该带我回到 tableview1 但每当我按下按钮时,应用程序就会崩溃并出现 BAD_ACCESS 错误。
这是我的自定义 segue 类:
class TableViewSegue: UIStoryboardSegue
override func perform()
scale()
func scale ()
let toViewcontroller = self.destination
let fromViewcontroller = self.source
let containerView = fromViewcontroller.view.superview
let originalCenter = fromViewcontroller.view.center
toViewcontroller.view.transform = CGAffineTransform(scaleX: 0.05, y: 0.05)
toViewcontroller.view.center = originalCenter
containerView?.addSubview(toViewcontroller.view)
UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations:
toViewcontroller.view.transform = CGAffineTransform.identity
, completion: success in
fromViewcontroller.present(toViewcontroller, animated: false, completion: nil) //The application crashes and highlights this line as the error.
)
我已经在我的 tableViewController1 中实现了这个方法:
@IBAction func prepareForUnwind(segue: UIStoryboardSegue)
不确定为什么 tableview2 不关闭。
编辑:问题与需要导航控制器有关。
【问题讨论】:
【参考方案1】:问题是每次执行 segue 时,您都是 presenting
toViewcontroller
。因此,该应用将 table2 在 table1 上呈现,然后尝试再次 在展开时将 table1 over table2 呈现。
修改你的自定义 segue 以检查 - 本质上 - 你要去哪个方向:
class TableViewSegue: UIStoryboardSegue
override func perform()
scale()
func scale ()
let toViewcontroller = self.destination
let fromViewcontroller = self.source
let containerView = fromViewcontroller.view.superview
let originalCenter = fromViewcontroller.view.center
toViewcontroller.view.transform = CGAffineTransform(scaleX: 0.05, y: 0.05)
toViewcontroller.view.center = originalCenter
containerView?.addSubview(toViewcontroller.view)
let fromP = fromViewcontroller.presentingViewController
UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseInOut, animations:
toViewcontroller.view.transform = CGAffineTransform.identity
, completion: success in
// if nil, we are presenting a new VC
if fromP == nil
fromViewcontroller.present(toViewcontroller, animated: false, completion: nil)
else
fromViewcontroller.dismiss(animated: false, completion: nil)
)
注意:这是假设:
-
您不是试图在
UINavigationController
内推送/弹出...您需要添加一些其他检查来处理它。
你只是进入了一个层次,也就是说,你没有展示、展示、展示等等,然后试图放松。
【讨论】:
这是登录应用程序的一部分,所以我对这段代码的问题是,当我调用 segue 时,它会显示第二个表格视图,但随后会立即注销应用程序,因为关闭函数会关闭整个视图,回到登录视图控制器而不是 tableview controller1。你知道如何解决这个问题吗? 您需要更清楚地了解您的 VC 层次结构以及您想要做什么。你最初的问题是“带我回到tableview1”所以我真的不知道你在做什么。 有一个登录 uiviewcontroller 将用户带到 TableVC1。从那里我单击一个单元格并将我带到 tableVC2。如果我调用解除函数,它会解除登录视图控制器而不是 TableVC1。 "将用户带到 TableVC1" ???如何?推到导航控制器上?替换当前的VC?将其显示为 childController / subview?如果您需要比已经获得的更多帮助,您必须清楚如何构建视图控制器。 "...它推送到 tableVC1。没有使用导航控制器..."您只 push 使用导航控制器,因此您的应用程序是不推到表 VC1。登录控制器是否呈现 VC1?如果是这样,您是否希望是这种情况,“登录视图”将永远是您的应用程序的基础/底层视图,而其他所有内容都覆盖在它之上?以上是关于使用自定义 Segue 快速切换到和 FromTable ViewController 问题的主要内容,如果未能解决你的问题,请参考以下文章
在自定义 segue 中使用 destinationViewController 按钮
无法使用自定义 segue 和 Storyboard 调整 UIViewController 的大小
尝试使用 UIViewAnimationOptionTransitionFlipFromLeft 展开自定义 Segue