【问题标题】:UICollection View not reloading after changing the Array from a button click (button is outside UI Collection view)通过单击按钮更改数组后 UICollection 视图未重新加载(按钮位于 UI 集合视图之外)
【发布时间】:2021-08-30 06:28:51
【问题描述】:

我对 swift 很陌生。所以 TLDR 我有一个集合视图,我想在单击按钮后对其进行更新。我见过各种解决方案,每个人都建议放置 collectionView.reloadData 但我不明白在我的代码中放置这一行的位置。任何帮助将不胜感激。 这是视图控制器:

class myViewController: UIViewController {
    @IBOutlet weak var myCollectionView: UICollectionView!
    
    var charList: Array<String> = []
    
    var data: String = ""
    
    var songTiles = [
        "teri meri": ["D", "A", "G", "A", "F", "G", "A", "F", "G", "A", "G", "F", "E", "D", "E", "D", "C", "D", "E", "F", "E", "F", "E", "G", "A", "G", "F", "E", "D", "D"],
        "faded": ["B", "A", "B", "A"],
        "darmiyan": ["A", "B", "B", "A"],
        "hangover": ["B", "A", "B", "A"],
        "dna": ["A", "A", "A", "A"],
        "fire": ["A", "B", "B", "A"],
        "springday": ["C", "A", "A", "A"],
        "gotcha": ["C", "A", "A", "A"],
        "aurora": ["C", "A", "A", "A"],
        "fadedremix": ["A", "B", "A", "B"]
    ]
    
    @IBOutlet weak var chosenSong: UILabel!


    @IBAction func keyNote(_ sender: UIButton) {
        if (sender.currentTitle == charList[0]) {
            charList.removeFirst()
            print("Correct!")
            playSound(sound: sender.currentTitle!)
        }
    }
    
    func playSound(sound: String) {
        guard let url = Bundle.main.url(forResource: sound, withExtension: "wav") else {
            return

        }
        do {
                    try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)
                    try AVAudioSession.sharedInstance().setActive(true)
        
                    player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)
        
                    guard let player = player else { return }
        
                    player.play()
        
                } catch let error {
                    print(error.localizedDescription)
                }
    }
    
    var player: AVAudioPlayer?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        charList = songTiles[data]!
        chosenSong.text = data

        // Do any additional setup after loading the view.
    }

    
}
 

extension myViewController: UICollectionViewDataSource, UICollectionViewDelegate {
    
   func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return charList.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        myCollectionView.reloadItems(at: [indexPath])

        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! myCollectionViewCell
        cell.myImage.image = UIImage(named: charList[indexPath.row])
        myCollectionView.reloadItems(at: [indexPath])

        
        return cell
    }
    
    
}

因此,此代码的工作方式是,每次用户正确按下按钮时,它都会从用户选择的数组的开头删除字符。 例如,如果我选择 Array Faded 并按 A,则 UIControllerView 中的 Array 应该删除 A 并相应地更新集合视图。将其视为学习木琴歌曲的教程。 任何帮助,将不胜感激。谢谢。

【问题讨论】:

    标签: ios swift xcode uicollectionview uicollectionviewcell


    【解决方案1】:

    你可以这样试试

    @IBAction func keyNote(_ sender: UIButton) {
            if (sender.currentTitle == charList[0]) {
                charList.removeFirst()
                print("Correct!")
                
                let theIndex = IndexPath(row: 0, section: 0)   
                myCollectionView.deleteItems(at: [theIndex])
                playSound(sound: sender.currentTitle!)
            }
        }
    

    【讨论】:

    • 添加这一行代码适用于第一个元素,但随后它崩溃了。但是我把它改成这个它工作了:let theIndex = IndexPath(row: 0, section: 0) myCollectionView.deleteItems(at: [theIndex])谢谢你的帮助
    • 实际上我回答了你应该添加 reloadData 的地方。顺便说一句,我正在更新我的答案。
    • 附言。此外,您还需要删除 myCollectionView.reloadData(),因为在使用 myCollectionView.deleteItems() 后不需要它,并且我的应用程序在使用 myCollectionView.reloadData() 时会崩溃。
    【解决方案2】:

    不要在cellForItemAt:indexPath 中调用reloadItems(at: [indexPath]) - 集合视图正在向您询问那里的单元格,重新加载项目会再次询问您。

    您需要告诉集合视图,当您的模型 charList 更改时它需要再次询问您:这里:charList.removeFirst()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多