集合视图更新问题 - Swift

Posted

技术标签:

【中文标题】集合视图更新问题 - Swift【英文标题】:Collection view updating issue - Swift 【发布时间】:2016-09-01 12:21:03 【问题描述】:

应用结构:

我有一个Collection View Controller,这是我创建的徽标问答游戏的关卡之一。如果用户猜到了徽标,我将其存储在 UserDefaults 中并在 Collection View 中检索它,这会将复选标记图像放在单元格上。

问题:

一切正常,但是当用户从测验视图返回到Collection View Controller 时,复选标记未显示。虽然,如果我回到级别菜单,然后打开Collection View Controller,复选标记会正确显示。我试过用dispatch 方法解决这个问题,但没有帮助!我也尝试了CollectionView.reloadData 方法,但仍然没有任何反应!

我的代码:

import UIKit


class CollectionViewController: UICollectionViewController 
    
    var array = ["Youtube.jpeg","Facebook.svg.png","Google.png","Burger King.png"]
    var tappedImage = String()
    var associatedString = ""
    var expectedAnswer = ""
    let defaults = UserDefaults.standard
    var indexx = 0
    var checked: Bool = false
    
    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
    
   
    
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
        return array.count
    
    
    //performSegueWithIdentifier("ShowColor", sender: sender)
    
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
        
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
        let ImageView = cell.viewWithTag(1) as! UIImageView
        ImageView.image = UIImage(named: array[indexPath.row])
        let button = cell.viewWithTag(2) as! UIButton
        button.tag = indexPath.row
        button.addTarget(self, action: #selector(sendInformation), for: .touchUpInside)
        let checkImage = cell.viewWithTag(3) as! UIImageView
        var name = array[button.tag]
        if let dotRange = name.range(of: ".") 
            name.removeSubrange(dotRange.lowerBound..<name.endIndex)
            expectedAnswer = name
        
        
         if defaults.value(forKey: "\(expectedAnswer)") != nil
         let isChecked = defaults.value(forKey: "\(expectedAnswer)") as! Bool
         if isChecked == true
            checkImage.image = UIImage(named: "checkmark1.png")
         
         

        
        
        return cell
    
    override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "quizSegue" 
            if let quizViewController = segue.destination as? QuizVC 
                quizViewController.image = self.tappedImage
                quizViewController.expectedAnswer = self.expectedAnswer
            
        
    
    
    func sendInformation(_ sender: UIButton)
        tappedImage = array[sender.tag]
        var name = array[sender.tag]
        if let dotRange = name.range(of: ".") 
            name.removeSubrange(dotRange.lowerBound..<name.endIndex)
            expectedAnswer = name
            print(expectedAnswer)
        
        self.performSegue(withIdentifier: "quizSegue", sender: nil)
    
    
    @IBAction func unwindToCollectionView(segue: UIStoryboardSegue)
        
    

注意:你的答案可以用swift 2,我可以轻松翻译!我用的是迅捷3。 非常感谢任何帮助!

【问题讨论】:

您在哪里尝试过 CollectionView.reloadData? 在viewDidAppear()中,我已经删除了,因为它不起作用 您是否尝试在 collectionView: cellForItemAt: 中设置断点以确保当用户从测验视图返回时您的单元格实际上正在重新加载? collection view 上的方法 reloadData 或 reloadItems(at:) 应该可以工作,你只需要找到合适的地方调用它 好的,我会尽力而为 【参考方案1】:

经过大量 Google 搜索后,我终于解决了这个问题。在Collection View Controller

 override func viewWillAppear(_ animated: Bool) 
        let parent = self.view.superview
        self.view.removeFromSuperview()
        self.view = nil
        // unloads the entire view
        parent?.addSubview(self.view)
        // reloads the view
    

collectionView.reloadData

没有工作,因为我有一个重新加载的按钮导致:

EXC_BAD 指令

我刚刚强制重新加载视图。我不删除这个问题,因为其他人可能会觉得它很有用......源代码来自reload/refresh subViews - setNeedsDisplay doesnt work。

【讨论】:

以上是关于集合视图更新问题 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

自 Xcode 12 (Swift 5.3) 以来,嵌套集合视图不响应单元格选择

带有约束的嵌套集合视图的意外行为(Swift 4)

嵌套集合视图 Swift 4.2

swift中的集合视图单元格被压缩

在集合视图单元格 Swift 中管理多个进度视图

为啥两个表格视图单元格中的两个集合视图在 Swift 4 中不起作用?