Swift 子视图保留旧值(在其上堆叠新值)
Swift sub view hold old values (stacking new values on top of it)
[已解决:)
通过添加 self.progressScrollView?.removeFromSuperview() ]
我是 swift 的新手。
有以下问题 :( 请帮助我。
每次我回到这个主屏幕(使用后退按钮)
我的滚动视图的内容在旧值之上显示新值
例如。
我在一个数组中有 4 个项目(a、b、c、d)。
和主页面随机显示
a
b
c
d
之后,我转到另一个页面并返回到此屏幕。
它在旧值之上显示新值
a -> b (this value is on top of 'a')
b -> d (this value is on top of 'b')
c -> c (this value is on top of 'c')
d -> a (this value is on top of 'd')
我做了什么?
- 我在 viewdidappear() 中重新初始化我的数组
- 在 gotopage() 下方添加
解雇(动画:真,完成:无)
- 在 self.displayProgressBar() 中添加 removefromsuperview & view.addsubview
(@sandeep 建议的.. 但不起作用)
我的流量:
1.call 在 viewdidload 中显示进度条
self.displayProgressBar()
class ViewController: UIViewController ,ChartViewDelegate, UIScrollViewDelegate {
...
var progressScrollView: UIScrollView!
...
override func viewDidLoad() {
super.viewDidLoad()
self.getfirebasedata()
2.add 进度条和标签根据列表大小动态变化。
func getfirebasedata(...){
...
self.displayProgressBar(...)
}
func displayProgressBar(...){
self.progressScrollView?.removeFromSuperview() //this is the fix
self.progressScrollView = UIScrollView()
self.progressScrollView.isScrollEnabled = true
self.progressScrollView.frame = CGRect(x: 0, y: 300,
width: self.view.frame.size.width, height: 200)
self.progressScrollView.contentSize = CGSize(width: self.view.frame.size.width,
height: self.view.frame.size.height)
let axisXstartPoint = ( self.view.frame.size.width - 200 ) / 2
let progressView = UIProgressView(progressViewStyle: .bar)
...
let label = UILabel()
label.frame = CGRect(x: axisXstartPoint, y: CGFloat(axisY-15), width: 200, height: 20)
label.textAlignment = .left
label.text = book.bookName
label.isUserInteractionEnabled = true
label.addGestureRecognizer(tapBookName)
progressScrollView.addSubview(label)
progressScrollView.addSubview(progressView)
self.view.addSubview(progressScrollView)
}
- 当我转到另一个页面时,我使用这种方法
@objc @IBAction func goToAddPage(sender: UITapGestureRecognizer) {
let label = sender.view as? UIButton
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let addViewController = storyBoard.instantiateViewController(withIdentifier: "add") as! AddViewController
addViewController.modalPresentationStyle = .fullScreen
self.navigationController?.pushViewController(addViewController, animated: true)
dismiss(animated: true, completion: nil)
}
4.this 是我的故事板
不确定你从哪里调用 displayProgressBar
因为你的问题不清楚,你可以做的是将这些语句添加为 displayProgressBar
中的第一个语句或调用 [= 之前的语句12=]
方法一:
self.progressScrollView?.removeFromSuperview() //? because for the first time implicit optional will be nil
self.progressScrollView = UIScrollView()
在 ViewDidLoad
你有 self.view.removeFromSuperview()
我不知道为什么?我不明白你为什么要尝试删除 ViewController 的观点?可能是你试图删除我假设的子视图,如果是,那不是删除子视图的正确方法,你迭代子视图并在每个子视图上调用 removeFromSuperview
,但我认为你不需要那个,从你的代码中可以清楚地看出您在代码中的某处持有对 progressScrollView
的引用,只需将其从子视图中删除并重新创建 progressScrollView
为
progressScrollView = UIScrollView()
如果您没有持有对 progressScrollView
的引用,而是将其创建为 displayProgressBar
方法中的唯一局部变量,请持有对该视图的引用,以声明一个实例变量 var progressScrollView: UIScrollView!
方法二:
如果您不喜欢一次又一次地创建 progressScrollView(),您可以随时迭代它的子视图并将它们一个一个地从父视图中移除
for view in progressScrollView.subviews {
view.removeFromSuperview()
}
如果您决定采用方法 2,请确保您只 运行 self.view.addSubview(progressScrollView)
一次(例如 ViewDidLoad
或其他地方)。
无论哪种情况,您都需要持有对 progressScrollView
的引用
[已解决:) 通过添加 self.progressScrollView?.removeFromSuperview() ]
我是 swift 的新手。 有以下问题 :( 请帮助我。
每次我回到这个主屏幕(使用后退按钮) 我的滚动视图的内容在旧值之上显示新值
例如。
我在一个数组中有 4 个项目(a、b、c、d)。 和主页面随机显示
a
b
c
d
之后,我转到另一个页面并返回到此屏幕。
它在旧值之上显示新值
a -> b (this value is on top of 'a')
b -> d (this value is on top of 'b')
c -> c (this value is on top of 'c')
d -> a (this value is on top of 'd')
我做了什么?
- 我在 viewdidappear() 中重新初始化我的数组
- 在 gotopage() 下方添加 解雇(动画:真,完成:无)
- 在 self.displayProgressBar() 中添加 removefromsuperview & view.addsubview (@sandeep 建议的.. 但不起作用)
我的流量:
1.call 在 viewdidload 中显示进度条 self.displayProgressBar()
class ViewController: UIViewController ,ChartViewDelegate, UIScrollViewDelegate {
...
var progressScrollView: UIScrollView!
...
override func viewDidLoad() {
super.viewDidLoad()
self.getfirebasedata()
2.add 进度条和标签根据列表大小动态变化。
func getfirebasedata(...){
...
self.displayProgressBar(...)
}
func displayProgressBar(...){
self.progressScrollView?.removeFromSuperview() //this is the fix
self.progressScrollView = UIScrollView()
self.progressScrollView.isScrollEnabled = true
self.progressScrollView.frame = CGRect(x: 0, y: 300,
width: self.view.frame.size.width, height: 200)
self.progressScrollView.contentSize = CGSize(width: self.view.frame.size.width,
height: self.view.frame.size.height)
let axisXstartPoint = ( self.view.frame.size.width - 200 ) / 2
let progressView = UIProgressView(progressViewStyle: .bar)
...
let label = UILabel()
label.frame = CGRect(x: axisXstartPoint, y: CGFloat(axisY-15), width: 200, height: 20)
label.textAlignment = .left
label.text = book.bookName
label.isUserInteractionEnabled = true
label.addGestureRecognizer(tapBookName)
progressScrollView.addSubview(label)
progressScrollView.addSubview(progressView)
self.view.addSubview(progressScrollView)
}
- 当我转到另一个页面时,我使用这种方法
@objc @IBAction func goToAddPage(sender: UITapGestureRecognizer) {
let label = sender.view as? UIButton
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let addViewController = storyBoard.instantiateViewController(withIdentifier: "add") as! AddViewController
addViewController.modalPresentationStyle = .fullScreen
self.navigationController?.pushViewController(addViewController, animated: true)
dismiss(animated: true, completion: nil)
}
4.this 是我的故事板
不确定你从哪里调用 displayProgressBar
因为你的问题不清楚,你可以做的是将这些语句添加为 displayProgressBar
中的第一个语句或调用 [= 之前的语句12=]
方法一:
self.progressScrollView?.removeFromSuperview() //? because for the first time implicit optional will be nil
self.progressScrollView = UIScrollView()
在 ViewDidLoad
你有 self.view.removeFromSuperview()
我不知道为什么?我不明白你为什么要尝试删除 ViewController 的观点?可能是你试图删除我假设的子视图,如果是,那不是删除子视图的正确方法,你迭代子视图并在每个子视图上调用 removeFromSuperview
,但我认为你不需要那个,从你的代码中可以清楚地看出您在代码中的某处持有对 progressScrollView
的引用,只需将其从子视图中删除并重新创建 progressScrollView
为
progressScrollView = UIScrollView()
如果您没有持有对 progressScrollView
的引用,而是将其创建为 displayProgressBar
方法中的唯一局部变量,请持有对该视图的引用,以声明一个实例变量 var progressScrollView: UIScrollView!
方法二:
如果您不喜欢一次又一次地创建 progressScrollView(),您可以随时迭代它的子视图并将它们一个一个地从父视图中移除
for view in progressScrollView.subviews {
view.removeFromSuperview()
}
如果您决定采用方法 2,请确保您只 运行 self.view.addSubview(progressScrollView)
一次(例如 ViewDidLoad
或其他地方)。
无论哪种情况,您都需要持有对 progressScrollView