代表回传不工作

时间:2015-12-01 00:33:50

标签: swift delegates

在我的主“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)
}

我试过了!而不是?等,但没有任何作用?有什么意见吗?

2 个答案:

答案 0 :(得分:0)

也许你正在设置某个地方,但我没有在你发布的代码中看到它。

委托字段是一个可选值,可能有也可能没有值。你没有将这个委托属性设置为任何东西,因此它是零并且这一行不会被执行:

delegate?.postChoiceSelected("hello")

因为委托是 nil

如何解决?只需将此属性设置为实现 PostChoiceDelegate

的对象实例

因此,请确保以下行实际执行:

controller!.delegate = self

其中委托表示对PostChoiceDelegate的弱引用,而不是其他任何内容, self 实际上实现 PostChoiceDelegate

更新:所以我会做出以下更改:

let controller = dvc.popoverPresentationController as! ViewControllerThatImplementsYourDelegate

因为否则,该委托是 UIPopoverPresentationControllerDelegate 而不是 PostChoiceDelegate

答案 1 :(得分:0)

在经历了许多令人沮丧的尝试和搜索之后......(感谢所有帮助过的人)我在准备segue的if语句下面添加了以下内容。

        let navigationController = segue.destinationViewController as! UINavigationController
        let tableviewController:DestinationTableViewController = navigationController.topViewController as! DestinationTableViewController
        tableviewController.delegate = self