如何将自定义委托设置为UITableViewController?

时间:2019-03-21 19:58:15

标签: ios swift uitableview delegates protocols

tableview中的一个单元格将我带到另一个UITableViewController,在其中必须选择一个选项。 我试图将第一个viewcontroller设置为UITableViewController的委托,但是它不起作用,并且我需要传递所选的数据。 我认为这是行不通的,因为对于UITableViewControllers,您没有设置委托,因为它们自动是自己的委托。 那我该怎么办呢? 我回过self.navigationController?.popViewController(animated: true),所以我不会丢失第一个ViewController中已经填写的信息。 有没有一种方法可以为UITableViewController设置自定义委托,还是应该将tableview放在常规的viewcontroller中?

谢谢

1 个答案:

答案 0 :(得分:2)

您正在将delegate中的UITableView设置为第一个控制器。不要这样做,delegate已默认设置为UITableViewController


相反,要传递数据,请使用回调闭包:

class TVC: UITableViewController {

    var itemSelected: (Item) -> Void = { _ in }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        itemSelected(dataSourceArray[indexPath.row])
    }
}

,并且在第一个视图控制器中,当您演示/推动它时,设置该控制器的关闭状态

let vc = TVC(...)
vc.itemSelected = { item in // this is called when you call `itemSelected` from `TVC`
    // ... declare what will happen after item is selected
}
navigationController?.pushViewController(vc, animated: true)

或者如果您使用的是segues

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "identifier" {
        let destination = segue.destination as! TVC
        destination.itemSelected = { item in
            // ...
        }
    }
}