2017-11-15 15 views
0

私は被験者の質問音が複雑であることを知っています。私は問題を簡素化するために最善を尽くします。UITableViewCellがSwiftを使用して展開されていないときにもUIButton Imageを変更するにはどうすればよいですか?

私はUITableViewにUIButtonを持っています。 UITableViewCellは、UITableView用に構成されています。私はUIViewController内でUIButtonアクションを使用していますが、私は、単純に行の高さを変更し、いくつかの優先度の制約の操作でUITableViewCellsの崩壊/非展開を設定しました。アンコラップ処理が行われると、セルの下に追加情報が表示されます。これまでのところすべてが完璧に機能します。

UIButtonの折りたたみ既定の状態をクリックすると、UIButtonイメージが別のUIButtonイメージに変更されます。そして、UIButtonのuncollapseをクリックすると、最初のセルに戻ります。これは逆もまた同様です。だから、私は行の高さを変更するたびに推測している、UITableViewは、前に行った変更が表示されないようにセルを再作成します。ここで

は、関連するコードです:以下

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "FavCell", for: indexPath) as? FavCell else { return UITableViewCell() } 

if let data = UserDefaults.standard.data(forKey: selectedCur), 
    let storedCurrencies = NSKeyedUnarchiver.unarchiveObject(with: data) as? [SelectedCurrency] { 
    selectedCurrencies = storedCurrencies 
    // SORT BY RANK 
    selectedCurrencies.sort(by: { $0.rank! < $1.rank! }) 
     if selectedCurrencies.count > 0 { 
      // CATCH ANY NIL VALUES AND PREVENT APP CRASHES 
      let noVal = selectedCurrencies[indexPath.row].rank ?? 0 
      let nameVal = selectedCurrencies[indexPath.row].name ?? "N/A" 
      let symbolVal = selectedCurrencies[indexPath.row].symbol ?? "N/A" 

      cell.configureCell(no: "\(noVal)", name: nameVal, symbol: symbolVal) 
     } 
    } 
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if collapseIndex == indexPath.row { 
     collapseIndex = -1 
    } else { 
     collapseIndex = indexPath.row 
    } 

    tableView.beginUpdates() 
    tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.automatic) 
    tableView.endUpdates() 
} 

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    if collapseIndex == indexPath.row { 
     return 280 // When collapsed cell view displayed - Number will be adjusted after 
    } else { 
     return 120 // Height of initial cell contents that fits 
    } 
} 

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return true 
} 

私はUIButtonsの画像を変更する方法です:

class NotificationBtn: UIButton { 
var bellToggle = Int() 
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    if bellToggle == 1 { 
     self.transform = CGAffineTransform(scaleX: 1.25, y: 1.25)    // Bounce 
     self.setImage(UIImage(named: "bell_off"), for: .normal) 
     UIView.animate(withDuration: 1.2, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 6, options: .allowUserInteraction, animations: { self.transform = CGAffineTransform.identity }, completion: nil) 
     curImg = self.image(for: .normal)! 
     bellToggle = 2 

     super.touchesBegan(touches, with: event) 

    } else { 
     self.transform = CGAffineTransform(rotationAngle: 25 * 3.14/180.0) // Rotate via 25 degree - Bell ringing animation 
     self.setImage(UIImage(named: "bell_on"), for: .normal) 

     UIView.animate(withDuration: 1.2, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 6, options: .allowUserInteraction, animations: { self.transform = CGAffineTransform.identity }, completion: nil) 

     curImg = self.image(for: .normal)! 
     bellToggle = 1 

     super.touchesBegan(touches, with: event) 
    } 
} 
} 

はお時間をいただき、ありがとうございます。

+0

'cellForRow'メソッドを表示できますか? – trungduc

+0

要請が追加されました。 – sc13

+0

このメソッドの 'configureCell'でボタンの画像を更新しましたか? – trungduc

答えて

1

あなたは正しく推測しました。 reloadRowsメソッドを呼び出すと、cellForRowAtが呼び出され、リロードするセルが別のセルに置き換えられます。セルが交換されたので、表示されたボタンは別のボタンです。だからあなたはボタンのイメージが間違っている。

修正するにはcellForRowAtメソッドでボタン画像を確認してcollapseIndexに更新してください。私はそれがうまくいくと思います。たとえば、cellForRowAtの中で、セルを作成した後

if collapseIndex == indexPath.row { 
    // Updated button with collapse state image 
} else { 
    // Updated button with uncollapse state image 
} 
関連する問題