收藏查看收藏按钮按下迅速
问题描述:
我有一个收藏视图,它需要存储哪个按钮被按下。这就好比一个测验,他们有选项A,B,C,D的问题是,它会与此代码选择项:收藏查看收藏按钮按下迅速
extension QuestionCell {
func configure(with model: Question) {
factLabel.text = model.fact
questionLabel.text = model.question
revenueLabel.text = model.revenue
let views = answersStack.arrangedSubviews
for view in views {
view.removeFromSuperview()
}
for (id, answer) in model.answers {
print(index)
let answerLabel = UILabel()
answerLabel.text = answer
answersStack.addArrangedSubview(answerLabel)
let answerButton = UIButton()
answerButton.tag = index
let imageNormal = UIImage(named: "circle_empty")
answerButton.setImage(imageNormal, for: .normal)
let imageSelected = UIImage(named: "circle_filled")
answerButton.setImage(imageSelected, for: .selected)
answerButton.setTitleColor(.black, for: .normal)
answerButton.addTarget(self, action: #selector(answerPressed(_:)), for: .touchUpInside)
answersStack.addArrangedSubview(answerButton)
}
}
不过,如果你刷几次,然后回来这个问题的形象会再次变成白色。我该如何解决这个问题。我还附上了屏幕的外观。
〜感谢
答
你可以一个答案类这样的解决这个问题。如果你是新的班,我要指出,你不会想写内其他的类定义的代码(如您的ViewController类)。
class Answer{
var wasSelected = false
var text : String
init(text : String) {
self.text = text
}
}
class ButtonWithAnswer : UIButton{
var answer : Answer?
}
但现在你model.answers会这个样子,并将于[String : Answer]
类型:
model.answers = ["id1" : Answer(text : "answer 1"), "id2" : Answer(text: "answer 2"), "id3":Answer(text: "answer 3")]
的想法是,而不是有model.answers包含字符串,它们包含我们由被叫应答,可保持文本的轨道新的自定义类型对于答案(这是一个名为String类型的文本的属性)以及它是否是s当选(这是一个名为wasSelected的属性Bool)。您的for循环现在看起来像这样:
for (id, answer) in model.answers {
let answerLabel = UILabel()
answerLabel.text = answer.text //this comes from our new class definition
answersStack.addArrangedSubview(answerLabel)
//Change this to our new custom button subclass
let answerButton = ButtonWithAnswer()
//this line straight up won't work since you got rid of index
//answerButton.tag = index
//use this instead
answerButton.answer = answer
let imageNormal = UIImage(named: "circle_empty")
answerButton.setImage(imageNormal, for: .normal)
let imageSelected = UIImage(named: "circle_filled")
answerButton.setImage(imageSelected, for: .selected)
//make it so that any answers that were previously selected are now selected when the view reloads
answerButton.isSelected = answer.wasSelected
answerButton.setTitleColor(.black, for: .normal)
answerButton.addTarget(self, action: #selector(answerPressed(_:)), for: .touchUpInside)
answersStack.addArrangedSubview(answerButton)
}
这里有一个最后一部分。当我们点击与该答案相对应的按钮时,我们需要确保我们的答案被选中。所以在回答我们应该做这样的事情。
func answerPressed(_ sender : UIButton){
let answerForButton = (sender as! ButtonWithAnswer).answer!
answerForButton.wasSelected = true
}
这应该关于掩盖它。如果这看起来像是一个全新的东西,那么在你潜入之前,你应该在Swift中查找关于Swift中的类,对象和init方法的教程,或者亲自向程序员请求帮助。但我尽可能地解释了这一点,而没有真正亲自到场给你一个完整的演练。
那么如果你每次重新绘制一个新问题的视图时都运行这个循环,那么你每次都用'let answerButton = UIButton()'重新创建新的答案按钮。您需要一种方法来跟踪在构建视图时选择了哪个答案。我建议让自定义的类而不是String的答案,并且您的新的Answer类可以有一个名为文本的属性和一个名为wasSelected,记录用户选择哪一个。如果您对编码不熟悉,并希望详细说明,我可以写出更多的完整答案。 –
@KyleSomers是啊完整的答案将是伟大的,因为它是一个有点混乱的时候:) – John