2014-07-01 87 views
3

我有一个叫MyView.swift文件看起来就像这样:子类的UIView斯威夫特 - 错误

class MyView : UIView { 

} 

我也有带班设置为MyView的景色的MyView.xib文件。

在一个视图控制器我有这样的:

var myView: MyView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.myView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as MyView 
    self.myView.frame = frame; 
    self.view.addSubview(self.myView); 

} 

我得到这个错误:

MyView? does not have a member named 'frame' 

为什么? MyView是UIView的子类...

回答

4

您必须隐式展开该可选项,或者使用可选的链接。

self.myView!.frame = frame 

或利用可选的链接。

self.myView?.frame = frame 
// can do this now in Swift. 

第一个选项是因为当你用力解开一个可选的更危险,它是nil,会发生运行时错误。

编辑我很抱歉,可选的链接不是这里工作的正确工具。如果你想查询帧的值,它是正确的工具。或者,您可以使用if let语法。

if let optionalView = self.myView { 
    var queriedFrame = optionalView.frame 
} 
+1

self.myView?.frame = frame给了我“不能分配给这个表达式的结果” – soleil

+1

可选链只适用于右值 - 你不能分配给可选链表达式。您可以分配给force-unwrapped引用,或者在'if-let'块内分配。 – rickster

+0

谢谢,虽然我不确定queriedFrame行是关于什么。如果我用'optionalView.frame = frame'替换它就可以。 – soleil

3

MyViewUIView一个亚类中,但MyView?是可选的,其仅具有两种可能情况:

(1)它是nil,或

(2)它包含类型的包装值MyView

...并在任一个cas e,它仍然是一个可选的,这意味着它没有一个名为'frame'的成员:)但是如果它保留了一个包装值MyView那么这个包装值就是!

要获得该包装值(假设它有一个值),您需要明确地将其打包为!,或者您需要使用可选绑定(if let)来访问其属性。