如何从容器视图中的嵌入式控制器获取数据

时间:2017-05-01 19:54:21

标签: swift uitableview swift3 uicontainerview

我有一个通用视图控制器,底部有一个按钮,上面有一个容器视图。容器视图中嵌入了一个表视图,支持多个选择。当在tableview中选择了一个或多个东西时,我希望按钮出现(从底部向上滑动)并获取在tableview中选择的数据并使用它来触发来自一般视图控制器的请求。但我的问题是如何从该表视图控制器获取数据?

General
View Controller   
|         |
|         |
|container|-----> table view controller
|         |
|         |
|         |
|_________|
|   btn   |

这是我所发生的事情的粗略草图。我正在使用容器视图,因此我可以将按钮和其他UI元素自由添加到整个视图中。如果我在表视图控制器中选择了数组/列表,我该如何将其发送回General View Controller?我是否必须在General View Controller中使用数组/列表,并在Table View Controller中使用某种代理来获取所选项并将其添加到GVC中?

2 个答案:

答案 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)
             }
        }
    }
}