【发布时间】:2016-10-23 16:26:29
【问题描述】:
我一直在研究委托的工作方式。您在控制器 A 中定义协议,创建委托变量,并通过委托调用函数。然后,在控制器 B 中,遵循协议,实现方法,然后使用 prepareForSegue 告诉控制器 A,控制器 B 是委托。
但这涉及到A -> B -> A。我需要知道如何做A -> B。我一直在尝试通过以下代码来做到这一点:
在控制器 A 中声明协议
protocol CellDataDelegate {
func userDidTapCell(data: String)
}
在A中创建一个委托变量
var cellDelegate: CellDataDelegate? = nil
点击单元格时调用 A 中委托中的函数
if cellDelegate != nil {
let cellKey = keys[indexPath.row].cellKey
cellDelegate?.userDidTapCell(data: cellKey)
self.performSegue(withIdentifier: "showDetails", sender: self)
}
将委托添加到控制器B并符合方法
class DetailsVC: UIViewController, CellDataDelegate
功能:
func userDidTapCell(data: String) {
useData(cellKey: data)
}
这里的问题是委托过程的最后一部分。我不能使用 prepareForSegue 来执行 controllerA.delegate = self 部分,因为我不想回到控制器 A,我需要留在控制器 B。那么我如何告诉控制器 A B 是委托?
【问题讨论】:
-
我不明白这里的委托与 segue 有什么关系。执行的转场是在界面构建器中设置的转场,您为转场做的准备不会影响您最终进入哪个视图控制器?我是否误解了您要做什么?
-
你能更清楚地解释你想要做什么吗?您希望哪个控制器成为什么的代表,以及您尝试执行哪些 segue?
-
@IlyaLapan 当我点击一个单元格时,我的目标是从一个控制器到另一个控制器,同时将数据从第一个控制器传递到第二个控制器。去控制器是没有问题的,它是通过委托部分传递数据。根据this 之类的问题,您必须在 prepareForSegue 函数中创建要访问的视图控制器的实例,并告诉它发送数据的控制器是它的委托。另一个例子youtube.com/watch?v=KhqXUi1SF4s
-
你可以从你的单元格中拖出一个 IBOutlet 到你的视图控制器中,然后执行 segue。在为 segue 做准备时,将您的目标视图控制器转换为 B 并传递数据。您还需要将函数声明添加到您的问题中,否则很难理解什么在调用什么以及应该在哪里调用。注释您的代码以显示 sn-p 也属于哪个类。
标签: ios swift delegates protocols