2014-11-21 37 views
0

我做了UILabel的一個子類,名爲UIScoreLabel,它更專門爲我需要顯示分數。下面是代碼:爲什麼我的子類不存在變量?

class UIScoreLabel: UILabel 
{ 
    var scoreBackingInt: Int! 
    var score: Int { 
     get 
     { 
      return scoreBackingInt 
     } 
     set(newScore) 
     { 
      scoreBackingInt = newScore 
      self.text = NSString(format: "%0\(digits)d", newScore) 
     } 
    } 
    let digits: Int! // number of digits to display (for 0-padding) 

    init(digits: Int) 
    { 
     super.init() 
     self.digits = digits 
     self.score = 0 
    } 
} 

score被認爲是一個計算變量。總之,一切都很好,當我實例化一個UIScoreLabel,但是當我試圖訪問以任何方式(即score)任何子類的屬性,編譯器告訴我'UILabel' does not have a member named 'score'

這裏是給了我一個錯誤的行,在我的ViewController中:

creditsLabel.score = self.score 

是什麼給出的?

+0

你有沒有設置類爲您creditsLabel到'UIScoreLabel'在InterfaceBuilder中的身份檢查? – zisoft 2014-11-21 07:30:27

+0

我們需要看到你的UIScoreLabel的實例,因爲這實際上是造成這個問題的原因。 – 2014-11-21 09:17:51

+0

@zisoft 'creditsLabel = UIScoreLabel(digits:6)' 我沒有使用IB,我正在以編程方式執行此操作。 – 2014-11-23 21:47:17

回答

3

您需要讓編譯器知道類的類型。正如你在錯誤信息中看到的那樣,編譯器當前認爲這個類是UILable,所以你需要更新類的類型(或者如果你不能的話,就強制類類型)。

+0

編譯器_應該知道這是一個UIScoreLabel:'creditsLabel = UIScoreLabel(digits:6)' – 2014-11-23 21:48:20

+1

@MichaelZimmerman那行代碼不在任何地方。既然這是不起作用的部分,爲什麼不把它包含在問題中呢? Wain是正確的,編譯器不知道它是'UIScoreLabel',錯誤信息表明編譯器認爲它是'UILabel'。 – 2014-11-23 22:42:09

+0

@MichaelZimmerman,'creditsLabel'的定義必須是'UILabel',所以你需要改變它或者轉換每個用法...... – Wain 2014-11-24 07:59:01

2

UILabelUIView的子類和UIView的默認初始值設定爲init(frame: CGRect)。這是調用super時需要使用的初始值設定項。

super.init(frame: CGRectZero) 
    self.digits = digits 
    self.score = 0 

而且UILabel採用NSCoding並有您需要實現所需的初始化。既然你不使用的故事板,你可以添加以下襬脫編譯器錯誤的:

required init(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
    } 
相關問題