为啥我不能从另一个控制器中删除视图?

Posted

技术标签:

【中文标题】为啥我不能从另一个控制器中删除视图?【英文标题】:Why I cannot remove a view from another controller?为什么我不能从另一个控制器中删除视图? 【发布时间】:2016-02-25 11:18:43 【问题描述】:

在我的 ViewController 的 Storyboard 中,我添加了一个 UIView,然后单击按钮将其 alpha 从 0.0 更改为 1.0:

UIView.animateWithDuration(0.5, delay: 0.5, usingSpringWithDamping: 1.0, initialSpringVelocity: 0.8, options: [.CurveEaseOut], animations: 
        self.blurView.alpha = 1.0
        , completion:  _ in
            self.blurView.addSubview(self.signUpView)
    )

signUpView 是一个 XIB,下面是代码:

class func signUpView() -> UIView 
    return UINib(nibName: "SignUpView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! UIView

现在,我想点击我的 XIB 上的按钮,删除我的 blurView。为此,我这样做:

UIView.animateWithDuration(0.5, delay: 0.1, options: [.CurveEaseOut], animations:  () -> Void in
            self.removeFromSuperview()
            ViewController().blurView!.removeFromSuperview()
        , completion:  _ in
    )

但它什么也不返回。当我也尝试调用 ViewController 函数removeXIB():

func removeXIB() 
    self.blurView.removeFromSuperview()

在我的 SignUpView 类中,它因 self.blurView 等于 nil 的错误而崩溃。

如何解决这个问题并从我的 ViewController 中删除 blurViewSignUpView XIB 类?

【问题讨论】:

【参考方案1】:

ViewController() 为您返回ViewController 类的新实例, 它没有初始化 blurViewspringUpView (这就是为什么当你尝试对 blurView 属性值应用强制解包时崩溃的原因,当它是 nil 时)。

您需要的是一个实例化您的视图的ViewController 的具体实例

顺便说一句,这是管理视图的不好方法。您的视图需要有某种委托,并要求其委托对用户的操作做出反应(在您的情况下从超级视图中删除视图)

【讨论】:

那么,代替ViewController().removeXIB() 使用代表?是吗? @JohnDoe 代替 ViewController() 使用从情节提要实例化的 viewController。 ViewController() 实际上是 ViewController.init() 调用,它创建了 ViewController 类的新实例。委派和其他事情是OOD的问题。 你的意思是这样的:let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") ? 即使我使用var v: ViewController! v.blurView.removeFromSuperview(),它也会返回我fatal error: unexpectedly found nil while unwrapping an Optional value 好吧,我想那你需要阅读更多关于 OOP、swift 和 ios 开发的知识......当你没有足够的知识时,这真的很难继续做事

以上是关于为啥我不能从另一个控制器中删除视图?的主要内容,如果未能解决你的问题,请参考以下文章

View helper 可以在一个控制器中访问,但不能从另一个控制器访问

无法从另一个视图控制器获取表视图数据

为啥我不能在我的导航控制器中推送视图控制器?

为啥在模态视图控制器被解除后 CAGradientLayer 从视图中删除

为啥不能在视图中使用它,因为它在控制器中使用?

我可以从另一个模态视图控制器中推送模态视图控制器吗?