NSNotificationCenter PasteboardChangedNotification 未触发

Posted

技术标签:

【中文标题】NSNotificationCenter PasteboardChangedNotification 未触发【英文标题】:NSNotificationCenter PasteboardChangedNotification Not Firing 【发布时间】:2015-01-08 05:30:38 【问题描述】:

我正在为 ios 编写一个自定义键盘,我想检测用户何时复制一些文本。我读到您可以使用NSNotificationCenterUIPasteboardChangedNotification 来执行此操作。

但是,当用户复制文本时,我的选择器似乎没有被触发。当我在addObserver 行上放置断点时,它似乎被跳过了,尽管断点在它被击中之前和之后立即被跳过。这是我正在使用的代码:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

    // Register copy notifications 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleCopy:", name: UIPasteboardChangedNotification, object: nil)



func handleCopy(sender: NSNotification) 
//todo: handle the copied text event

谁能确定我错过了什么?

编辑:

我注意到,如果我在注册通知后以编程方式更新粘贴板,则会触发通知,但我仍然无法弄清楚如果用户使用上下文菜单“复制”,为什么它没有被点击。

【问题讨论】:

你有没有想过如何做到这一点?谢谢 我最终不得不使用 nstimer 轮询粘贴板以进行更改。我觉得这不是最好的方法。 感谢您的回复!是的,这就是我现在的做法,我不喜欢它。我不确定为什么 UIPasteboardChangedNotification 不起作用。一定是bug或者被屏蔽了。 【参考方案1】:

你不能使用 NSNotificationCenter 因为键盘扩展是一个不同的进程。

Cocoa 包括两种类型的通知中心: NSNotificationCenter 类在一个单一的管理通知 过程。 NSDistributedNotificationCenter 类管理 在一台计算机上跨多个进程的通知。

试试这个解决方案:https://***.com/a/28436058/649379 使用 CFNotifications。不要忘记启用应用组以访问共享容器。

更多代码在这里:https://github.com/cxa/AppExtensionCommunicator & https://github.com/mutualmobile/MMWormhole

【讨论】:

【参考方案2】:

我的不是一个完美但足够有效的解决方案。我已经在键盘上使用它了。

@interface MyPrettyClass : UIViewController

@end

@implementation MyPrettyClass

@property (strong, nonatomic) NSTimer   *pasteboardCheckTimer;
@property (assign, nonatomic) NSUInteger pasteboardchangeCount;

- (void)viewDidAppear:(BOOL)animated
    [super viewDidAppear:animated];

    _pasteboardchangeCount = [[UIPasteboard generalPasteboard] changeCount];


    //Start monitoring the paste board
    _pasteboardCheckTimer = [NSTimer scheduledTimerWithTimeInterval:1
                                                             target:self
                                                           selector:@selector(monitorBoard:)
                                                           userInfo:nil
                                                            repeats:YES];


- (void)viewDidDisappear:(BOOL)animated
    [super viewDidDisappear:animated];

    [self stopCheckingPasteboard];


#pragma mark - Background UIPasteboard periodical check

- (void) stopCheckingPasteboard

    [_pasteboardCheckTimer invalidate];
    _pasteboardCheckTimer = nil;


- (void) monitorBoard:(NSTimer*)timer

    NSUInteger changeCount = [[UIPasteboard generalPasteboard]; changeCount];
    if (changeCount != _pasteboardchangeCount)  // means pasteboard was changed

        _pasteboardchangeCount = changeCount;
        //Check what is on the paste board
        if ([_pasteboard containsPasteboardTypes:pasteboardTypes()])

            NSString *newContent = [UIPasteboard generalPasteboard].string;

            _pasteboardContent = newContent;

            [self tryToDoSomethingWithTextContent:newContent];
        
    


- (void)tryToDoSomethingWithTextContent:(NSString)newContent
    NSLog(@"Content was changed to: %@",newContent);


@end

【讨论】:

尊敬的@maverson,如果您有任何“更好的解决方案”,请分享。如果不是,那么如果您不喜欢我的解决方案,请不要点击减号,因为它有效并且您没有提供更好的东西。 我有点困惑,我将您的解决方案标记为已接受,因为我最终使用了类似的东西。我当然没有投反对票,你可以查看我的投票记录。感谢您的帮助!

以上是关于NSNotificationCenter PasteboardChangedNotification 未触发的主要内容,如果未能解决你的问题,请参考以下文章

WiFi网络更改是不是有NSNotificationCenter通知?

NSNotificationCenter传值

消息通信机制NSNotificationCenter -备

NSNotificationCenter 内存泄漏

如何在 iOS 8 中使用带有 NSNotificationCenter 的小部件

关闭时未收到 NSNotificationCenter 通知