在表格视图内的集合视图中执行点击按钮

时间:2018-12-07 12:45:05

标签: swift uicollectionview delegates tableview

我在第二个单元格中有一个表格视图和一个集合视图。我在集合视图单元格中有一个按钮。

当单击集合视图中的按钮时,我想对另一个视图控制器执行segue。并传递数据。 (但只有按钮,没有单元格)

2 个答案:

答案 0 :(得分:0)

我想您有UICollectionViewCell的子类,里面有数据,因此您可以将按钮的操作添加到单元格中

class YourCell: UICollectionViewCell {
    ...
    var item: Item?
    ...
    @IBAction func buttonPressed(_ sender: UIButton) {
    }
    ...
}

现在创建您的单元的委托

protocol YourCellDelegate {
    func buttonPressed(pass data: Item)
}

并在您的单元格中创建委托变量

class YourCell: UICollectionViewCell {
    ...
    var delegate: YourCellDelegate?
    ...
}

然后在按钮操作中调用委托方法,并在需要时传递数据

@IBAction func buttonPressed(_ sender: UIButton) {
    delegate?.buttonPressed(pass: item!)
}

现在对YourCellDelegate实施UITableViewCell协议,并声明按下按钮时应发生的情况。为此,请创建您的UITableViewCell

的委托
protocol TableViewCellDelegate {
    func buttonInYourCellPressed(pass data: Item)

class TableViewCell: UITableViewCell, YourCellDelegate {
    ...
    var delegate: TableViewCellDelegate?
    ...
    func buttonPressed(pass data: Item) {
        delegate?.buttonInYourCellPressed(pass data: date)
    }
}

也在UITableViewCell内的集合视图数据源方法中,将单元格的委托设置为TableViewCell

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    ...
    cell.delegate = self
    ...
}

最终将您的TableViewCellDelegate实施到UIViewController并声明在按下集合视图中的按钮时应该发生什么

class ViewController: UIViewController, TableViewCellDelegate {
    ...
    func buttonInYourCellPressed(pass data: Item) {
        performSegue(withIdentifier: "identifier", sender: data)
    }
}

最后,在UITableView数据源方法cellForRowAt中将TableViewCell的委托设置为ViewController

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    ...
    cell.delegate = self
    ...
}

然后在prepare(for segue:的ViewController中,您只需将目标ViewController的属性分配给向下转换的发件人

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "identifier" {
        let destinationVC = segue.destination as! SecondViewController
        destinationVC.selectedItem = sender as! Item
    }
}

答案 1 :(得分:0)

如果您是在情节提要板上创建的单元格,则可以直接在主ViewController中创建@IBAction函数。

OR

如果您创建了xib,请尝试这种方式

您可以通过多种方式进行操作,但我更喜欢通过Notification。

进行操作。

尝试

首先,您必须在要执行segue的主控制器中添加观察者。就是这样:

NotificationCenter.default.addObserver(self, selector: #selector(self.testFunc(notification:)), name: Notification.Name("navigateToController"), object: nil)

这是您的主类的代码:

class YourMainViewController : UIViewController {

      @IBOutlet weak var tableView : UITableView!

      override func viewDidLoad() {
          super.viewDidLoad()
          NotificationCenter.default.addObserver(self, selector: #selector(self.testFunc(notification:)), name: Notification.Name("navigateToController"), object: nil)
    }

    @objc func testFunc(notification:Notification)  {
         let object = notification.object as! YourObjectType /// For ex : [String], Int, CustomModel, Any etc..
         let storyboard = UIStoryboard(name: "Main", bundle: nil)
         let viewController = storyboard.instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
         viewController.object = object
         self.navigationController?.pushViewController(viewController, animated: true)
    }
}

这是您的表格视图单元格类的代码:

class yourTableViewCell: UITableViewCell {

      func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "reuseIdentifier", for: indexPath) as! YourCollectionCell
            cell.yourCellButton.addTarget(self, action: #selector(self.actionCellButton()), for: .touchUpInside)
            return cell
      }

     @objc func actionCellButton() {
         let myArr = ["1","2","3"]
         NotificationCenter.default.post(name: Notification.Name("navigateToController"), object: myArr)
     }
}

单击按钮时,将调用 actionCellButton()函数,您可以从此处将数据传递到通知对象中。

在调用 actionCellButton()函数之后,将调用 testFunc(),您将收到在 actionCellButton()中传递的数据。 函数和代码将被执行。