[英]stop view controller from reloading after another view controller is dismissed
[英]Why is the CAGradientLayer removed from view after modal view controller is dismissed
我正在創建一個漸變圖層並將其添加到我的MainViewController
self.view中。
override func viewDidLoad() {
super.viewDidLoad()
gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = colors
view.layer.insertSublayer(gradient, at: 0)
}
在viewDidAppear
里面我列舉了所有的子層:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
for x in (view.layer.sublayers)! {
print(x)
}
}
這是我在運行應用程序時得到的結果(這是正常的):
<CAGradientLayer: 0x608000224120>
<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>
然后從MainViewController
我提出modally另一個vc,然后解散它。 在再次調用此MainVC viewDidAppear
之后,這次我得到了這個:
<_UILabelLayer: 0x60000009a400>
<_UILabelLayer: 0x60800009f180>
<CALayer: 0x600000422d60>
<CALayer: 0x608000223820>
CAGradientLayer
已從CAGradientLayer
中刪除。 我可以通過將我的代碼從viewDidLoad
移動到viewDidAppear
來解決這個問題,但我想了解為什么在控制器被解除后CAGradientLayer
被刪除了。
我無法在簡單的測試程序中重現您的情況。
這是一些調試建議......
要找出從view.layers
中刪除漸變圖層的view.layers
,請定義
class MyCAGradientLayer: CAGradientLayer {
deinit {
print("there it goes")
}
}
並使用在viewDidLoad
本地創建的MyCAGradientLayer
替換您的CAGradientLayer
。
override func viewDidLoad() {
super.viewDidLoad()
let gradient = MyCAGradientLayer()
gradient.frame = view.bounds
gradient.colors = colors
view.layer.insertSublayer(gradient, at: 0)
}
在viewDidLoad
完成后,局部變量gradient
將釋放其對gradient
引用,並且只存在一個gradient
引用( view.layers
數組中的view.layers
)。
在print
語句上設置斷點以查看它被釋放的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.