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

Posted

技术标签:

【中文标题】Swift 删除对视图控制器的引用【英文标题】:Swift remove reference to view controller 【发布时间】:2017-03-15 08:42:40 【问题描述】:

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

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

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)

当我调用设置控制器并关闭另一个设置控制器时,会添加多个设置控制器。这是我的问题。

【问题讨论】:

嗨,你能粘贴截图吗? 不确定屏幕截图在这种情况下会提供什么,因为它与代码相关。 我不明白你到底需要什么。 更新了问题:) 所以你想关闭设置控制器? 【参考方案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()

【讨论】:

这已经解决了这个问题,除了所有的文本格式都从设置控制器中消失了。我在设置控制器 viewWillAppear 中调用的字体上有字符间距 别介意我以前的 - 只是将间距代码放在视图中加载,一切都很好。感谢您的帮助:) self.settingsController 是否完全删除了对控制器的引用?【参考方案2】:

一旦变量超出范围并且视图控制器被解除,它应该被自动取消引用并垃圾收集,因为 Swift 使用 ARC (automatic reference counting)

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

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

编辑:虽然当前的答案在技术上确实解决了您的问题。您要在当前视图上添加 ViewControllers 视图,这样做的首选方法是将视图控制器推送到导航堆栈或转到另一个视图控制器。这样做可以确保视图在不再需要时被释放。使用您当前的解决方案,您正在处理导航控制器,而不是按预期使用它。

【讨论】:

嘿。下面的代码在用户点击设置按钮时调用的函数内。我试图以模态方式呈现这个,因为我希望导航栏保持在设置控制器的顶部,但事实并非如此。将此选项用作备用选项。 你用什么代码来展示它?您应该能够在导航控制器中以模态方式呈现它,而不会出现任何问题。 在我的问题中添加了初始演示代码。这是我第一次尝试,但导航栏被设置控制器阻止了。 所以您想全屏显示设置控制器而不显示导航栏?您应该在导航控制器中“呈现”任何视图控制器,而不是将其添加为子视图。 我想显示设置控制器并且仍然能够访问导航栏。目前设置控制器位于导航栏上方

以上是关于Swift 删除对视图控制器的引用的主要内容,如果未能解决你的问题,请参考以下文章

带有按钮的表格上的敲除映射和 foreach 数据绑定,缺少对视图模型的引用?

视图模型应该对视图控制器中的事件做出反应吗?

未解决的对视图模型的引用

MVC4学习笔记

对视图修改删除增加属性的sql语句是啥

在同一个类中调用UIButton AddTarget