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