我正在通过导航控制器以编程方式添加视图控制器,因为我需要在控制器出现时访问导航栏。
我目前通过以下方法执行此操作,但是当用户点按关闭按钮时,我需要能够删除对视图控制器的引用。
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)
当我向上调用设置控制器并关闭另一个设置时,控制器会被添加,从而导致多个设置控制器。这是我的问题。
答案 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到另一个视图控制器。这样做可确保在不再需要时取消分配视图。使用当前的解决方案,您可以使用导航控制器,而不是按预期使用它。