2016-02-27 47 views
1

因此,這是一種奇怪的一個,我不太明白是怎麼回事...意外類嵌套 - 代碼運行10過於頻繁(SWIFT)

所以我做了一些自定義在彼此類/對象(UIViews)是這樣的:

class Example1: UIView { 
    [properties etc.] 

let Test = Example2() 
Test.frame = CGRe... 
addSubview(Test) 
} 


class Example2: UIView { 
    [properties etc.] 
} 

,直到你添加某種有趣的這一切工作正常參見Example2。然後,它會多次運行一切(如果您調用Example1,Example2 = 1,2,它將按以下順序運行:1,1,2,2,1,2,1,2,2,2)。

這樣做的問題是,它會創建同一對象的多個版本,但具有不同的值,因爲它們是在其他位置(大小和位置等)計算的。

我希望我能夠解釋我這樣的問題,否則是整個(相當凌亂,因爲我一直在試圖解決這個問題)代碼:http://pastebin.com/4D3kt1uN(如果你像你可以嘗試運行它在xcode中查看我的意思)。

任何幫助,非常感謝!

+0

問題是你的代碼是在'layoutSubviews'中,它可以(通常會)被多次調用。每次,您的代碼都會創建並添加新的子視圖(其中每個子視圖都會接收到'layoutSubviews'調用)。您應該**在課程的初始者中創建**子視圖; 'layoutSubviews'應該確保它們位於正確的位置。 – pbasdf

+0

@pbasdf這解決了它運行多次的問題,但我應該用什麼作爲初始化/構造函數?我已經嘗試了所需的init編碼器和框架,但是它只會執行第一個類(或者沒有)... – Mats

+0

例如,如果有'let monday = RoosterViewMonday()','init()'方法是稱爲(不是'init(frame:)'或'init(coder:)')。修改爲使用'let monday = RoosterViewMonday(frame:....)'或實現'init()'。同樣的其他雞...意見。 – pbasdf

回答

0

您的代碼存在的問題是,您在layoutSubviews方法中添加子視圖。

override func layoutSubviews() { 
    ... 
    let GuideLine = UIView() 
    addSubview(GuideLine) 
    ... 
} 

layoutSubviews方法可以在應用程序的生命週期中多次調用。例如,參見這個SO問題「When is layoutSubviews called?」。 因此,每當佈局更改時,您的子視圖都會添加到屏幕中。這就是爲什麼你看到你的意見的多個版本。 嘗試將您的邏輯移出layoutSubviews方法。

+0

這解決了它運行多次的問題,但我應該用什麼作爲初始化/構造函數?我試過了所需的init編碼器和框架,但它只會執行第一個類(或沒有)... – Mats