gpt4 book ai didi

ios - Swift:UIPopoverPresentationControllerDelegate 委托(delegate)变为 nil

转载 作者:行者123 更新时间:2023-11-28 06:38:26 24 4
gpt4 key购买 nike

即使在设置协议(protocol)和委托(delegate)之后,我尝试从 UIPopoverPresentationController 取回一些东西也失败了。

我将自定义委托(delegate) (SavingViewControllerDelegate) 和 UIPopoverPresentationControllerDelegate 包括在我的 Controller 中,它们将调用弹出窗口。用户将点击一个在我的 Controller 中调用函数的 UIBarButton。在 Controller 中,我以编程方式打开 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)

在这个 View Controller 中,我有这个功能

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

在弹出窗口的 View Controller 中,我添加了一个协议(protocol):

protocol SavingViewControllerDelegate
{
func sendLoginStatus(status : Bool)
}

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

在 ProfileViewController 中:

class ProfileViewController: UIViewController {
var delegate : SavingViewControllerDelegate?

当用户点击按钮时,应将 bool 值发送回调用 Controller 。

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

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

最佳答案

您使用了来自 UIPopoverPresentationController 的委托(delegate),并使用了您自己的协议(protocol)的预期结果。

与其设置符合协议(protocol) UIPopoverPresentationControllerDelegate 的 popover 委托(delegate),不如创建对您自己的委托(delegate)的引用:

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)

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

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

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

旁注 1:为了防止委托(delegate)的保留循环,我建议使用 weak var delegate: SavingViewControllerDelegate? 而不仅仅是 var ~~

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

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

关于ios - Swift:UIPopoverPresentationControllerDelegate 委托(delegate)变为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com