在我的主“viewcontroller A”中将以下内容作为segue。它是一个PageViewController。
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
if (segue.identifier == "postChoice") {
let dvc = segue.destinationViewController as! UINavigationController
let controller = dvc.popoverPresentationController
if (controller != nil) {
controller!.delegate = self
}
}
}
同样在我的“Viewcontoller A”中,我在顶部有PostChoiceDelegate参考
我的segue链接到一个弹出到TableViewController的UINavigationController。 “查看控制器B”
VCB
protocol PostChoiceDelegate: class {
func postChoiceSelected(whatStyle: String)
}
//in the vc class
weak var delegate: PostChoiceDelegate? = nil
然后我有一个以编程方式制作的导航项目,目标操作“uploadPost”,在VCB中,我有这个函数返回一个nil委托。不应该返回“你好”所以我把它传递给VCA来更新postChoiceSelected()的VCA中的一个函数,它将label.text更新为Hello?
func uploadPost() {
delegate?.postChoiceSelected("hello")
print(delegate?.postChoiceSelected("hello"))
dismissViewControllerAnimated(true, completion:nil)
}
我试过了!而不是?等,但没有任何作用?有什么意见吗?
答案 0 :(得分:0)
也许你正在设置某个地方,但我没有在你发布的代码中看到它。
委托字段是一个可选值,可能有也可能没有值。你没有将这个委托属性设置为任何东西,因此它是零并且这一行不会被执行:
delegate?.postChoiceSelected("hello")
因为委托是 nil
如何解决?只需将此属性设置为实现 PostChoiceDelegate
的对象实例因此,请确保以下行实际执行:
controller!.delegate = self
其中委托表示对PostChoiceDelegate的弱引用,而不是其他任何内容, self 实际上实现 PostChoiceDelegate
更新:所以我会做出以下更改:
let controller = dvc.popoverPresentationController as! ViewControllerThatImplementsYourDelegate
因为否则,该委托是 UIPopoverPresentationControllerDelegate 而不是 PostChoiceDelegate
答案 1 :(得分:0)
let navigationController = segue.destinationViewController as! UINavigationController
let tableviewController:DestinationTableViewController = navigationController.topViewController as! DestinationTableViewController
tableviewController.delegate = self