2017-08-06 81 views
1

我有一个收藏视图,它需要存储哪个按钮被按下。这就好比一个测验,他们有选项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) 

    } 
} 

不过,如果你刷几次,然后回来这个问题的形象会再次变成白色。我该如何解决这个问题。我还附上了屏幕的外观。

This is how it looks like

〜感谢

+0

那么如果你每次重新绘制一个新问题的视图时都运行这个循环,那么你每次都用'let answerButton = UIButton()'重新创建新的答案按钮。您需要一种方法来跟踪在构建视图时选择了哪个答案。我建议让自定义的类而不是String的答案,并且您的新的Answer类可以有一个名为文本的属性和一个名为wasSelected,记录用户选择哪一个。如果您对编码不熟悉,并希望详细说明,我可以写出更多的完整答案。 –

+0

@KyleSomers是啊完整的答案将是伟大的,因为它是一个有点混乱的时候:) – John

回答

0

你可以一个答案类这样的解决这个问题。如果你是新的班,我要指出,你不会想写内其他的类定义的代码(如您的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方法的教程,或者亲自向程序员请求帮助。但我尽可能地解释了这一点,而没有真正亲自到场给你一个完整的演练。

+0

做一个与model.answers位?而且我得到三个错误:类型字符串的值没有成员“文本” – John

+0

这听起来像你不明白的类和对象(这很好,我们都是新的在某一点),但如果是这样的话,那么我的回答会伤害你,而不是让你更加困惑,在这一点上帮助你。就像我在答案的底部所说的那样,看看这些主题的教程,并在我的代码有意义时回来。你的问题没有答案,你可以添加2行代码。你需要去学习东西。要回答你的问题,问题是,model.answers目前是一个字符串数组,你会想要一个数组的答案 –

+0

我这样做,但问题是,它不能调用模型,因为它不是全局的变量。有没有解决方法? – John