要点を言えば、次のようになります。
最初のスニペット(AppDelegate):
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
//...code taken out...
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyDownMask handler:^(NSEvent *incomingEvent) {
if ([incomingEvent type] == NSKeyDown) {
NSUInteger flags = [incomingEvent modifierFlags] & NSDeviceIndependentModifierFlagsMask;
if (flags==NSCommandKeyMask && ([incomingEvent keyCode] == 8)) {
[ClipboardUtilities logger:@"cmd+c recognized"];
[self determineAndAddToHistory];
}
}
}];
}
2番目のスニペット(AppDelegate):
-(void) determineAndAddToHistory {
id clipDat = [ClipboardUtilities getClipboardDataNatively];
if ([clipDat isKindOfClass:[NSAttributedString class]])
NSLog(@"clipDat.string = %@",((NSAttributedString*)clipDat).string);
}
3番目のスニペット(ClipboardUtilitiesクラス):
+(id) getClipboardDataNatively {
NSPasteboard *pasteboard = [NSPasteboard generalPasteboard];
NSArray *classArray = @[[NSAttributedString class], [NSImage class]];
NSDictionary *options = [NSDictionary dictionary];
NSArray *objectsToPaste = nil;
BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options];
if (ok) {
objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options];
}
NSLog(@"objectsToPaste count = %li",[objectsToPaste count]);
return [objectsToPaste objectAtIndex:0];
}
例を挙げて説明しようとする奇妙な動作に気づきました。
入力
- Cmd+C文字列「A」
- Cmd+C文字列「B」
- Cmd+C文字列「C」
- Cmd+C文字列「D」
defineAndAddToHistoryからの出力
- A
- A
- B
- C
そのため、何らかの理由で最初のアイテムが保持されていることに気づきました...その後、毎回2番目に新しいアイテムが返されます。getClipboardDataNativelyメソッドでobjectsToPaste配列を出力しようとしましたが、これはまだ当てはまります。誰かが私にこの問題にどのように取り組むか、または彼らがそれをどのように解決したかを教えてもらえますか?
PS my ClipboardUtilitiesクラスは、デリゲートを実装していないか、NSObject以外から継承していません。