UIView.Type没有名为bounds的成员

时间:2015-04-20 18:26:40

标签: ios swift uiview

我只是尝试将两个var设置为视图的bounds.size.width和.height。

import UIKit

class BKView: UIView {

    var maxX: CGFloat = bounds.size.width
    var maxY: CGFloat = bounds.size.height

}

然而Xcode没有说错误:'BKView.Type'没有名为'bounds'的成员。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

这是一个措辞严重的编译器错误,但它意味着你不能根据类(或超类)的其他属性给出属性默认值。以下是正在发生的事情的简单变体:

class A {
    let x: Int

    init(x: Int) {
        self.x = x
    }
}

class B: A {
    // error: 'B.Type' does not have a member named 'x'
    let y = x
}

在调用maxX之后,您必须在maxY方法中初始化initsuper.init(因为只有在此之后才允许您访问{{1}}超类的属性)。

答案 1 :(得分:2)

@Airspeed Velocity给出了一个很好的解释。我想添加它,或者你可以使用lazy初始化。例如:

class BKView: UIView {
    lazy var maxX: CGFloat = self.bounds.size.width
    lazy var maxY: CGFloat = self.bounds.size.height
}

有关详细信息,请参阅:http://mikebuss.com/2014/06/22/lazy-initialization-swift/

答案 2 :(得分:1)

创建视图时,需要定义一些默认的初始化方法。按如下方式定义一个类:

class TestView: UIView {

    var maxX : CGFloat?
    var maxY : CGFloat?

    override init() {

        super.init()
        initializeBounds()
    }

    required init(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)
        initializeBounds()

    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initializeBounds()
    }

    func initializeBounds()
    {
        maxX = self.bounds.size.width
        maxY = self.bounds.size.height

    }

    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code

        println("maxX: \(maxX!) maxY: \(maxY!)")
    }


}

每当Storyboard或Coding初始化TestView时,TestView的属性都会被初始化。

将视图添加到视图控制器的视图后,如下所示:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.


        var testView : TestView = TestView(frame: CGRectMake(10.0, 10.0, 100.0, 50.0))
        testView.backgroundColor = UIColor.redColor()
        self.view.addSubview(testView)

}

日志如下:

TestView:maxX:100.0 maxY:50.0

为避免代码复制,initializeBounds()TestView的初始值设定项中定义并调用:

答案 3 :(得分:0)

使用self.bounds.size.widthself.bounds.size.height。您应该在初始值设定项或其他函数中指定属性maxXmaxY值,而不是内联。例如:

init(frame: CGRect) {
    super.init(frame: frame)
    maxX = self.bounds.size.width
    maxY = self.bounds.size.height
}