在一个ViewController中处理两个tableView的didSelectRowatindexPath

时间:2015-03-13 16:19:01

标签: ios uitableview swift

我在同一个视图控制器中有两个表视图。我在顶级表视图中显示作者。当我选择作者时,相应的作者书应该显示在底部的表格视图中(书籍列表)。

如何在单视图控制器中处理这两个表视图的tableView:didSelectRowAtIndexPath:

任何人都可以帮助我完成这项任务。

1 个答案:

答案 0 :(得分:0)

UITableViewDelegate方法的函数原型如下:

  

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

第一个参数是选择行的UITableView。因此,在您的实现中,您可以执行以下操作:

// Assuming you have two instances in your viewcontroller like this
var tableViewOne: UITableView!
var tableViewTwo: UITableView!

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if tableView == tableViewOne {
        // User selected a row in tableviewOne
    } else if tableView == tableViewTwo {
        // User selected a row in tableviewTwo
    }
}

如果您的代码变得混乱,因为您将两个UITableViewDelegate的逻辑组合到一个视图控制器中,那么您当然也可以创建单独的对象。

class FirstTableViewDelegate: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // User selected a row in tableviewOne
    }
}

class SecondTableViewDelegate: UITableViewDelegate {
    func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        // User selected a row in tableviewTwo
    }
}

class YourViewController: UITableViewController {
    var firstDelegate: FirstTableViewDelegate!
    var secondDelegate: SecondTableViewDelegate!

    override func viewDidLoad() {
        firstDelegate = FirstTableViewDelegate()
        tableViewOne.delegate = firstDelegate

        secondDelegate = SecondTableViewDelegate()
        tableViewTwo.delegate = secondDelegate
    }
}

请注意,必须将代理保存在您自己的UIViewController中的实例变量中。如果您只是在本地创建它们或仅将它们分配给UITableView,那么它们将立即被释放,因为该委托是weak引用。