2016-12-22 6 views
1

У меня есть UITableView и внутри tableViewCell у меня есть UICollectionView.Как оживить UITableViewCell с помощью Swift?

Мое требование - нажимать на кнопку первой ячейки таблицы. Мне нужно анимировать второй tableViewCell.

Ниже мой код: -

//Cell For Row at indexPath 
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    if (0 == indexPath.section) { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "FirstRowCell") as! FirstRowCell 
     cell.btnReview.addTarget(self, action: #selector(GotoReview), for: UIControlEvents.touchUpInside) 
     cell.btnMyProduct.addTarget(self, action: #selector(AnimateCollectionView), for: UIControlEvents.touchUpInside) 
     //cell. 

     return cell 
    } else if (1 == indexPath.section) { 
     let identifier = "TableCollectionCell" 
     var tableCollectionCell = tableView.dequeueReusableCell(withIdentifier: identifier) as? TableCollectionCell 

     if(tableCollectionCell == nil) { 
      let nib:Array = Bundle.main.loadNibNamed("TableCollectionCell", owner: self, options: nil)! 
      tableCollectionCell = nib[0] as? TableCollectionCell 
      tableCollectionCell?.delegate = self 
     } 

     return tableCollectionCell! 
    } else { 
     let identifier = "BrandImagesTableCell" 
     var brandImagesTableCell = tableView.dequeueReusableCell(withIdentifier: identifier) 

     if(brandImagesTableCell == nil) { 
      let nib:Array = Bundle.main.loadNibNamed("BrandImagesTableCell", owner: self, options: nil)! 
      brandImagesTableCell = nib[0] as? BrandImagesTableCell 
      } 

     //brandImagesTableCell. 
     return brandImagesTableCell! 
    } 
} 

В моем коде вы можете увидеть:

 if (0 == indexPath.section) 

В том, что у меня есть цель кнопки (#selector(AnimateCollectionView)).
Я хочу анимировать таблицуCollectionCell, которая находится по адресу (1 == indexPath.section).

Смотрите мой AnimateCollectionView метод: -

func AnimateCollectionView() { 
    let identifier = "TableCollectionCell" 
    var tableCollectionCell = tableView.dequeueReusableCell(withIdentifier: identifier) as? TableCollectionCell 

    if(tableCollectionCell == nil) { 
     let nib:Array = Bundle.main.loadNibNamed("TableCollectionCell", owner: self, options: nil)! 
     tableCollectionCell = nib[0] as? TableCollectionCell 
     tableCollectionCell?.delegate = self 
    } 

    tableCollectionCell?.alpha = 0 

    UIView.animate(withDuration: 1.50, animations: { 
     //self.view.layoutIfNeeded() 
     tableCollectionCell?.alpha = 1 
    }) 
} 
+0

Как вы хотите, чтобы вторая ячейка жила? вращаться? масштаб ? двигаться вправо? двигаться влево? – aircraft

+0

@aircraft Я хочу повернуть. Спасибо – kishor0011

+0

@Rob Спасибо за ответ. Не могли бы вы рассказать мне код. Спасибо – kishor0011

ответ

0

Если вы хотите, чтобы оживить его изменения, вы можете просто изменить некоторые переменные состояния, называют tableView.reloadRows(at:with:), и иметь свой cellForRowAt затем проверить эти переменные состояния, чтобы знать, что окончательное ячейка должна выглядеть (например, является ли она конфигурацией ячейки «до» или «после»).

Например, приведен пример с двумя ячейками, переключившими вторую ячейку от красных до синих ячеек.

class ViewController: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableView.register(UINib(nibName: "RedCell", bundle: nil), forCellReuseIdentifier: "RedCell") 
     tableView.register(UINib(nibName: "BlueCell", bundle: nil), forCellReuseIdentifier: "BlueCell") 
    } 

    @IBAction func didTapButton(_ sender: UIButton) { 
     isRedCell = !isRedCell 
     tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .fade) 
    } 

    var isRedCell = true 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 2 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if indexPath.row == 0 { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "ButtonCell", for: indexPath) 
      return cell 
     } else if indexPath.row == 1 { 
      if isRedCell { 
       let cell = tableView.dequeueReusableCell(withIdentifier: "RedCell", for: indexPath) 
       return cell 
      } else { 
       let cell = tableView.dequeueReusableCell(withIdentifier: "BlueCell", for: indexPath) 
       return cell 
      } 
     } 
     fatalError("There are only two rows in this demo") 
    } 

} 

Теперь, предполагая, что вы на самом деле нужно использовать NIBS вместо клеток прототипов, я бы зарегистрировать NIBS с Tableview как выше, вместо того cellForRow придется вручную экземпляр их сам. Аналогично, для моей ячейки с кнопкой я просто использовал ячейку прототипа в своем раскадровке и подключил кнопку непосредственно к моему @IBOutlet, полностью избегая NIB для этой ячейки.

Но все это не связано с вашей основной проблемой: вы можете создавать свои ячейки, как хотите. Но, надеюсь, это иллюстрирует основную идею, что при нажатии кнопки я не пытаюсь напрямую загрузить какие-либо ячейки, но я просто обновляю некоторую переменную состояния, которую cellForRow будет использовать, чтобы узнать, какую ячейку загружать, а затем сообщить tableView оживить перезагрузку этого IndexPath.

Кстати, из вашего примера я предположил, что для двух разных потенциальных ячеек для второй строки требуются разные NIB. Но если вы этого не сделали, это еще проще (используйте только один NIB и один идентификатор ячейки), но идея такая же, просто обновите переменную состояния и перезагрузите вторую строку анимацией.

+0

На самом деле есть 3 секции полностью так Я положил эти условия. Спасибо Позвольте мне попробовать. – kishor0011

+0

Что я должен делать в своем коде? Спасибо – kishor0011

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