【发布时间】:2009-02-23 17:15:55
【问题描述】:
我想禁止在我的 NSTextField 中输入换行符,默认情况下可以通过键入 Option-Enter(或 Option-Return)来实现。
虽然我发现some pages 解释了如何允许 换行而 不必使用Option 修饰符,但我找不到任何完全禁用换行符。
如何做到这一点?
【问题讨论】:
标签: cocoa nstextfield nstextview fieldeditor
我想禁止在我的 NSTextField 中输入换行符,默认情况下可以通过键入 Option-Enter(或 Option-Return)来实现。
虽然我发现some pages 解释了如何允许 换行而 不必使用Option 修饰符,但我找不到任何完全禁用换行符。
如何做到这一点?
【问题讨论】:
标签: cocoa nstextfield nstextview fieldeditor
您可以创建 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;
}
【讨论】:
请问您为什么要禁用此功能?这是操作系统的一个非常标准的部分。请记住,用户可能会从其他地方粘贴一些包含换行符的字符串,然后他们将根据需要进行编辑。保留这个特性是否更好,但是当需要将值从视图复制到模型时,使用 NSFormatter 删除换行后的所有内容?
【讨论】:
我执行以下代码来防止在使用 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;
}
【讨论】: