当前位置: 首页 > 知识库问答 >
问题:

自定义协议委托为零

吉玉石
2023-03-14

我有一个奇怪的错误,我的代表是零,也不知道在哪里检查。也许其他人也有同样的问题。

我有这个类和协议:

protocol NavigationProtocol: class {
    func pushVC()
}

class LocalNotification: NSObject, UNUserNotificationCenterDelegate {

    let notificationCenter = UNUserNotificationCenter.current()
    weak var delegate: NavigationProtocol? {
        didSet {
            print("was set")
        }
    }
.........

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        
        self.delegate?.pushVC()
        completionHandler()
    }

在我的VC里

class FinalDecisionViewController: UIViewController {

    var localNotification: LocalNotification!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupNotification()
    }
    
    private func setupNotification() {
        localNotification = LocalNotification()
        localNotification.delegate = self
        localNotification.scheduleNotification(title: "Loan Approval", message: "Congratulations! Your loan has been approved", type: "Loan Approval")
    }


extension FinalDecisionViewController: NavigationProtocol {
    func pushVC() {
        canMoveToNextVC = true
    }
}
    

触发计划通知后,我单击它,调用DidReceive并且self.delegate?.pushvc()不知为何为零,即使已设置委托(打印了来自DidSet的消息)。

扩展中的委托方法从未触发,因为委托为nil。

我还在每个类的deinit中打印了一些消息,以查看它是否以某种方式从内存中删除了,但它们没有,只是在我从vc堆栈中弹出它们之后。

共有1个答案

蔚楷
2023-03-14

添加

weak var delegate: NavigationProtocol? {
    didSet {
        print("was set")
        notificationCenter.delegate = self
    }
}

localNotification = LocalNotification()
localNotification.delegate = self
localNotification.notificationCenter.delegate = localNotification
localNotification.scheduleNotification(title: "Loan Approval", message: "Congratulations! Your loan has been approved", type: "Loan Approval")
 类似资料:
  • 问题内容: 我正在尝试将我的爱好项目之一移植到linux。最好使用Mono,因为它是用C#编写的。但是我也在研究Python。 该应用程序的功能之一是它需要与自定义协议相关联,因此,当用户单击应用程序网站上的链接时,将调用该应用程序: 像这样,这个和这个的定制协议。 在linux / unix系统中怎么做?我可以像Windows中那样关联系统范围的处理程序吗?还是需要依赖于浏览器? 在Google

  • 当然, 这个世界上没有绝对的事情. 所以万一现在所有的路由协议都不能满足你的需求, 那么你可以自己实现你自己的路由协议, 你要做的是, 申明你的路由协议实现了Yaf_Route_Interface接口即可.

  • 我已经创建了一个简单的协议委托来将数据从一个视图控制器传递到第二个视图控制器--但是数据似乎没有传递出去? 详细信息:第一个视图控制器有一个textField,我在其中键入数据(字符串),以传递给第二个VC。我也有一个按钮的动作触发过渡到第二视图控制器。第二个视图控制器出现,但来自第一个视图控制器的数据没有显示出来-预期的行为是第二个VC中的标签用来自第一个VC的数据更新。我还创建了一个从FVC到

  • 情况如下:我已经设法让Jackson反序列化以下通用 作为HTTP客户端,并使用exchange

  • 问题内容: Java相当于Cocoa委托的代表? (我知道我可以将一个接口传递给一个类,并让该类调用适当的方法,但是我想知道是否还有其他方法可以实现更接近于Cocoa / Objective- C的非正式协议的东西) 问题答案: 简短的答案是,Java中没有什么比您想的要近的了,但还有其他选择。委托模式并不难实现,只是不像使用Objective-C那样方便。 “非正式协议”在Objective-C

  • 问题内容: 在Interface Builder中无法将声明为@IBOutlet的委托属性连接到–根本无法建立连接。 这是代码 由于使用了快速协议,因此IBOutlet属性不能具有非对象类型,不知道为什么不起作用。 还有其他人遇到过这样的事情吗? 问题答案: 从Xcode发行说明中: 当插座的类型是协议时,Interface Builder不支持连接到Swift文件中的插座。 解决方法:将插座的类