ios - 使用自定义 Segue 快速切换到和从 Table ViewController 问题

标签 ios xcode uitableview swift3 uistoryboardsegue

我在使用自定义转场时遇到了问题。我有两个 tableviews,我试图从中来回切换。当我单击 tableview1 中的单元格时,它应该将我带到 tableview2。我在 tableview2 上有一个按钮连接到 Storyboard的导出。从那里它应该带我回到 tableview1 但每当我按下按钮时,应用程序就会崩溃并出现 BAD_ACCESS 错误。

这是我的自定义转场类:

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 没有关闭。

编辑:问题与需要导航 Controller 有关。

最佳答案

问题在于,每次执行 Segue 时,您都会呈现 toViewcontroller。因此,应用将显示 table2 覆盖 table1,然后再次尝试在展开时显示 table1 覆盖 table2。

修改您的自定义转场以检查 - 本质上 - 您要去哪个方向:

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)
            }

        })
    }

}

注意:这是假设:

  1. 没有尝试在UINavigationController中推送/弹出...您需要添加一些其他检查来处理该问题。
  2. 您只会进入一级,也就是说,您不会演示、演示、演示等等,然后然后尝试放松。

关于ios - 使用自定义 Segue 快速切换到和从 Table ViewController 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44830044/

相关文章:

ios - 在 iOS Core Audio 中——查找 OSStatus 错误的最佳方式是什么(即 -43?)

ios - 如何快速在 CSPageMenuOption 中添加菜单选项的侧面和上边框

ios - 比特码和企业发行

objective-c - 如何获取 UITableViewCell 的矩形大小?

ios - 栏按钮项目未显示

ios - 符合 AVAudioPlayerDelegate

html - Xcode模拟器,HTML网页发送短信链接无效,为什么?

ios - 查找 iOS 上每个外部库贡献的大小

ios - 使用动态单元格高度时将表格 View 滚动到底部

ios - Realm 未正确删除