【问题标题】:Swift Delegate method never getting calledSwift Delegate 方法永远不会被调用
【发布时间】:2015-09-15 10:15:38
【问题描述】:

我已经在模态中声明了我的协议,如下所示

protocol MapViewControllerDelegate : class {
    //func mapViewLocationSelected(sender:AnyObject, location:CLLocation, address:String)
    func didSelectMap(sender:AnyObject)
}

我还声明了委托如下

weak var delegate : MapViewControllerDelegate?

然后我关闭屏幕并调用委托方法,如下所示

self.dismissViewControllerAnimated(true, completion: nil)
delegate?.didSelectMap(self)

在调用模型的视图控制器中,我有以下内容

如下声明模态VC

var mvController : MapViewController = MapViewController()

然后我在viewDidLoad下设置委托如下

mvController.delegate = self

然后我实现了委托方法

func didSelectMap(sender: AnyObject) {
    println("Came here")
}

但我从来没有来过ddidSelectMap 方法。我以前做过这个并且它有效,我无法弄清楚出了什么问题。任何帮助,将不胜感激。

父视图控制器 pastebin.com/7z5vg6yJ

模型视图控制器 pastebin.com/DwAa6erQ

会不会是我使用的 MapKit 导致的问题?

提前致谢。

【问题讨论】:

  • 当你调用它时,delegate == nil 吗?我检查你的代码。而且我没有看到您从 NewPostViewController 推送/呈现 mvController 的位置
  • 是的 R.K 我可以看到当我放一个换行符并检查时它是零。这是为什么?
  • 我认为这是因为您将委托呈现并分配给不同的控制器
  • 我正在将代表分配给正确的代表,但可能是 ARC 造成破坏?您通常如何分配委托?

标签: ios iphone swift delegates


【解决方案1】:

我的建议是在 prepareForSegue 方法中分配委托。还要确保使用segue.destinationViewController 来获取适当的VC。

我假设会像下面这样。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "showMapviewSegue"{
            mapVController = segue.destinationViewController as! MapViewController
            mapVController.delegate = self
        }
}

试试这个,应该可以的。

【讨论】:

  • 谢谢谢谢谢谢 :) 你是救世主。是的,以这种方式分配代表是有效的。
【解决方案2】:

首先调用委托,然后关闭控制器。这可能会解决你的问题

 delegate?.didSelectMap(self)
 self.dismissViewControllerAnimated(true, completion: nil)

【讨论】:

  • 我认为这不是问题@iRealMe
  • 是的,这并没有解决问题。委托方法仍然不会被触发。
猜你喜欢
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多