如何在从笔尖创建的UITableViewCell中触发按钮上的segue操作?

时间:2017-11-13 03:12:31

标签: ios swift

现在我正在从nib文件创建一个表格视图单元格。我在这个nib文件中有一个按钮。我希望此按钮触发故事板上特定视图控制器的segue。

看起来非常简单,除了这个nib文件在我的应用程序中的不同视图控制器上的许多不同表中使用,我希望按钮链接到每个实例中的相同目标视图控制器。此外,目标视图控制器还包含一个将此nib文件作为单元格的表,这意味着它还需要链接到自身。

由于这些原因,我希望如果有一个解决方案包含这个代码到UITableViewCell子类的nib文件。 (但我怀疑这是可能的。)

我想要的功能的一个很好的例子是Instagram。想想Instagram上几个不同的标签如何有表格的表格如下:

enter image description here

并且无论您使用哪个标签,单击此单元格左上角的用户名即可转换到用户视图控制器,即使您已经在用户视图控制器中:

enter image description here

3 个答案:

答案 0 :(得分:1)

这里你可以这样做:

1)无需提供标签 2)获取按钮位置并根据该位置执行任务 3)ProductStarImage //是我的按钮名称

第1步:

 //IBOutlets
    @IBOutlet weak var CategoriesTableView: UITableView!

 //TableCell identifier
    let cellReuseIdentifier = "Cell"
    var cell = CustomTableCellClass()

第2步:在TableView的cellForRowAt中

  //setting cell data
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = self.CategoriesTableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! CustomTableCellClass

    cell.layer.shadowColor = UIColor.gray.cgColor
    cell.layer.shadowRadius = 2

    //add a action to button 
    cell.ProductStarImage.addTarget(self, action: #selector(CategoriesVC.FavouriteButtonHandler(sender:)), for: .touchUpInside)


    return cell
}

第2步:按钮处理程序

//Favourite button Action Handler
    @objc func FavouriteButtonHandler (sender: UIButton) {

        //assign current cell to global cell declared //dequeue
        cell = self.CategoriesTableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! CustomTableCellClass
        //get CGPoint of button selected
        let buttonPosition : CGPoint = sender.convert(CGPoint.zero, to: self.CategoriesTableView)
        //get indexPath from CGPoint of Button
        let indexPath : IndexPath = self.CategoriesTableView.indexPathForRow(at: buttonPosition)!
        //Now assign selected cell indexPath to Cell declared globally 
        cell = self.CategoriesTableView.cellForRow(at: indexPath)! as! CustomTableCellClass


    //here perform action required 
    like - cell.ProductStarImage //any action

    self.CategoriesTableView.reloadRows(at: [indexPath], with: .none)
}

答案 1 :(得分:0)

将addTarget用于您的按钮。

将此代码放在tableView的cellForRowAt方法中。

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

    guard let cell = tableView.dequeueReusableCell(withIdentifier: "YOUR_ID", for: indexPath) as? InstagramCell else { return }
    cell.nasaBtn.addTarget(self, action: #selector(firstViewController.nasaBtnPressed(_:)), for: .touchUpInside)
    return cell

}

@objc func nasaBtnPressed(_ sender: UIButton) {
    performSegue(withIdentifier: "NASA_PROFILEID", sender: nil)
}

答案 2 :(得分:0)

您可以使用创建协议来返回要导航到的所需ViewController。您只需要使自定义单元符合协议并返回所需的视图控制器或故事板标识符。一旦在didSelect方法中完成,您可以尝试将其作为该协议进行投射。如果成功则按下所需的视图控制器。请查看下面的代码,我使用故事板标识符来获取所需的视图控制器

protocol CustomCellNavigator {
    var identifier: String { get }
}

class YourViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var myTableView: UITableView!

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourIdentifier", for: indexPath) as! CustomCell
        cell.destinationStoryBoardIdentifier = "YourIdentifier"
        return cell
    }

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

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if let cell = myTableView.cellForRow(at: indexPath) as? CustomCellNavigator {
            if let viewcontroller = storyboard?.instantiateViewController(withIdentifier: cell.identifier) {
                navigationController?.pushViewController(viewcontroller, animated: true)
            }
        }
    }
}

class CustomCell: UITableViewCell, CustomCellNavigator {

    var identifier: String {
        get { return destinationStoryBoardIdentifier }
    }

    // You can replace with whatever logic you want to use for
    // finding the required viewcontroller
    // I have just used a storyboard identifier here
    var destinationStoryBoardIdentifier = "YourViewController"
}