从 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 发送的推送通知