简体   繁体   English

更新swift中的collectionview,重新加载数据

[英]update collectionview in swift, reload the data

I currently have two collectionview, each linked with an array of Strings and are embedded with buttons.我目前有两个collectionview,每个都与一个字符串数组链接,并嵌入了按钮。 I want to make it so that I can select a value on the collectionview at the bottom, then be able to drop that value to a position on the collectionview on the top, by,again, tapping it.我想这样做,以便我可以 select 在底部的 collectionview 上的一个值,然后能够将该值下降到顶部的 collectionview 上的 position,再次点击它。 I am not sure how I can update the collectionview, every time I tap a button.每次点击按钮时,我都不确定如何更新 collectionview。

import UIKit
class MyButtonCell: UICollectionViewCell{
    @IBOutlet weak var buttonOne: UIButton!
    @IBOutlet weak var targetButton: UIButton!
    
    var callback: (() -> ())?
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
        
    }
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }
    func commonInit() -> Void {
        contentView.layer.borderWidth = 1
        contentView.layer.borderColor = UIColor.black.cgColor
    }
    
    @IBAction func buttonTapped(_ sender: UIButton) {
        
        callback?()
    }
}

class StevenViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    let buttonTitles: [String] = [
        "4", "6", "7", "8"
    ]
    
    var targetButtonTitles: [String] = [
        "", "", "", ""
    ]
    
    var current:String = ""
    
    @IBOutlet var collectionView: UICollectionView!
    
    @IBOutlet var targetCollection: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        targetCollection.delegate = self
        targetCollection.dataSource = self
        
        collectionView.delegate = self
        collectionView.dataSource = self
        
        
    }
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return buttonTitles.count
        
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCellID", for: indexPath) as! MyButtonCell
        let targetCell = targetCollection.dequeueReusableCell(withReuseIdentifier: "myCellID", for: indexPath) as! MyButtonCell

           // set the button title (and any other properties)
        
         
           if collectionView == self.collectionView {
              
               // Setup here your cell
               cell.callback = {
                   print("Button was tapped at \(indexPath)")
                   self.targetButtonTitles[indexPath.item] = self.buttonTitles[indexPath.item]
                   
                   //print(self.targetButtonTitles)
                self.current = self.buttonTitles[indexPath.item]
                print(self.current)
                   
                   // do what you want when the button is tapped
               }

               cell.buttonOne.setTitle(buttonTitles[indexPath.item], for: [])

               return cell
           } else {

               // Setup here your targetCell
            
            cell.callback = {
                if self.current != ""{
                    self.targetButtonTitles[indexPath.item] = self.current
                    targetCell.targetButton.setTitle(self.targetButtonTitles[indexPath.item], for: [])
                    

                }
            }
            
            targetCell.targetButton.setTitle(self.targetButtonTitles[indexPath.item], for: [])

               return targetCell
           }
        
    }
}

在此处输入图像描述

I am not sure how I can put that "return targetcell" into the cell.callback or the iBaction我不确定如何将“返回目标单元”放入 cell.callback 或 iBaction

I suggest that you do your logic by the tag of the collection views.我建议你通过集合视图的标签来做你的逻辑。

override func viewDidLoad() {
    super.viewDidLoad() 
    collectionView.tag = 1
    targetCollection.tag = 2
}

in your delegates you create and return your cells by checking which collection view is asking for the data, for example例如,在您的委托中,您可以通过检查哪个集合视图要求数据来创建和返回单元格

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if collectionView.tag == 1 {
        return buttonTitles.count
     } else if collectionView.tag == 2 {
        return targetButtonTitles.count
    }    
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView.tag == 1 {
       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCellID", for: indexPath) as! MyButtonCell
       cell.buttonOne.setTitle(buttonTitles[indexPath.item], for: [])
    .
    .
    .
    return cell
    } else if collectionView.tag == 2 {
       let targetCell = targetCollection.dequeueReusableCell(withReuseIdentifier: "myCellID", for: indexPath) as! MyButtonCell
       cell.buttonOne.setTitle(targetButtonTitles[indexPath.item], for: [])

    .
    .
    .
    return cell
    }  
}

in your callbacks, move the data around in your two arrays and when you done, reload both collection views.在您的回调中,在您的两个 arrays 中移动数据,完成后,重新加载两个集合视图。

self.targetButtonTitles[indexPath.item] = self.buttonTitles[indexPath.item]

collectionView.reloadData()
targetCollection.reloadData()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM