Как получить индекс по нажатию кнопки ячейки представления коллекции, которая находится внутри ячейки представления таблицы - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть collectionView, встроенный в ячейку tableView.CollectionView имеет несколько элементов, которые содержат кнопку.Источник данных Collection Collection и делегаты устанавливаются в UITableViewCell.Для этого мне нужно выполнить какое-то действие, основанное на выборе кнопки, мне нужно знать indexPath ячейки collectionView и indexPath ячейки tableView.Но не в состоянии сообразить, как этого добиться.Пробовал использовать делегаты, но не знаю, как получить ссылку на collectionView в методе делегата.

Ячейка CollectionView

protocol SelectedItemCellDelegate:class {
func deleteButtonDidTapped(_ cell: SelectedItemCell)
}
 class SelectedItemCell: UICollectionViewCell {
class var identifier: String{
    return String(describing: self)
}
class var nib: UINib{
    return UINib(nibName: identifier, bundle: nil)
}
@IBOutlet weak var deleteButton: UIButton!
weak var delegate: SelectedItemCellDelegate?
override func awakeFromNib() {
    super.awakeFromNib()
}

@IBAction func deleteAction(_ sender: Any) {
    delegate?.deleteButtonDidTapped(self)
}
}

ViewController

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier:SelectedItemCell.identifier, for: indexPath) as! SelectedItemCell
cell.delegate = self                        
return cell
  }

 extension PrescriptionVC: SelectedItemCellDelegate
{   
    func deleteButtonDidTapped(_ cell: SelectedItemCell) 
    {
      // Need tableview indexPath as well SelectedItemCell indexPath.
    }
}

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

Вам нужно два делегата

protocol selectCollectionCellDelegate {

 func selectCell(cell : UICollectionViewCell )     

}

protocol selectTableCellDelegate {

 func selectTableCell(cell : UITableViewCell , indexPath : IndexPath )

}



class YourCollectionViewCell : UICollectionViewCell {

  var tvcDelegate : selectCollectionCellDelegate


@IBAction func deleteAction(_ sender: Any) {
    tvcDelegate.selectCell(cell : self)
 }

}



class YourTableViewCell : UITableViewCell , selectCollectionCellDelegate {

  var vcDelegate : selectTableCellDelegate

 func selectCell(cell : UICollectionViewCell ){

     let indexPath : IndexPath = collectionView.indexPath(for: cell)!

     delegate.selectTableCell(cell : self , indexPath : indexPath  )
  } 

}






class YourviewController : UIViewController , selectTableCellDelegate{


 func selectTableCell(cell : UITableViewCell , indexPath : IndexPath){
   //indexPatn is IndexPath of collectionViewCell
   let tableCellindexPath : IndexPath = tableView.indexPath(for: self)!
  } 

}
0 голосов
/ 23 ноября 2018

Вам не рекомендуется использовать делегатов и просматривать математику в Swift для этой цели .Используйте простое закрытие обратного вызова

В ячейке удалите код, связанный с протоколом, объявите закрытие и вызовите его при нажатии кнопки

class SelectedItemCell: UICollectionViewCell {
    class var identifier: String{
        return String(describing: self)
    }
    class var nib: UINib{
        return UINib(nibName: identifier, bundle: nil)
    }
    @IBOutlet weak var deleteButton: UIButton!

    var callback : (()->Void)?

    @IBAction func deleteAction(_ sender: Any) {
        callback?()
    }
}

В контроллере установите закрытие и дескрипторобратный вызов, путь индекса фиксируется.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier:SelectedItemCell.identifier, for: indexPath) as! SelectedItemCell
    cell.callback = {
        print("button pressed", indexPath)
    }                        
    return cell
}
0 голосов
/ 22 ноября 2018

В методе IBAction вы можете получить триггерную кнопку в параметре отправителя.Перепишите свой метод делегата, чтобы передать кнопку и выбранную ячейку представления коллекции:

протокол SelectedItemCellDelegate: class {func deleteButton (_ deleteButton: UIButton, tappedInCell cell: SelectedItemCell)}

Перезаписать свой deleteActionпередать отправителя как UIButton класс (или любой UIView класс)

@IBAction func deleteAction(_ sender: UIButton) {
    delegate?. deleteButton(sender, tappedInCell: self)
}

Затем вы можете добавить расширения как к UICollectionView, так и к UITableView, которые позволят вам определить ячейку, содержащую кнопку, используя координаты кнопки:

extension UICollectionView {
    func indexPathForCellContaining( view: UIView) -> IndexPath? {
        let viewCenter = self.convert(view.center, from: view.superview)
        return self.indexPathForItem(at: viewCenter)
    }
}

Или для табличных представлений:

public extension UITableView {

    /**
     This method returns the indexPath of the cell that contains the specified view
     - Parameter view: The view to find.
     - Returns: The indexPath of the cell containing the view, or nil if it can't be found
     */

    func indexPathForView(_ view: UIView) -> IndexPath? {
        let center = view.center

        //The center of the view is a better point to use, but we can only use it if the view has a superview
        guard let superview = view.superview else {
            //The view we were passed does not have a valid superview.
            //Use the view's bounds.origin and convert from the view's coordinate system
            let origin = self.convert(view.bounds.origin, from: view)
            let indexPath = self.indexPathForRow(at: origin)
            return indexPath
        }
        let viewCenter = self.convert(center, from: superview)
        let indexPath = self.indexPathForRow(at: viewCenter)
        return indexPath
    }
}

Поскольку вы уже передали ячейку представления коллекции делегату, вы можете использовать func indexPath(for cell: UICollectionViewCell), чтобы получить indexPath для ячейки CollectionView.Если вы можете получить указатель на табличное представление, вы можете использовать указанное выше расширение табличного представления, чтобы получить индексный путь кнопки из табличного представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...