2010-08-26 63 views
1

用户在我的mp3播放器中选择一首歌曲。他继续重新命名歌曲(从而突出显示该歌曲的“名称”栏)。控制粘贴到NSTableView中的内容

假设他粘贴“The \ nGreat \ nSong”。默认情况下,如果字符串格式化程序不允许换行符(这是我想要的),该应用程序将产生一个嘟嘟声。

如何在粘贴之前处理字符串?这是我想要的:如果字符串长度小于200个字符,并且如果它包含换行符,则在实际粘贴字符串之前用空格替换换行符。如果它超过200个字符,只需做默认的操作(因为我不希望用户在那里意外粘贴他的博士论文)。

如何做到这一点?

回答

0

原来,编辑我的NSFormatter子类本身可能是最容易的。这里是我的NSFormatter方法,如果有人有兴趣:

- (BOOL)isPartialStringValid:(NSString *)partial 
      newEditingString:(NSString **)newString 
      errorDescription:(NSString **)errorString 
{ 
    *errorString = nil; 
    *newString = nil; 

    if ([partial containsIllegal]) 
    { 
    NSBeep(); 
    return NO; 
    } 
    else if ([partial containsNewline]) 
    { 
    if ([partial length] > 200) 
    { 
     NSBeep(); 
     return NO; 
    } 
    else 
    { 
     *newString = [partial stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; 
     return NO; 
    } 
    } 
    else 
    return YES; 
} 

这两个的NSString类的方法有很简单如下:

- (BOOL)containsIllegal 
{ 
    for (int i=0; i<[self length]; i++) 
    { 
    unichar currentChar = [self characterAtIndex:i]; 

    BOOL charIsIllegal = [[NSCharacterSet illegalCharacterSet] characterIsMember:currentChar]; 

    if (charIsIllegal) 
     return YES; 
    } 
    return NO; 
} 

- (BOOL)containsNewline 
{ 
    for (int i=0; i<[self length]; i++) 
    { 
    unichar currentChar = [self characterAtIndex:i]; 

    BOOL charIsNewLine = [[NSCharacterSet newlineCharacterSet] characterIsMember:currentChar]; 

    if (charIsNewLine) 
     return YES; 
    } 
    return NO; 
} 
-1
- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex 

您可以检查anObject(通常是NSString)价值,决定你应该用新的值或者不同意。

+0

这个方法不起作用,验证已经发生时,这种方法是被称为。在OP的情况下,输入事先已被拒绝,并且此方法永远不会被调用。 – 2010-08-30 12:08:11

-2

查找NSPasteBoard获取被复制的内容。从那里,做字符串检查并决定它们是否可以粘贴。

+0

它来自Mac,而不是iPhone。 – beefon 2010-08-27 09:14:17

+0

抱歉,使用NSPasteBoard而不是UIPasteBoard,我编辑了我的答案。 – 2010-08-27 18:42:19

+0

也不会使用这种方法。你想在哪里截取粘贴动作?粘贴将发生在作为字段编辑器的NStextView中。你必须改变它的类并拦截粘贴的动作。我觉得这是一个坏主意,打破了模块化。 – 2010-08-30 12:09:44

0

如果要验证用户输入,则使用一些委托方法。我从来没有这样做过,这正是我从头文件和文档中知道的。但是,这可能已经帮助你:

看看textShouldEndEditing:方法NSTableView。这个方法在用户想要完成数据编辑时被调用,就像你的情况一样。您可以重写此方法来执行更改。然而,从它所读取的文档中,您甚至不需要重写,只是为了实现当时正在调用的代理方法control:textShouldEndEditing:

我会选择后者。执行control:textShouldEndEditing:并查看它是如何被调用的。第一个参数实际上应该是表格视图,第二个参数是用于编辑的NSTextView。使用editedRoweditedColumn,您可以获取正在编辑表格视图的单元格。进行验证并简单地更改传递的字段编辑器的文本。

+0

我不想验证用户何时离开现场编辑器。我想要通过粘贴来验证。因为我的格式化程序不会允许换行符首先被粘贴到字段编辑器中。因此,我必须在粘贴之前以某种方式处理文本*。 – Enchilada 2010-09-17 16:51:42

+0

嗯,没关系。对我来说,现在看起来很明显,我当然应该在我的NSFormatter子类中进行处理。 – Enchilada 2010-09-17 17:00:17

+0

对,这是另一种方式。笨拙的我没有这个想法... – 2010-09-17 17:06:24

相关问题