控制粘贴到NSTableView的内容

时间:2010-08-26 20:50:38

标签: objective-c cocoa

用户在我的mp3播放器中选择一首歌曲。他继续重命名一首歌(因此突出显示该歌曲的“名称”栏)。

让我说他贴在“\ nGreat \ nSong”中。默认情况下,如果字符串格式化程序不允许换行符(这就是我想要的),应用程序将发出一声嘟嘟声。

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

怎么能做那样的事呢?

4 个答案:

答案 0 :(得分:0)

如果要验证用户输入,请使用某些委托方法。我从来没有这样做过,这正是我从标题和文档中所知道的。但这可能对你有所帮助:

查看NSTableView的{​​{3}}方法。当用户想要完成编辑数据时,就会调用此方法,就像在您的情况下一样。您可以覆盖此方法以进行更改。但是,从它所读取的文档中你甚至不需要覆盖,只是为了实现当时正在调用的委托方法textShouldEndEditing:

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

答案 1 :(得分: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;
}

答案 2 :(得分:-1)

- (void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex

您可以检查anObject(通常是NSString)值,并决定是否同意新值。

答案 3 :(得分:-2)

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