2015-04-20 3 views
1

Я просто пытаюсь установить два var в bounds.size.width и .height представления.UIView.Type не имеет имени с именем bounds

import UIKit 

class BKView: UIView { 

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

} 

Однако Xcode не удается говоря с ошибкой: 'BKView.Type' не имеет элемент с именем 'границы'.

Любые предложения?

ответ

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!)") 
    } 


} 

Всякий раз, когда TestView инициализируется на раскадровке или кодировании TestView «s свойства получения инициированную.

После добавления вид на вид вашей точки зрения контроллера следующим образом:

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:

+0

Это фантастика! Спасибо за помощь мне! – Bren

0

Использовать self.bounds.size.width и self.bounds.size.height. Вы должны назначить свойства maxX и maxY значениям в инициализаторе или какой-либо другой функции вместо встроенного. Пример:

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

Спасибо, но это не исправляет. Добавление self приводит к следующей ошибке: _'BKView ->() -> BKView 'не имеет члена с именем' bounds'_ – Bren

+0

Используете ли вы 'maxX' и' maxY' в функции или объявляете их как свойства экземпляр 'BKView'? Звонки на 'self.bounds' должны быть сделаны из функции. – keithbhunter

+0

Я хочу объявить их как свойства – Bren

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 внутри init метода вместо этого, после того, как вы назвали super.init (потому что только после этого вы позволили получить доступ к свойствам суперкласса) ,

2

@ Скорость движения по воздуху дает хорошее объяснение. Я хотел добавить, что в качестве альтернативы вы можете использовать инициализацию 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/

Смежные вопросы