我在第二个单元格中有一个表格视图和一个集合视图。我在集合视图单元格中有一个按钮。
当单击集合视图中的按钮时,我想对另一个视图控制器执行segue。并传递数据。 (但只有按钮,没有单元格)
答案 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()中传递的数据。 函数和代码将被执行。