如何将自定义委托设置为 UITableViewController?
How to set custom delegate to UITableViewController?
我的 tableview 中的一个单元格将我带到另一个 UITableViewController,我必须在其中 select 一个选项。
我试图将第一个 viewcontroller 设置为 UITableViewController 的委托,但它不起作用,我需要传递所选数据。
我认为它不起作用,因为对于 UITableViewControllers,您没有设置委托,因为它们自动成为自己的委托。
那我该怎么做呢?
我在 self.navigationController?.popViewController(animated: true)
之前返回,这样我就不会丢失已经在第一个 viewcontroller 中填写的信息。
有没有办法为 UITableViewController 设置自定义委托,或者我应该将 tableview 放在常规 viewcontroller?
谢谢
您正在将 UITableView
的 delegate
设置为您的第一个控制器。不要那样做,这个 delegate
已经默认设置为 UITableViewController
.
相反,使用回调闭包来传递数据:
class TVC: UITableViewController {
var itemSelected: (Item) -> Void = { _ in }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
itemSelected(dataSourceArray[indexPath.row])
}
}
并且在第一个视图控制器中,当您 presenting/pushing 时关闭此控制器
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
// ...
}
}
}
我的 tableview 中的一个单元格将我带到另一个 UITableViewController,我必须在其中 select 一个选项。
我试图将第一个 viewcontroller 设置为 UITableViewController 的委托,但它不起作用,我需要传递所选数据。
我认为它不起作用,因为对于 UITableViewControllers,您没有设置委托,因为它们自动成为自己的委托。
那我该怎么做呢?
我在 self.navigationController?.popViewController(animated: true)
之前返回,这样我就不会丢失已经在第一个 viewcontroller 中填写的信息。
有没有办法为 UITableViewController 设置自定义委托,或者我应该将 tableview 放在常规 viewcontroller?
谢谢
您正在将 UITableView
的 delegate
设置为您的第一个控制器。不要那样做,这个 delegate
已经默认设置为 UITableViewController
.
相反,使用回调闭包来传递数据:
class TVC: UITableViewController {
var itemSelected: (Item) -> Void = { _ in }
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
itemSelected(dataSourceArray[indexPath.row])
}
}
并且在第一个视图控制器中,当您 presenting/pushing 时关闭此控制器
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
// ...
}
}
}