Swift 我不知道';I don’我不知道我必须做些什么才能使工作顺利进行。。迅速地

Swift 我不知道';I don’我不知道我必须做些什么才能使工作顺利进行。。迅速地,swift,Swift,我想做这样的东西 (1) 。如果我按下31个按钮中的一个(A)。那个号码(A)变红了 (2) 。然后,如果我按下另一个按钮(B),然后(A)再次变黑,然后(B)变红 ** } }您必须在视图控制器中保存所选单元格的行号 添加一个回调闭包,而不是修改单元格中的颜色。在cellForRow中,处理回调,通过重新加载行将当前行设置为红色,将前一行设置为黑色 像这样的 class ViewController: UICollectionViewController { var selected

我想做这样的东西

(1) 。如果我按下31个按钮中的一个(A)。那个号码(A)变红了

(2) 。然后,如果我按下另一个按钮(B),然后(A)再次变黑,然后(B)变红

**

}


}

您必须在视图控制器中保存所选单元格的行号

添加一个
回调
闭包,而不是修改单元格中的颜色。在
cellForRow
中,处理回调,通过重新加载行将当前行设置为红色,将前一行设置为黑色

像这样的

class ViewController: UICollectionViewController {

    var selectedRow : Int?

    let data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier : "MyCell")
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return data.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! CollectionViewCell
        cell.Label.textColor = indexPath.item == selectedRow ? .red : .black
        cell.callback = { [unowned self] in
            if let row = self.selectedRow { 
                self.selectedRow = indexPath.item
                collectionView.reloadItems(at: [IndexPath(item: row, section: 0)])
            }
            cell.Label.textColor = .red
        }
        cell.Label.text = String(data[indexPath.row])
        return cell
     }
}

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var Label: UILabel!
    @IBOutlet weak var button: UIButton!

    var callback : (() -> Void)?

    @IBAction func buttonPressed(_ sender: UIButton) {
        callback?()
    }
}

您必须使用
isSelected
func setSelected(uselected:Bool,animated:Bool){

但首先您需要知道,在Swift中,我们对变量使用camelCase样式

现在,我们必须对您的单元实现进行一些更改:

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    public override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        if selected {
            label.textColor = .red
        } else {
            label.textColor = .black
        }
    }

    @IBAction func buttonPressed(_ sender: UIButton) {
       self.isSelected = !self.isSelected
    }
}
另外,不要忘记将
cell.Label.text=String(数据[indexath.row])
更新为
cell.Label.text=String(数据[indexath.row])

编辑


正如所指出的,使用
isSelected.toggle()
比使用
self.isSelected=!self.isSelected
更好,因为它已经由系统提供了Bool有一个名为toggle的方法。
self.isSelected.toggle()
你确定如果用户选择单元格,标签颜色不会改变吗?请注意,如果用户也允许选择单元格,则按钮的存在将是无意义的。这将不是一个准确的答案,因为它将再次更新。我只是提出这一点,因为他提供的信息只是为了更改文本颜色。为了管理您的问题em和selectedRow number然后vadian解决方案更好:DYou是指他的问题。也许OP添加按钮是因为他不知道如何使用cell selected属性。是的,我甚至想过,因为大多数初学者都这么做。我记得我一开始就是这么做的。我只是复制你的代码粘贴它,但它不能正常工作。build表示成功,但按钮未变黑。
class ViewController: UICollectionViewController {

    var selectedRow : Int?

    let data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier : "MyCell")
    }

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return data.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! CollectionViewCell
        cell.Label.textColor = indexPath.item == selectedRow ? .red : .black
        cell.callback = { [unowned self] in
            if let row = self.selectedRow { 
                self.selectedRow = indexPath.item
                collectionView.reloadItems(at: [IndexPath(item: row, section: 0)])
            }
            cell.Label.textColor = .red
        }
        cell.Label.text = String(data[indexPath.row])
        return cell
     }
}

class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var Label: UILabel!
    @IBOutlet weak var button: UIButton!

    var callback : (() -> Void)?

    @IBAction func buttonPressed(_ sender: UIButton) {
        callback?()
    }
}
class CollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!

    public override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        if selected {
            label.textColor = .red
        } else {
            label.textColor = .black
        }
    }

    @IBAction func buttonPressed(_ sender: UIButton) {
       self.isSelected = !self.isSelected
    }
}