Swift删除对视图控制器的引用

时间:2017-03-15 08:42:41

标签: ios swift segue

我正在通过导航控制器以编程方式添加视图控制器,因为我需要在控制器出现时访问导航栏。

我目前通过以下方法执行此操作,但是当用户点按关闭按钮时,我需要能够删除对视图控制器的引用。

let settingsController = storyboard?.instantiateViewController(withIdentifier: "SettingsController") as! SettingsController
            settingsController.view.alpha = 0
            settingsController.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.height)
            self.view.addSubview(settingsController.view)
            UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
                print(self.view.frame.height)
                settingsController.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.height - 142)
                settingsController.view.alpha = 1
            }, completion: nil)

有没有办法可以做到这一点,因为当前的self.dismiss或self.popViewController不起作用?

由于

更新

我尝试使用标准的执行segue(下面)通过提供模态选项来实现此解决方案,因为我需要保持导航栏处于活动状态。设置控制器高度小于视图框架。这没有用,所以我尝试了上述方法。

    self.definesPresentationContext = true
    self.modalPresentationStyle = .overCurrentContext
    self.modalTransitionStyle = .coverVertical
    self.performSegue(withIdentifier: "SettingsSegue", sender: nil)

当我向上调用设置控制器并关闭另一个设置时,控制器会被添加,从而导致多个设置控制器。这是我的问题。

2 个答案:

答案 0 :(得分:1)

var settingsController:SettingsController!

@IBAction func btnNext(_ sender: Any) {
    settingsController  = storyboard?.instantiateViewController(withIdentifier: "SettingsController") as! SettingsController
    settingsController.view.alpha = 1
    settingsController.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.height)
    self.view.addSubview(settingsController.view)
    UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
        print(self.view.frame.height)
        self.settingsController.view.transform = CGAffineTransform(translationX: 0, y: self.view.frame.height - 142)
        self.settingsController.view.alpha = 1
    }, completion: nil)

}

@IBAction func btnDismiss(_ sender: Any) {
        self.settingsController.view.removeFromSuperview()
}

答案 1 :(得分:0)

Once the variable goes out of scope and the view controller is dismissed it should be de-referenced automatically and garbage collected as Swift uses ARC (automatic reference counting)

缩小图像

ARC基本上意味着Swift将跟踪该视图控制器的实例,当它不再使用时,它将取消分配它并将其标记为垃圾收集。

您不需要手动执行任何操作。也许展示一些代码将有助于进一步解释这个问题。

编辑:虽然目前的答案在技术上解决了您的问题。您正在当前视图上添加ViewControllers视图,执行此操作的首选方法是将视图控制器推送到导航堆栈或segue到另一个视图控制器。这样做可确保在不再需要时取消分配视图。使用当前的解决方案,您可以使用导航控制器,而不是按预期使用它。