2017-08-06 82 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