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')

我做了什么?

  1. 我在 viewdidappear() 中重新初始化我的数组
  2. 在 gotopage() 下方添加 解雇(动画:真,完成:无)
  3. 在 self.displayProgressBar() 中添加 removefromsuperview & view.addsubview (@sandeep 建议的.. 但不起作用)

我的流量:

1.call 在 vi​​ewdidload 中显示进度条 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)
            
        }
  1. 当我转到另一个页面时,我使用这种方法
@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

的引用