我有一个通用视图控制器,底部有一个按钮,上面有一个容器视图。容器视图中嵌入了一个表视图,支持多个选择。当在tableview中选择了一个或多个东西时,我希望按钮出现(从底部向上滑动)并获取在tableview中选择的数据并使用它来触发来自一般视图控制器的请求。但我的问题是如何从该表视图控制器获取数据?
General
View Controller
| |
| |
|container|-----> table view controller
| |
| |
| |
|_________|
| btn |
这是我所发生的事情的粗略草图。我正在使用容器视图,因此我可以将按钮和其他UI元素自由添加到整个视图中。如果我在表视图控制器中选择了数组/列表,我该如何将其发送回General View Controller?我是否必须在General View Controller中使用数组/列表,并在Table View Controller中使用某种代理来获取所选项并将其添加到GVC中?
答案 0 :(得分:1)
使用委托模式。
在ViewController.swift
:
protocol MyTableDelegate {
func rowSelected()
}
class ViewController: UIViewController, MyTableDelegate {
@IBOutlet weak var container: UITableViewController!
var container: MyTable?
...
func rowSelected() {
// show my amazing button
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "myAmazingTable" {
self.container = (segue.destination as! MyTable)
self.container!.delegate = self
}
}
在Table.swift
:
class MyTable: UITableViewController {
var delegate: MyTableDelegate?
func rowWasSelected() {
delegate!.rowSelected()
}
}
答案 1 :(得分:0)
除了使用委托模式之外,Swift还可以轻松地对单个回调用例使用闭包回调,其中协议可能会感觉有点开销:
class SelectionViewController: UIViewController {
var itemsSelected: (([Item]) -> Void)!
...
tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
itemsSelected(itemsForSelectedRows)
}
...
private var itemsForSelectedRows: [Item] {
// Return the list of selected items based on e.g. tableView.indexPathsForSelectedRows
}
}
class GeneralViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? SelectionViewController {
// Note [weak self] to prevent a reference cycle between the two controllers
controller.itemSelected = { [weak self] items in
self?.fireOffRequestSomewhere(items)
}
}
}
}