2

我想禁止在我的 NSTextField 中输入换行符,默认情况下可以通过键入 Option-Enter(或 Option-Return)来实现。

虽然我发现一些 页面解释了如何在不使用 Option 修饰符的情况下允许换行符,但我找不到任何可以完全禁用换行符的内容。

如何才能做到这一点?

4

3 回答 3

3

您可以创建 NSFormatter 的子类并实现 isPartialStringValid:... 方法来阻止换行符。

- (BOOL)isPartialStringValid:(NSString **)partialStringPtr 
       proposedSelectedRange:(NSRangePointer)proposedSelRangePtr 
              originalString:(NSString *)origString 
       originalSelectedRange:(NSRange)origSelRange 
            errorDescription:(NSString **)error
{
    // the user may have:
    // -- deleted the left most character
    // -- deleted the last character and we have an empty string
    // both cases are valid
    if (proposedSelRangePtr->location == 0)
        return YES;

    unichar theChar = [*partialStringPtr characterAtIndex:proposedSelRangePtr->location - 1];

    if ([[NSCharacterSet newlineCharacterSet] characterIsMember:theChar]) {
        *error = nil;
        NSBeep();
        return NO;
    }

    return YES;
}
于 2009-02-24T03:22:20.833 回答
0

请问您为什么要禁用此功能?这是操作系统的一个非常标准的部分。请记住,用户可能会从其他地方粘贴一些包含换行符的字符串,然后他们将根据需要进行编辑。保持这个特性完好无损,但是当需要将视图中的值复制到模型时,使用 NSFormatter 删除换行后的所有内容可能会更好吗?

于 2009-03-01T11:43:16.360 回答
0

在使用 Control、Option + Enter (Return) 的情况下,我执行以下代码以防止出现换行问题。

- (BOOL)control:(NSControl *)control textView:(NSTextView *)textView doCommandBySelector:(SEL)commandSelector
{
    if ((commandSelector == @selector(insertNewlineIgnoringFieldEditor:)) || (commandSelector == @selector(insertLineBreak:)))
    {
        return YES;
    }

    return NO;
}
于 2020-05-12T07:48:18.703 回答