我已经从下到上阅读了这个线程(以及类似的其他线程),但它根本不符合我的需求。
我在一个UIViewController里面UIPageViewController有一个UINavigationController. 导航到第二个 ViewController。导航到第 3 个 ViewController 并希望返回到第 2 个传递数据的 ViewController。
我目前的代码:
protocol PassClubDelegate {
func passClub(passedClub: Club)
}
class My3rdVC: UIViewController {
var clubs: [Club] = []
var passClubDelegate: PassClubDelegate?
....
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let club = clubs[indexPath.row]
self.passClubDelegate?.passClub(club)
navigationController?.popViewControllerAnimated(true)
}
Run Code Online (Sandbox Code Playgroud)
我的第二个 VC:
class My2ndVC: UIViewController, PassClubDelegate {
var club = Club()
func passClub(passedClub: Club) {
SpeedLog.print("passClub called \(passedClub)")
club = passedClub
}
Run Code Online (Sandbox Code Playgroud)
passClub不叫。我确定这是因为我没有将委托设置为 My2ndVC,但是我该怎么做呢?我发现的所有解决方案都希望我使用 a) segue 或 b) 实例化一个 My2ndVC new,什么没有任何意义,因为它仍在内存中,我想弹回层次结构。我错过了什么?我有哪些可能性?非常感谢帮助。
PS:我没有使用任何segues。My3rdVC 被调用:
let vc = stb.instantiateViewControllerWithIdentifier("My3rdVC") as! My3rdVC
self.navigationController?.pushViewController(vc, animated: true)
Run Code Online (Sandbox Code Playgroud)
您可以My3rdVC在 的prepareForSegue方法中 设置 的委托My2ndVC。
class My2ndVC: UIViewController, PassClubDelegate {
...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
super.prepareForSegue(segue, sender: sender)
switch segue.destinationController {
case let controller as My3rdVC:
controller.passClubDelegate = self
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是假设你已经在你的故事板中创建了一个My3rdVC从My2ndVC导航控制器堆栈推送到导航控制器堆栈的 segue, 我假设你有。因此,只需尝试简单地将此prepareForSegue方法粘贴到其中My2ndVC,看看它是否有效。
更新
let vc = stb.instantiateViewControllerWithIdentifier("My3rdVC") as! My3rdVC
vc.passClubDelegate = self
navigationController?.pushViewController(vc, animated: true)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4624 次 |
| 最近记录: |