使用自定义 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

在自定义 segue 中使用 destinationViewController 按钮

自定义 Segue 中的 CATransition

未触发自定义 segue 的展开

无法使用自定义 segue 和 Storyboard 调整 UIViewController 的大小

尝试使用 UIViewAnimationOptionTransitionFlipFromLeft 展开自定义 Segue