从 swift 文件发送通知并在 ios 的目标 c 文件中接收

Posted

技术标签:

【中文标题】从 swift 文件发送通知并在 ios 的目标 c 文件中接收【英文标题】:send notification from swift file and recieve in objective c file in ios 【发布时间】:2016-03-31 09:10:05 【问题描述】:

我正在尝试将通知从 swift 文件发送到目标 c。到目前为止我的尝试:

ClassA.swift

    override func viewDidLoad() 
        super.viewDidLoad()

        let containerDict:[String:AnyObject] =  ["vwConatinerFrameWidth": vwContainer.frame.size.width, "vwConatinerFrameHeight": vwContainer.frame.size.height]

        NSNotificationCenter.defaultCenter().postNotificationName("ContainerFrame", object: self, userInfo: containerDict)

        let classB = ClassB(nibName: "ClassB", bundle: nil)

        classB.willMoveToParentViewController(self)

        self.vwContainer.addSubview(classB.view)

        self.addChildViewController(classB)
        classB.didMoveToParentViewController(self)

    

ClassB.m

- (void)viewDidLoad

    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(containeFrameRecieved:)
                                                 name:@"ContainerFrame"
                                               object:nil];


- (void)containeFrameRecieved:(NSNotification *)note 
    NSDictionary *theData = [note userInfo];

    if (theData != nil) 

        CGFloat containerFrameWidth = [[theData objectForKey:@"vwConatinerFrameWidth"] floatValue];
        CGFloat containerFrameHeight = [[theData objectForKey:@"vwConatinerFrameHeight"] floatValue];

        NSLog(@"Width:%f and Height: %f",containerFrameWidth,containerFrameHeight);
    

My-Bridging-Header.h

#import "ClassB.h"

但问题是,ClassB 没有获得价值。谁能告诉我这段代码有什么问题?

【问题讨论】:

确保 ClassB 在 ClassA 发送通知之前将自己添加为观察者。 @damirstuhec :我做了,但没有任何改变。 ClassA, ClassB 似乎是 ViewController。他们真的同时“活着”吗?它们的生命周期是什么? 其实ClassA的viewcontroller在ClassA的viewDidLoad中添加了ClassB的viewcontroller作为childviewcontroller。查看更新后的问题。 在 NSNotificationCenter.defaultCenter().postNotificationName("ContainerFrame", object: self, userInfo: containerDict) 中用 nil 改变 self 【参考方案1】:

在发布通知后,您正在创建ClassB 的对象。因此,在发布通知时,ClassB 对象不存在。确保在发布通知之前调用 ClassB 的 viewDidLoad:。只有这样ClassB才能监听到notif并获取值

【讨论】:

非常感谢。我想我应该在创建 CLassB 的对象之前发布通知。 如果您这样做,在发布通知时,B 将不会订阅它们。【参考方案2】:

Swift 4.1 的更新答案

// Notification name for swift
extension NSNotification.Name 
    static let NotificationName = Notification.Name(rawValue: "NotificationName")


// Notification name for Objective-C
@objc public extension NSNotification 
    public static var NotificationName: String 
        return "NotificationName"
    

在 swift 文件中发布通知

NotificationCenter.default.post(name: NSNotification.Name.NotificationName, object: nil)

在objective-c文件中观察

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selectorName:) name:NSNotification.NotificationName object:nil];

【讨论】:

以上是关于从 swift 文件发送通知并在 ios 的目标 c 文件中接收的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift [iOS] 中从特定时间开始发送本地通知 UNTimeInterval

iOS Swift App 不会收到 Parse Server 发送的推送通知

推送通知点击获取 url 并在 View Controller , iOS , Swift4.2 中显示

从推送通知 iOS Swift 4 中获取值

快速,在后台检测 ibeacons 并在范围内发送通知

没有收到从 FCM 到 iOS Swift 3 的推送通知