在Swift中对UIView进行子类化 - 错误

时间:2014-07-01 03:40:51

标签: ios uiview uiviewcontroller swift

我有一个名为MyView.swift的文件,如下所示:

class MyView : UIView {

}

我还有一个MyView.xib文件,其视图的类设置为MyView。

在视图控制器中我有这个:

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的子类...

2 个答案:

答案 0 :(得分: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 :(得分:3)

MyViewUIView的子类,但MyView?是一个可选的,只有两种可能的情况:

(1)它是nil

(2)它包含MyView

类型的包装值

...在任何一种情况下,它仍然是一个可选项,这意味着它没有一个名为' frame'的成员。 :)虽然如果它持有MyView的包装值,那么包裹的值会起作用!

要获得该包装值(假设它有一个),您必须使用!显式解包它,或者在访问其属性时使用Optional Binding(if let)。