[英]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.