Swift:UIPopoverPresentationControllerDelegate 委托变为 nil

Posted

技术标签:

【中文标题】Swift:UIPopoverPresentationControllerDelegate 委托变为 nil【英文标题】:Swift: UIPopoverPresentationControllerDelegate delegate becomes nil 【发布时间】:2016-07-24 22:10:14 【问题描述】:

即使在设置协议和委托后,我尝试从 UIPopoverPresentationController 取回某些东西也失败了。

我将自定义委托 (SavingViewControllerDelegate) 和 UIPopoverPresentationControllerDelegate 都包含在将调用弹出框的控制器中。用户将点击一个 UIBarButton,它正在我的控制器中调用一个函数。在控制器中,我以编程方式打开 Popover:

        let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("PopoverProfileViewController") as! ProfileViewController
        vc.modalPresentationStyle = UIModalPresentationStyle.Popover
        let popover: UIPopoverPresentationController = vc.popoverPresentationController!
        popover.barButtonItem = sender as? UIBarButtonItem
        popover.delegate = self
        self.presentViewController(vc, animated: true, completion:nil)

在这个视图控制器中,我有这个功能

func sendLoginStatus(status : Bool) 
    print("LoginStatus")
    print(status)

在弹出框的视图控制器中,我添加了一个协议:

protocol SavingViewControllerDelegate

    func sendLoginStatus(status : Bool)

我还在 func sendLoginStatus(status : Bool) 处添加了一个突破,它返回“delegate SavingViewControllerDelegate?Some”。

在 ProfileViewController 中:

class ProfileViewController: UIViewController 
    var delegate : SavingViewControllerDelegate?

当用户点击一个按钮时,一个布尔值应该被发送回调用控制器。

@IBAction func logoutButton(sender: AnyObject) 
    print("sendStatus")
    delegate?.sendLoginStatus(true)
    dismissViewControllerAnimated(true, completion: nil)

我在 delegate?.sendLoginStatus(true) 处添加了一个断点,它返回“delegate SavingViewControllerDelegate?”是零。 sendLoginStatus 永远不会被调用。

【问题讨论】:

【参考方案1】:

您使用了来自 UIPopoverPresentationController 的委托和来自您自己的协议的预期结果。

您应该创建对您自己的委托的引用,而不是设置符合协议UIPopoverPresentationControllerDelegate 的弹出框委托:

let storyboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("PopoverProfileViewController") as! ProfileViewController

// Setting the SavingViewControllerDelegate
vc.delegate = self
vc.modalPresentationStyle = UIModalPresentationStyle.Popover

let popover: UIPopoverPresentationController = vc.popoverPresentationController!
popover.barButtonItem = sender as? UIBarButtonItem

// Setting the UIPopoverPresentationControllerDelegate
popover.delegate = self

self.presentViewController(vc, animated: true, completion:nil)

您现在可以使用自己的委托函数和 UIPopoverPresentationController 委托函数:

extension YourClass : UIPopoverPresentationControllerDelegate 
    // All functions of the UIPopoverPresentationControllerDelegate you wish to use


extension YourClass : SavingViewControllerDelegate 
    func sendLoginStatus(status : Bool) 
        // Code
    

旁注 1:为了防止代表的保留周期,我建议使用 weak var delegate: SavingViewControllerDelegate? 而不仅仅是 var ~~

旁注 2:通常的做法是在委托函数中也包含发送者:

protocol SavingViewControllerDelegate 
    func sendLoginStatus(sender: ProfileViewController, status : Bool)

【讨论】:

谢谢您,现在可以使用了!但是如果我将委托变量设置为弱,我会得到“'弱'可能只应用于类和类绑定协议类型,而不是'SavingViewControllerDelegate'”。 将 :class 添加到您的协议中;)

以上是关于Swift:UIPopoverPresentationControllerDelegate 委托变为 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift入门系列--Swift官方文档(2.2)--中文翻译--About Swift 关于Swift

swift 示例BS swift.swift

swift swift_bug.swift

ios 整理(一)swift和oc的区别

swift swift_extension5.swift

swift swift_optional4.swift