2012-08-13 145 views
3

我有一个NSTextView,用户可以在其中粘贴纯文本。NSTextView粘贴:当粘贴“foo”时,如何粘贴“bar”?

当用户在粘贴板上有“foo”时,我想粘贴“bar”。换句话说,用户转到网络浏览器,选择“foo”,cmd + c,切换到我的NSTextView,cmd + v并在插入点出现“bar”。

请问有没有人知道如何解决这个问题?

编辑:是否有可能以某种方式使用readSelectionFromPasteboard:type:这个?我只是不知道要重写的textview的方法体内放置什么..?

+0

它是一个非常具体的文本替换功能? – 2012-08-13 15:49:12

+0

@DanF:不,不是。为什么? – 2012-08-13 15:52:52

+0

这决定了答案的复杂性 – 2012-08-13 15:55:03

回答

8

试试这个。子类化您的文本视图,并覆盖粘贴:这种方式:

@implementation RDTextView 

-(void)paste:(id)sender { 
    NSPasteboard *pb = [NSPasteboard generalPasteboard]; 
    NSString *pbItem = [pb readObjectsForClasses: @[[NSString class],[NSAttributedString class]] options:nil].lastObject; 
    if ([pbItem isKindOfClass:[NSAttributedString class]]) 
     pbItem = [(NSAttributedString *)pbItem string]; 

    if ([pbItem isEqualToString:@"foo"]) { 
     [self insertText:@"bar"]; 
    }else{ 
     [super paste:sender]; 
    } 
} 

@end 
+0

谢谢!请问,我还有一个问题:这个会在粘贴板中“销毁”“foo”,所以如果我粘贴这个textview然后再粘贴到另一个应用程序中,它会粘贴“bar”,对吧? - 是否有可能将这个foo/bar“调整”“本地”保留在我的textview中?我的意思是,不要使用'writeObjects'? – 2012-08-13 21:40:23

+0

@EcirHana是的,这是可能的。看到我编辑的答案。如果“拾取”的“foo”是一个属性字符串(富文本),而不仅仅是一个痛苦字符串,该版本也会进行替换。 – rdelmar 2012-08-13 21:59:17