几种 "Remove View" 方法后子视图未删除
Subview Not Removing after Several "Remove View" Methods
我有一个很好的功能,它添加了一个 activity 指标视图,它后面有一个常规视图。当我添加它时,它添加得很好。问题是,当我尝试删除它时,什么也没有发生。我试过了:
.removeFromSuperview
,
.isHidden = true
并将这些方法放入主队列中:
DispatchQueue.main.async() {
alertView.alpha = 0
alertView.removeFromSuperview()
activityIndicator.removeFromSuperview()
alertView.isHidden = true
activityIndicator.isHidden = true
}
我不知道还有什么其他方法可以尝试...似乎所有其他类似的问题都有我所拥有的一种方法作为解决方案。该函数使用布尔值来确定是否停止 activity 指标。这是我的代码:
static func showLoadingView(inViewController: UIViewController, turning: Bool){
let activityIndicator = UIActivityIndicatorView()
let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
if(turning){
alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8)
alertView.layer.cornerRadius = 5
activityIndicator.center = alertView.center
inViewController.view.addSubview(alertView)
activityIndicator.activityIndicatorViewStyle = .gray
activityIndicator.startAnimating()
alertView.alpha = 0
activityIndicator.backgroundColor = UIColor.lightGray
alertView.center = inViewController.view.center
alertView.addSubview(activityIndicator)
alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
UIView.animate(withDuration: 0.4) {
alertView.alpha = 1
alertView.transform = CGAffineTransform.identity
}
}
///////
else {
activityIndicator.stopAnimating()
alertView.transform = CGAffineTransform.init(scaleX: 1.3, y:1.3)
DispatchQueue.main.async() {
alertView.alpha = 0
alertView.removeFromSuperview()
activityIndicator.removeFromSuperview()
alertView.isHidden = true
activityIndicator.isHidden = true
}
print("Done")
}
}
当您调用 false.As 结果时,您声明的 alertView 超出范围,您的调用无法识别 alertView 实例。
您可以通过两种方式解决此问题:
在函数外部将您的 alertView 声明为静态。
static let activityIndicator = UIActivityIndicatorView()
static let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
static func showLoadingView(inViewController: UIViewController, turning: Bool){}
在错误的情况下:使用 restorationIdentifier 找到 subview 并删除。
static func showLoadingView(inViewController: UIViewController, turning: Bool){
if(turning){
let activityIndicator = UIActivityIndicatorView()
let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
alertView.restorationIdentifier = "myalert"
alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8)
alertView.layer.cornerRadius = 5
activityIndicator.center = alertView.center
inViewController.view.addSubview(alertView)
activityIndicator.activityIndicatorViewStyle = .gray
activityIndicator.startAnimating()
alertView.alpha = 0
activityIndicator.backgroundColor = UIColor.lightGray
alertView.center = inViewController.view.center
alertView.addSubview(activityIndicator)
alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
UIView.animate(withDuration: 0.4) {
alertView.alpha = 1
alertView.transform = CGAffineTransform.identity
}
}
///////
else {
for view in inViewController.view.subviews {
if (view.restorationIdentifier == "myalert") {
print("I FIND IT");
(view as! UIView).removeFromSuperview();
}
}
}
}
我有一个很好的功能,它添加了一个 activity 指标视图,它后面有一个常规视图。当我添加它时,它添加得很好。问题是,当我尝试删除它时,什么也没有发生。我试过了:
.removeFromSuperview
,
.isHidden = true
并将这些方法放入主队列中:
DispatchQueue.main.async() {
alertView.alpha = 0
alertView.removeFromSuperview()
activityIndicator.removeFromSuperview()
alertView.isHidden = true
activityIndicator.isHidden = true
}
我不知道还有什么其他方法可以尝试...似乎所有其他类似的问题都有我所拥有的一种方法作为解决方案。该函数使用布尔值来确定是否停止 activity 指标。这是我的代码:
static func showLoadingView(inViewController: UIViewController, turning: Bool){
let activityIndicator = UIActivityIndicatorView()
let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35))
if(turning){
alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8)
alertView.layer.cornerRadius = 5
activityIndicator.center = alertView.center
inViewController.view.addSubview(alertView)
activityIndicator.activityIndicatorViewStyle = .gray
activityIndicator.startAnimating()
alertView.alpha = 0
activityIndicator.backgroundColor = UIColor.lightGray
alertView.center = inViewController.view.center
alertView.addSubview(activityIndicator)
alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3)
UIView.animate(withDuration: 0.4) {
alertView.alpha = 1
alertView.transform = CGAffineTransform.identity
}
}
///////
else {
activityIndicator.stopAnimating()
alertView.transform = CGAffineTransform.init(scaleX: 1.3, y:1.3)
DispatchQueue.main.async() {
alertView.alpha = 0
alertView.removeFromSuperview()
activityIndicator.removeFromSuperview()
alertView.isHidden = true
activityIndicator.isHidden = true
}
print("Done")
}
}
当您调用 false.As 结果时,您声明的 alertView 超出范围,您的调用无法识别 alertView 实例。
您可以通过两种方式解决此问题:
在函数外部将您的 alertView 声明为静态。
static let activityIndicator = UIActivityIndicatorView() static let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35)) static func showLoadingView(inViewController: UIViewController, turning: Bool){}
在错误的情况下:使用 restorationIdentifier 找到 subview 并删除。
static func showLoadingView(inViewController: UIViewController, turning: Bool){ if(turning){ let activityIndicator = UIActivityIndicatorView() let alertView = UIView(frame: CGRect(x: activityIndicator.frame.origin.x, y: activityIndicator.frame.origin.y , width: 35, height: 35)) alertView.restorationIdentifier = "myalert" alertView.backgroundColor = UIColor(displayP3Red: 230, green: 230, blue: 230, alpha: 0.8) alertView.layer.cornerRadius = 5 activityIndicator.center = alertView.center inViewController.view.addSubview(alertView) activityIndicator.activityIndicatorViewStyle = .gray activityIndicator.startAnimating() alertView.alpha = 0 activityIndicator.backgroundColor = UIColor.lightGray alertView.center = inViewController.view.center alertView.addSubview(activityIndicator) alertView.transform = CGAffineTransform.init(scaleX: 1.3,y: 1.3) UIView.animate(withDuration: 0.4) { alertView.alpha = 1 alertView.transform = CGAffineTransform.identity } } /////// else { for view in inViewController.view.subviews { if (view.restorationIdentifier == "myalert") { print("I FIND IT"); (view as! UIView).removeFromSuperview(); } } } }