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的主要内容,如果未能解决你的问题,请参考以下文章