13

有没有办法做到这一点?我在启动时注册了我的对象UIPasteboardChangedNotification,但是当将它发送到后台并打开(例如)Safari 并复制一些文本时,我的处理程序永远不会被调用。(我现在只使用模拟器)。

我两个都用过:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(pasteboardNotificationReceived:) 
    name:UIPasteboardChangedNotification 
    object:[UIPasteboard generalPasteboard]];

和:

[[NSNotificationCenter defaultCenter] addObserver:self 
    selector:@selector(pasteboardNotificationReceived:) 
    name:UIPasteboardChangedNotification 
    object:nil ];

注册我的处理程序。

4

1 回答 1

12

我有同样的问题。根据该属性的UIPasteboard 类参考文档changeCount(重点是我的):

每当粘贴板的内容发生变化时——特别是当粘贴板项目被添加、修改或删除时——UIPasteboard 都会增加这个属性的值。在增加更改计数后,UIPasteboard 发布名为 UIPasteboardChangedNotification(用于添加和修改)和 UIPasteboardRemovedNotification(用于删除)的通知。...当应用程序重新激活并且另一个应用程序更改了粘贴板内容时,该类还会更新更改计数。当用户重新启动设备时,更改计数将重置为零。

我读到这意味着UIPasteboardChangedNotification一旦我的应用程序重新激活,我的应用程序就会收到通知。但是,仔细阅读会发现,只有在changeCount重新激活应用程序时才会更新。

我通过跟踪我的changeCount应用程序委托中的粘贴板并在我发现changeCount应用程序在后台时已更改时发布预期的通知来处理这个问题。

在应用委托的界面中:

NSUInteger pasteboardChangeCount_;

在应用程序委托的实现中:

- (BOOL)application:(UIApplication*)application
    didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
  [[NSNotificationCenter defaultCenter]
   addObserver:self
   selector:@selector(pasteboardChangedNotification:)
   name:UIPasteboardChangedNotification
   object:[UIPasteboard generalPasteboard]];
  [[NSNotificationCenter defaultCenter]
   addObserver:self
   selector:@selector(pasteboardChangedNotification:)
   name:UIPasteboardRemovedNotification
   object:[UIPasteboard generalPasteboard]];

  ...
}

- (void)pasteboardChangedNotification:(NSNotification*)notification {
  pasteboardChangeCount_ = [UIPasteboard generalPasteboard].changeCount;
}

- (void)applicationDidBecomeActive:(UIApplication*)application {
  if (pasteboardChangeCount_ != [UIPasteboard generalPasteboard].changeCount) {
    [[NSNotificationCenter defaultCenter] 
     postNotificationName:UIPasteboardChangedNotification
     object:[UIPasteboard generalPasteboard]];
  }
}
于 2011-03-15T17:15:48.940 回答