自定义协议委托为零

Posted

技术标签:

【中文标题】自定义协议委托为零【英文标题】:Custom Protocol delegate is nil 【发布时间】:2021-04-06 14:05:34 【问题描述】:

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

我有这个类和协议:

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】:

添加

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")

【讨论】:

它不工作。我再次在 AppDelegate 中设置了 notificationCenter.delegate(它是 UNUserNotificationCenter 的代表)。 let notifications = LocalNotification() notifications.notificationCenter.delegate = notifications 我收到通知,但点击它并不会触发我的自定义通知,即 nil 在 didReceive 中添加了一个断点,类 LocalNotification ???? 是的!它确实触发了它!但self.delegate?.pushVC() 是空的 github.com/marcelfagadariu/LocalNotificationDemo 第一次运行时只需要接受传入的通知。但是再运行一次就可以看到错误了

以上是关于自定义协议委托为零的主要内容,如果未能解决你的问题,请参考以下文章

Swift-自定义 UITableViewCell 委托给 UIViewController 只有一个协议有效

自定义委托始终为零

如何返回一个零自定义 UITableViewCell

未为 UITextView 触发委托协议功能

扩展现有协议以修改 Objective C 中的委托参数

iOS如何知道使用自定义委托按下哪个按钮CollectionView