为啥我不能从另一个控制器中删除视图?
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 中删除 blurView
和 SignUpView
XIB 类?
【问题讨论】:
【参考方案1】:ViewController()
为您返回ViewController
类的新实例,
它没有初始化 blurView
和 springUpView
(这就是为什么当你尝试对 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 可以在一个控制器中访问,但不能从另一个控制器访问