2017-05-29 6 views
0

私の問題:スクロールすると、特定のセルのUILabels(質問の回答)のテキストが空白になります私のコードで見られるように、7番目のラベルは、常に1番目と2番目のラベルが設定されていて、魔法のように動作しているように見えます)。一部のセルでは、ほとんどのセルが最初にレンダリングされたときにのみ正しく表示されます(常にそうとは限りません)。テーブルビューのセルのUILabelのテキストは、スクロール時にセットされていてもスクロールしなくなります。

私はこれを数時間前から苦労しており、修正できないようです。私はそれがテーブルのセルの再利用と関係しているとは確信していますが、私のカスタムテーブルセルのdidSetブロックにデータを設定し、prepareForReuse()をここで示唆したようにオーバーライドしようとしました:Stop the reuse of custom cells Swift。何も動作していないようだが、私はまだtableViewをスクロールするときにテキストの一部を失ういくつかのセル(一部のみ、すべてではない)を持っている。私は何が欠けていますか?ここで

は私のカスタムセルクラス QuestionCustomCellため didSetブロックである(そして、それは場合に役立ちます、 NSLogプリントアウトは、私はスクロールダウン細胞であるべき正しいテキストを示していますが、それはレンダリングされません):

var cellQuestion: Question! { 
    didSet { 
     questionLabel.text = cellQuestion.topQuestion 
     questionLabel.sizeToFit() 
     //definitely at least 2 answers 
     switchLabel1.text = cellQuestion.theResponses[0] 
     switchLabel2.text = cellQuestion.theResponses[1] 
     if(cellQuestion.theResponses[2] == nil) { 
      switch3.isHidden = true 
      switchLabel3.isHidden = true 
     } else { 
      switch3.isHidden = false 
      switchLabel3.text = cellQuestion.theResponses[2] 
      let questionName : String = cellQuestion.topQuestion 
      NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[2]!) 
     } 
     if(cellQuestion.theResponses[3] == nil) { 
      switch4.isHidden = true 
      switchLabel4.isHidden = true 
     } else { 
      switch4.isHidden = false 
      switchLabel4.text = cellQuestion.theResponses[3] 
      let questionName : String = cellQuestion.topQuestion 
      NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[3]!) 
     } 
     if(cellQuestion.theResponses[4] == nil) { 
      switch5.isHidden = true 
      switchLabel5.isHidden = true 
     } else { 
      switch5.isHidden = false 
      switchLabel5.text = cellQuestion.theResponses[4] 
      let questionName : String = cellQuestion.topQuestion 
      NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[4]!) 
     } 
     if(cellQuestion.theResponses[5] == nil) { 
      switch6.isHidden = true 
      switchLabel6.isHidden = true 
     } else { 
      switch6.isHidden = false 
      switchLabel6.text = cellQuestion.theResponses[5] 
      let questionName : String = cellQuestion.topQuestion 
      NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[5]!) 
     } 
     if(cellQuestion.theResponses[6] == nil) { 
      switch7.isHidden = true 
      switchLabel7.isHidden = true 
     } else { 
      switch7.isHidden = false 
      switchLabel7.text = cellQuestion.theResponses[6] 
      let questionName : String = cellQuestion.topQuestion 
      NSLog("question: "+questionName+" response: "+cellQuestion.theResponses[6]!) 
     } 

     restorePriorAnswer() 
    } 
} 

そして、ここでrestorePriorAnswer()が(セルがスイッチがオフまたは再利用するときにあったかどうか覚えているので、私はそれを使用する - 仕事をすること)である。

func restorePriorAnswer () 
{ 
    if(cellQuestion.theAnswer != nil) 
    { 
     self.cellDelegate.restorePrior(forCell: self, forShortName: cellQuestion.shortName, subAction: "\(cellQuestion.theAnswer!.answerSelect)") 
     print("Prior answer was \(cellQuestion.theAnswer!.answerSelect)") 


     switch(cellQuestion.theAnswer!.answerSelect) 
     { 
     case 0: 
      switch1.isOn = true 
      break 
     case 1: 
      switch2.isOn = true 
      break 
     case 2: 
      switch3.isOn = true 
      break 
     case 3: 
      switch4.isOn = true 
      break 
     case 4: 
      switch5.isOn = true 
      break 
     case 5: 
      switch6.isOn = true 
      break 
     case 6: 
      switch7.isOn = true 
      break 
     default: 
      self.cellDelegate.restorePrior(forCell: self, forShortName: "Control", subAction: "restorePriorAnswer (Bad Select Value)") 
      break 
     } 
    } 
    else 
    { 
     switch1.setOn(false, animated: false) 
     switch2.setOn(false, animated: false) 
     switch3.setOn(false, animated: false) 
     switch4.setOn(false, animated: false) 
     switch5.setOn(false, animated: false) 
     switch6.setOn(false, animated: false) 
     switch7.setOn(false, animated: false) 
    } 

} 

そして、ここでは私のcellForRowAtIndexPathです:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell:QuestionCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuse, for: indexPath) as! QuestionCustomCell 
    if((currentQuestion?.canSubsume())!) { 
     if((currentQuestion?.shouldDoSubsume())!) { 
      //since this apparently refreshes random rows, we need to hard-code which row goes where 
      if(indexPath.row == 0) { 
       cell.cellQuestion = currentQuestion 
      } else { 
       let rowQuestion: Question = (currentQuestion?.getSubsumeList().getQuestion(shortID: currSubsumeArray![indexPath.row - 1]))! 
       cell.cellQuestion = rowQuestion 
      } 
     } else { 
      //there should only be one cell at this point - the first one 
      cell.cellQuestion = currentQuestion 
      //print out the first question, just to make sure... 
      let logStringOne : String = "the current question: " + (currentQuestion?.topQuestion)! 
      NSLog(logStringOne) 
      let logString : String = "the first subsumed question: " + (currentQuestion?.subsumeList!.firstQuestion)! 
      NSLog(logString) 
     } 
    } else { 
     cell.cellQuestion = currentQuestion 
    } 
    cell.selectionStyle = UITableViewCellSelectionStyle.none 
    cell.cellDelegate = self 
    return cell 
} 

問題を解決するのに役立つと思われるコードが見つからない場合は教えてください。それ以外のものはすべてラベルのほかに働きます。スイッチは、前後にスクロールするときにスイッチがオンかオフかを記憶しています。答え配列の適切なスロットがnilであれば、適切なスイッチは隠されています。回答のラベルのうち、問題があります。私が言及したように、私はprepareForReuse()メソッドを試しましたが、何もしなかったので、私はそれを取り出しました。

答えて

0

私はお詫びして、数時間顔を見つめていましたが、私はそれを認識しませんでした。

if(cellQuestion.theResponses[2] == nil) { 
    switch3.isHidden = true 
    switchLabel3.isHidden = true 
} else { 
    switch3.isHidden = false 
    switchLabel3.text = cellQuestion.theResponses[2] 
} 

が、細胞が新鮮なロードされたときelseブロックに、私は...それらを再表示しませんでした。彼らはこのように、使用されることになっていなかった場合、私はラベルを隠していたdidSetブロックで再利用されたわけではないため、ラベルは以前は隠されていなかったため問題はありませんでした。しかし、再利用されたセルでは、再利用されたセルではラベルが存在しませんでした。

したがって、これらのif/elseブロックのそれぞれには、switchLabelx.isHidden = falseがあり、xは適切な数値です。誰にでも何時間もコードを凝視したいとは思っていませんが、うまくいけば誰かがこれを役に立つと思うでしょう。

関連する問題