Tag: nsnotification

NSNotifications —整个事实

尽管每篇文章都以其实现和用法解释了NSNotifications,但很少有人对它的基础知识给予足够的重视。 在这里,我试图突出显示遗漏的这些点。 使用NotificationCenter,您可以将数据从应用程序的一部分广播到另一部分。 它使用“ 观察者”模式 ,通过称为“ 通知中心”的中央调度程序,在收到通知时通知注册的观察者。 NotificationCenter 究竟 如何 工作? 它基本上有三个组成部分 侦听通知的“侦听器”,称为观察者 “发件人”,在发生某些情况时发送通知 通知中心本身,可跟踪观察者和通知 NSNotificationCenter可以处理一对多和多对多通信。 您何时使用 NotificationCenter ? 当应用程序的两个或多个没有正式连接的组件之间进行通信时, 当沟通需要反复一致地进行时 使用一对多或多对多通讯时 您如何注册观察员? NotificationCenter.default.addObserver(自身,选择器:#selector(onDidReceiveData(_ :)),名称:.didReceiveData,对象:无) addObserver(_:selector:name:object:)函数具有4个参数: 第一个参数observer是未命名的 ,您可以为其提供对作为该通知观察者的对象的引用,该对象通常是self 第二个参数selector是在发生通知时要调用的函数,其作用类似于目标动作模式 第三个参数name是您要侦听的通知的名称,其类型为Notification.Name 第四个参数object是一个可选对象,您希望接收其通知,因此,如果设置了该对象,则只会从该“发送者”接收通知 您如何添加通知? 扩展Notification.Name { 静态let didReceiveData = Notification.Name(“ didReceiveData”)静态let didCompleteTask = Notification.Name(“ didCompleteTask”)静态letcompleteLengthyDownload = Notification.Name(“ completedLengthyDownload”) } NotificationCenter.default.addObserver(自身,选择器:[selector],名称:.didCompleteTask,对象:nil) 您如何发布通知? NotificationCenter.default.postNotification(名称:.didReceiveData,对象:无) onDidReceiveData(_:)函数如下所示: @objc func onDidReceiveData(_通知:通知) {如果让数据= […]

NSNotifications的开销

我最近开始使用NSNotification s: [[NSNotificationCenter defaultCenter] postNotificationName: selector: object:]; …. 我觉得这是一个很好的概念之间的视图控制器之间进行通信。 对于应用程序中的所有通信,使用NSNotification似乎有点太简单了。 如果我在我的应用程序的大部分工作中使用了NSNotification ,那么您认为太多的开销会是什么?

UIWebView和Swift:检测video何时开始播放

在Objective-C中,我订阅了UIWindowDidBecomeVisibleNotification来知道某些视图是否超出了我当前的视图控制器,使用: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoStartedPlaying:) name:UIWindowDidBecomeVisibleNotification object:nil]; 到现在为止还挺好。 然后,在通知中,我可以检查对象是否不是某些类(如_UIAlertControllerShimPresenterWindow -alert views-或UITextEffectsWindow sharing view-)。 在Objective-C中,我这样做了: – (void)videoStartedPlaying:(NSNotification *)notification { if ( <radio_is_playing> && ! [notification.object isKindOfClass:NSClassFromString(@"_UIAlertControllerShimPresenterWindow")] // Alert view && ! [notification.object isKindOfClass:NSClassFromString(@"UITextEffectsWindow") ] // Share ) { // Video, stop the radio stream } } 这允许我从UIWebView (用于呈现新闻)开始video时停止播放声音(在这种情况下,HTTP广播stream)。 我试图在Swift中做同样的事情,所以我订阅了通知: NSNotificationCenter.defaultCenter().addObserver(self, selector: "videoStartedPlaying:", name: UIWindowDidBecomeVisibleNotification, object: nil) […]

如何检查当前是否显示UIViewController?

如何检查当前是否显示UIViewController ? 我的UIViewControllers正在监听NSNotifications – 即使他们没有显示(即没有显示)。 所以我可以有10个UIViewController在后台观察来自NSNotificationCenter 。 当一个NSNotification被UIViewController发布和接收,我想知道它是否正在显示。 如果不是的话,我只需要设置一个布尔值,这样就可以在视图呈现的时候处理它。 如果它现在正在显示,我会做更多的事情,如立即更新表,等等…

UIKeyboardDidShowNotification多次调用,有时使用不正确的键盘尺寸

我试图在键盘出现/更改时移动键盘上方的UITextView。 比方说,我有英文键盘显示,然后直接切换到中文键盘(这是比标准的英文键盘高)。 在这种情况下,我的文本视图总是显得过高(肉眼看来,文本视图不正确地偏移了中文键盘的大小“input配件视图”),我会张贴图像,但缺乏声誉所以:))。 当我的应用程序收到一个UIKeyboardDidShowNotification(使用UIKeyboardFrameEndUserInfoKey获取高度),以及一些调查UIKeyboardDidShowNotification被调用多次,经常与不正确的键盘尺寸 (我NSLogged userInfo字典)调整我的文本视图位置。 我在ViewWillAppear中注册我的键盘通知,并在ViewWillDisappear中取消注册。 我无法确定什么可能导致此通知多次触发; 我的理解是这个通知只能在键盘完成显示之后被触发一次。 另外需要注意的是:在响应UIKeyboardDidShowNotification的方法中,我已经NSLogged'self',事实上它总是与View Controller Object相同。 但是,即使这个通知多次触发,我仍然不明白为什么键盘高度会因这些通知中的一些而不同。 其中一个通知总是有正确的高度,但是当它不是最后一个通知时,文本视图结束了错误的地方。 任何有关如何进一步排除故障的见解将不胜感激! 编辑:我testing越多,似乎是与中文键盘具体问题。 每当我把键盘从英文切换到中文,我得到三个UIKeyboardWillShowNotifications: 2014-12-24 22:49:29.385 Example[1055:421943] info dictionary: { UIKeyboardAnimationCurveUserInfoKey = 0; UIKeyboardAnimationDurationUserInfoKey = 0; UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 252}}"; UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}"; UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442}"; UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}"; UIKeyboardFrameEndUserInfoKey = […]

在第一个视图控制器中添加'addObserver'(NSNotificationCenter),在第二个

我看到了一些关于在同一个类中添加观察者和句柄的例子,但是我想知道的是,如果可以在第一个视图控制器中添加观察者并在第二个视图控制器中处理它, 我想不断地从第一个视图控制器发送距离,并在第二个处理它。 第二个视图控制器添加为子视图: addSubview , addChildViewController 。 这是像在android广播。

ios在animation过程中观察UIView帧的变化

我想观察使用animateWithDurationanimation的UIView原点的x坐标的变化:delay:options:animations:completion。 我希望在粒度级别跟踪animation过程中x坐标的变化,因为我想在交互中更改到另一个被animation的视图可能会与之联系的视图。 我想在确切的接触点上做出改变。 我想了解在更高层次上做这样的事情的最佳方法: – 我应该在接触点完成callbackanimateWithDuration? 换句话说,第一个animateWithDurationanimation直到碰到该x坐标,其余的animation发生在完成callback中? – 我应该使用NSNotification观察员并观察对框架属性的更改吗? 这有多精确/精确? 我可以跟踪x的每一个变化吗? 我应该在一个单独的线程中做到这一点? 任何其他build议将受到欢迎。 我正在寻找最佳做法。

NS在Swift 3中的通知

新通知目前不在Swift 3中工作吗? 我在做: NotificationCenter.default().post(name: DidTouchParticleView, object: self.particle as? AnyObject) 在自定义视图的touchesBegan()中,我需要发送particle对象到视图控制器(如果有的话)。 所以我这样做: NotificationCenter.default().addObserver(forName: DidTouchParticleView, object: self, queue: OperationQueue.main(), using: presentParticleDisplayView(notification:)) 在视图控制器的viewDidLoad()中。 我确定那个特定的视图控制器是当我点击我的自定义视图时呈现的,但是,函数presentParticleDisplayView(notification:)从来没有被调用过。 另外, DidTouchParticleView是这样定义的: let DidTouchParticleView = NSNotification.Name("didTouchParticleView") 这是由于testing版,或者我做错了什么?

意外地发现零,而解包可选值keyboardWillShow

我有下面的代码在keyboardWillShowNotification被调用时运行: func keyboardWillShow(_ notification: Notification) { //ERROR IN THE LINE BELOW keyboard = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue animaton = (notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as AnyObject).doubleValue UIView.animate(withDuration: 0.4, animations: { () -> Void in self.scrollView.frame.size.height = self.scrollViewHeight – self.keyboard.height }) } 我在第二行发生错误,说: unexpectedly found nil while unwrapping an Optional value 。 基本上每当我点击其中一个textField时,键盘的这个通知就会被调用, keyboardWillShow的代码将会运行。 我知道, if…let我发言,但我想知道为什么我没有这个。 我不知道我是如何得到这个错误或如何debugging它。 是因为我是从模拟器运行它吗? 以下是打印notification.userInfo给出的内容: NSRect:{{0,315},{320,253}},AnyHashable(“UIKeyboardIsLocalUserInfoKey”):1,AnyHashable(“UIKeyboardBoundsUserInfoKey”):NSRect:{{0,0} (“UIKeyboardAnimationCurveUserInfoKey”):7,AnyHashable(“UIKeyboardCenterBeginUserInfoKey”):NSPoint:{160,694.5},AnyHashable(“UIKeyboardCenterEndUserInfoKey”):NSPoint:{160,441.5},AnyHashable […]