2017-08-08 155 views
0

我有收集視圖,您可以選擇4個按鈕,它就像A,B,C,D的測驗。我需要存儲他們點擊之前,他們去下一個問題(他們將滑動以轉到下一個問題,因爲它是一個集合視圖)控制器看起來像這樣:enter image description here存儲按鈕按快速

第一:本質上用於顯示上述圖像的代碼,我已經創建了使用該解析的數據庫:

struct Question { 
    let fact: String 
    let question: String 
    let answers: [String: String] 
    let correctAnswer: String 
    let revenue: String 

    init?(with dictionary: [String: Any]) { 
     guard let fact = dictionary["fact"] as? String, 
      let question = dictionary["question"] as? String, 
      let answerA = dictionary["answer_a"] as? String, 
      let answerB = dictionary["answer_b"] as? String, 
      let answerC = dictionary["answer_c"] as? String, 
      let answerD = dictionary["answer_d"] as? String, 
      let revenue = dictionary["revenue"] as? String, 
      let correctAnswer = dictionary["correctAnswer"] as? String else { return nil } 

     self.fact = fact 
     self.question = question 
     self.revenue = revenue 
     var answersDict = [String: String]() 

     answersDict["answer_a"] = answerA 
     answersDict["answer_b"] = answerB 
     answersDict["answer_c"] = answerC 
     answersDict["answer_d"] = answerD 

     self.answers = answersDict 
     self.correctAnswer = correctAnswer 

    } 

第二:然後我顯示使用此代碼:

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) 
     print(id) 
     let answerLabel = UILabel() 
     answerLabel.text = answer 

     answersStack.addArrangedSubview(answerLabel) 

     let answerButton = UIButton() 
     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) 

    } 
} 
} 

有沒有辦法存儲我點擊的按鈕?謝謝

+0

我不知道你是什麼意思本:沒有與此一個明顯的問題,那就是,這將不與集合視圖的工作,因爲你只有4個按鈕整個測驗不適用於每個視圖控制器。你能再描述一下嗎? – toddg

+0

由於我有一個集合,它意味着你在許多控制器之間滑動,並且這4個按鈕將在那裏用於每個控制器。用於爲每個按鈕創建操作的方法將不起作用,因爲我只有4個按鈕。這有意義嗎? – josh

+0

但是,當您滑動到一組新問題時,我假設您保存答案並加載新問題/答案集。當你創建你的'answerButton'時,你可以添加'answerButton.tag = index + 100'嗎?然後在'answerPressed'中拉出可以告訴你選擇的答案的標籤。 – toddg

回答

0

那麼有一個肯定的辦法擺脫這種情況。

  1. 爲collectionView創建自定義單元格。
  2. 添加按鈕,網點和行動的customCell的類
  3. 創建,並在customCell的類使用的委託方法和實施customCell當您的視圖控制器設置委託給 自我。
  4. 按鈕操作完成時(在自定義單元格內)觸發委託方法。
  5. 在cellForItemAt方法中使用它時,請爲您的customCell提供當前的索引路徑。
  6. 利用該indexPath來決定觸發哪個按鈕。

您應該考慮採用一種可靠的解決方案。

0

我過去處理這個問題的方法是在UIButton上使用標籤,並且只跟蹤當前選擇的標籤。通過這種方法,我可以對每個按鈕使用相同的IBAction,我需要做的就是從功能體中的sender中拉出標籤。儘管可能不像使用子類化那樣靈活和健壯,但實現起來要快一些。

首先在創建按鈕時設置標籤(我使用100-104以避免與其他按鈕發生衝突)。既然你在的CollectionView創建按鈕,你就需要設置標籤在你configure()功能:

func configure(with model: Question) { 
    ... 
    for (id, answer) in model.answers { 
     ... 
     answerButton.setImage(imageSelected, for: .selected) 
     answerButton.tag = index 
     answerButton.setTitleColor(.black, for: .normal) 
     answerButton.addTarget(self, action: #selector(answerPressed(_:)), for: .touchUpInside) 
    } 
} 

創建一個實例變量:

var selectedAnswerIndex = -1 

那麼這個IBAction爲分配給每個你按鍵:

func answerPressed(_ sender: UIButton){ 

    selectedAnswerIndex = sender.tag 
    hilightNewOne(sender: sender) 
} 
+0

事情是沒有一個按鈕。這只是在一個叫做答案棧的東西。我在代碼 – josh

+0

中設置了A,B,C,D感謝編輯,但由於它是集合視圖,因此它不知道它所在的集合視圖的索引。有沒有辦法做到這一點? – josh

+0

另外,什麼是hilightNewOne? – josh