在没有Controller

时间:2015-10-20 00:38:46

标签: ios swift uitableview uiviewcontroller segue

我有一个UITableView类,我放在多个ViewControllers中。

我想在用户didSelectRowAtIndexPath

时转到另一个ViewController

但是,因为UITableView类是独立的,所以我无法从类中以编程方式触发segues,因为selfself.performSegueWithIdentifier中的self.showViewController引用了UITableView。 / p>

我知道ViewControllers应该负责segues,但我无法从给定的ViewController访问didSelectRowAtIndexPath(因为它不管理UITableView)。

如何从不从ViewController继承的UITableView中删除?

2 个答案:

答案 0 :(得分:1)

您需要一种方法告诉视图控制器已选择表视图上的一行,以便视图控制器可以执行segue。

委托是启用此通信的好方法。

  1. 定义委托协议。

     protocol TableRowSelectionDelegate: class {
         func tableRowSelected(rowValue: String)
     }
    
  2. 在表视图类中定义委托变量。

    var tableRowSelectionDelegate: TableRowSelectionDelegate?
    
  3. 在表视图类中,选择表行时,调用委托,传递行值(即模型中与所选索引路径对应的数据)。使用可选?运算符,如果未设置委托,则不会发生任何不良事件。

    tableRowSelectionDelegate?.tableRowSelected(rowValue)
    
  4. 将协议添加到视图控制器。

    class ViewController: UIViewController, TableRowSelectionDelegate
    
  5. 在视图控制器中,将其设置为表视图类的委托。

    tableViewClass.tableRowSelectionDelegate = self
    
  6. 在视图控制器中实现协议。

    func tableRowSelected(rowValue: String) {
        //perform the segue here...
        //  if necessary, pass the row value to the destination
        //  view controller before performing the segue
    }
    
  7. 此委托协议现在可以由使用表视图类的所有视图控制器实现,并且每个视图控制器都可以响应它想要的。也许你不会总是想要贬低。让代表决定。

答案 1 :(得分:0)

首先,我想推荐Apple的文档Adding a Segue Between Scenes in a Storyboard

您肯定将UITableView放在视图控制器上并在故事板上设置UITableViewDelegate,UITableViewDataSource,以便您的视图控制器可以知道用户选择哪一行。