2017-01-16 2 views
2

Мне нужно изменить цвет фона в расширяемой ячейке просмотра таблицы, когда он выбран. То, что я сделал, я разместил три ячейки UIV в ячейке. Когда будет выбран первый вид в ячейке, остальные два вида будут расширены. Это работает. Теперь, когда ячейка выбрана, мне нужно изменить цвет первого представления. Используется следующий код, он изменяет цвет третьего вида в ячейке. Но я хочу, чтобы первое представление изменилось и осталось оранжевым, пока не будет выбрана другая ячейка. Может ли кто-нибудь помочь?Как изменить цвет фона выбранной расширяемой ячейки вида таблицы

import UIKit 
import CoreData 

class NewTableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate{ 

    let viewObj = CustomCellTableViewCell() 
    let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 

    @IBOutlet weak var tableView: UITableView! 
    var selectedIndex = -1 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return totalCustomer().0 
    } 

    func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) ->CGFloat 
    { 
     if(selectedIndex == indexPath.row) { 
      return 160; 
     } 
     else { 
      return 40; 
     } 
    } 

    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) ->UITableViewCell{ 
      print("entered") 
      let cellIdentifier = "Cell" 
      let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as! CustomCellTableViewCell 
      let row = indexPath.row 
      var nameArray = [String]() 
      nameArray = totalCustomer().1 
      cell.firstViewLabel.text = nameArray[row] 
      var emailArray = [String]() 
      emailArray = totalCustomer().2 
      cell.secondViewLabel.text = emailArray[row] 

      return cell 
     } 

     func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { 
     let cell = tableView.cellForRow(at: indexPath) 
     cell?.contentView.backgroundColor = UIColor.orange 
     cell?.backgroundColor = UIColor.orange 
     } 

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
     {    
      if(selectedIndex == indexPath.row) { 
       selectedIndex = -1 
      } else { 
       selectedIndex = indexPath.row 
      } 
      self.tableView.beginUpdates() 
      self.tableView.reloadRows(at: [indexPath as IndexPath], with: UITableViewRowAnimation.automatic) 
      self.tableView.endUpdates() 
     } 

     func totalCustomer()->(Int,[String],[String]) 
     { 
      let request: NSFetchRequest<Customers> = Customers.fetchRequest() 
      var customerList = [String]() 
      var customerEmailList = [String]() 
      var customerCount = 0 
      do { 
      let results = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>) 
      print(results.count) 
      if results.count > 0 
      { 
       for _ in 0..<results.count 
       { 
        let match = results[customerCount] as! NSManagedObject 
        print(match.value(forKey: "name") as! String) 
        customerList.append(match.value(forKey: "name") as! String) 
        customerEmailList.append(match.value(forKey: "email") as! String) 
        customerCount = customerCount + 1 
       } 
      } 
      else 
      { 
        //statusLabel.isHidden = false 
      } 

      } 
      catch let error 
      { 
       print("Label\(error.localizedDescription)") 
      } 
      print(customerCount) 
      return (customerCount,customerList,customerEmailList) 
     } 


} 

import UIKit 
class CustomCellTableViewCell: UITableViewCell { 

    @IBOutlet weak var firstView: UIView! 
    @IBOutlet weak var firstViewLabel: UILabel! 
    @IBOutlet weak var secondView: UIView! 
    @IBOutlet weak var secondViewLabel: UILabel! 
    @IBOutlet weak var thirdView: UIView! 
    @IBOutlet weak var thirdViewLabel: UILabel! 

    @IBOutlet weak var secondHeightConstraint: NSLayoutConstraint! 
    @IBOutlet weak var thirdHeightConstraint: NSLayoutConstraint! 



    override func awakeFromNib() { 
     super.awakeFromNib() 
     secondView.layer.borderWidth = 0.1 
     secondView.layer.borderColor = UIColor.black.cgColor 
     thirdView.layer.borderWidth = 0.1 
     thirdView.layer.borderColor = UIColor.black.cgColor 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

    } 
    var showsDetails = false { 
     didSet { 
      secondHeightConstraint.priority = showsDetails ? 250 : 999 
      thirdHeightConstraint.priority = showsDetails ? 250 : 999 

     } 
    } 
} 
+1

Пожалуйста, проверьте мой ответ и дайте мне знать, если это то, что вы ищете. – KrishnaCA

+0

приветствуется :) – KrishnaCA

+0

Пожалуйста, уточните мой отредактированный ответ – KrishnaCA

ответ

2

Учитывая, что вы храните ваши выбранный IndexPath.row в selectedIndex и ваш firstView общедоступен и вы перезагрузить свой UITableView после выбора ячейки, следующий дополнительный код в cellForRowAt методе должен быть достаточно.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell{ 

    if self.selectedIndex == indexPath.row { 
     cell.firstView.backgroundColor = UIColor.yellow // selected color 
    }else { 
     cell.firstView.backgroundColor = UIColor.blue // default color 
    }  
} 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{  
     var indexPathArray: [IndexPath] = [] 
     if selectedIndex != -1 { 
     indexPathArray.append(IndexPath(row: selectedIndex, section: 0)) // previous selected row 
     }   
     if(selectedIndex == indexPath.row) { 
      selectedIndex = -1 
     } else { 
      selectedIndex = indexPath.row 
      indexPathArray.append(indexPath) // currently selected row 
     } 
     self.tableView.beginUpdates() 
     if indexPathArray.count > 0 { 
     self.tableView.reloadRows(at: indexPathArray, with: UITableViewRowAnimation.automatic) 
     } 
     self.tableView.endUpdates() 
} 
+0

Цвет меняется правильно, когда мы выбираем ячейку. но при нажатии на другую ячейку предыдущая выбранная ячейка остается с тем же оранжевым цветом. Чтобы вернуть его к нормальному цвету (синий), нам нужно снова выбрать ту же ячейку. –

+0

@ KarthikeyanSk, извиняюсь. Я думал, что вы вызываете 'self.tableView.reloadData()'. Пожалуйста, проверьте мой отредактированный ответ и дайте мне знать, если он разрешит проблему. – KrishnaCA

+0

Это отлично работает :) Спасибо! –

1

Переместить цвет, изменяющий вход в метод cellForRowAt.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->UITableViewCell{ 

    if self.selectedIndex == indexPath.row { 
     cell.firstView.backgroundColor = UIColor.orange // Highlight color 
    }else { 
     cell.firstView.backgroundColor = UIColor.blue // Original color 
    }  
} 

Не забудьте обновить предыдущую строку и удалить цвет фона:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
     { 
      previousIndex = selectedIndex   
      if(selectedIndex == indexPath.row) { 
       selectedIndex = -1 
      } else { 
       selectedIndex = indexPath.row 
      } 
      var myPrevIP = IndexPath(row: previousIndex, section: indexPath.section) 
      var indexPathArray: [Any] = [myPrevIP, indexPath] 
      self.tableView.beginUpdates() 
      self.tableView.reloadRows(at:indexPathArray,with: UITableViewRowAnimation.automatic) 
      self.tableView.endUpdates() 
     } 
+0

Не могли бы вы отредактировать строки NSIndexPath и NSArray для быстрого 3. Благодаря! –

+0

@ KarthikeyanSk, Done. спасибо за указание. – RavikanthM

1

UITableView уже есть механизм выбора реализован.

В вашей камере, вы можете контролировать свой цвет фона:

class MyCustomCell: UITableViewCell { 
    @IBInspectable var normalColor: UIColor = UIColor.white 
    @IBInspectable var highlightedColor: UIColor = UIColor.red 
    @IBInspectable var selectedColor: UIColor = UIColor.blue 

    override func setHighlighted(_ highlighted: Bool, animated: Bool) { 
     super.setHighlighted(highlighted, animated: animated) 
     refreshBackground() 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
     refreshBackground() 
    } 

    func refreshBackground() { 
     if isHighlighted { 
      backgroundColor = highlightedColor 
     } 
     else if isSelected { 
      backgroundColor = selectedColor 
     } 
     else { 
      backgroundColor = normalColor 
     } 
    } 
} 

И с помощью @IBInspectable в ячейки позволяет вам настроить цвета непосредственно в раскадровке.

Смежные вопросы