NSTextField의 문자 수 제한 수행
개요
NSTextField
의 입력 문자수에 제한을 걸고 싶다. NSTextField
, 다른 하나는 NSFormatter
의 커스텀 클래스를 만드는 것. GitHub
htps : // 기주 b. 코 m / Pom m Dau / 쿠이타 _ te xt fu e ldo th chura c r no mbe r mi t
방법 1_NSTextField의 사용자 지정 클래스 만들기
구현
FirstWindowTextField.m#import "FirstWindowTextField.h"
static const NSUInteger kCharLimit = 5; // 文字数制限
@interface FirstWindowTextField() <NSTextFieldDelegate>
@end
@implementation FirstWindowTextField
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
}
- (id) initWithCoder:(NSCoder *)decoder
{
self = [super initWithCoder:decoder];
if (self) {
[self setDelegate: self];
}
return self;
}
// MARK:- NSTextFieldDelegate(実際はNSControl由来) Methods
- (void)controlTextDidChange:(NSNotification *)aNotification {
NSString *newString = [self stringValue];
if ([newString length] > kCharLimit) {
[self setStringValue:[newString substringToIndex:kCharLimit]];
}
}
@end
#import "FirstWindowTextField.h"
static const NSUInteger kCharLimit = 5; // 文字数制限
@interface FirstWindowTextField() <NSTextFieldDelegate>
@end
@implementation FirstWindowTextField
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
// Drawing code here.
}
- (id) initWithCoder:(NSCoder *)decoder
{
self = [super initWithCoder:decoder];
if (self) {
[self setDelegate: self];
}
return self;
}
// MARK:- NSTextFieldDelegate(実際はNSControl由来) Methods
- (void)controlTextDidChange:(NSNotification *)aNotification {
NSString *newString = [self stringValue];
if ([newString length] > kCharLimit) {
[self setStringValue:[newString substringToIndex:kCharLimit]];
}
}
@end
NSTextField
의 서브 클래스를 작성해, xib측에서 NSTextField
의 클래스에 지정. substringToIndex:kCharLimit
그리고 전부터 제한 문자수를 꺼내고 있다. controlTextDidChange:(NSNotification *)aNotification;
방법 2_NSFormatter의 사용자 지정 클래스 만들기
참고
objective c - How to limit NSTextField text length and keep it always upper case? - Stack Overflow
(구) Cocoa의 매일 : NSFormatter
Creating a Custom Formatter
isPartialStringValid:newEditingString:errorDescription:
구현(코드)
NSFormatter
의 커스텀 클래스, CustomTextFieldFormatter
를 작성한다. // CustomTextFieldFormatter.m
// TextFieldWithCharacterNumberLimit
#import "CustomTextFieldFormatter.h"
@interface CustomTextFieldFormatter ()
@property NSUInteger charLimit; // 制限文字数
@end
@implementation CustomTextFieldFormatter
- (id)init {
if(self = [super init]){
[self setCharLimit:3];
}
return self;
}
/**
@brief 部分文字列が有効かどうか - ユーザがキーを押す際に呼ばれる
@param partialString 現在セル内にあるテキスト
@param newString partialStringの変更が必要なときの置換文字列
@return 部分文字列が有効かどうか
*/
- (BOOL)isPartialStringValid:(NSString *)partialString
newEditingString:(NSString **)newString
errorDescription:(NSString **)error {
if ((int)[partialString length] > _charLimit) {
*newString = [partialString substringToIndex:_charLimit];
return NO; // newStringでpartialStringを置換
}
return YES;
}
// MARK:- NSFormatter Methods
// NSFormatterのカスタムクラス作成に必須なメソッド
/**
@brief セルのオブジェクトを文字列表現に変換(数値→文字列)
*/
- (NSString *)stringForObjectValue:(id)object {
return (NSString *)object;
}
/**
@brief 文字列をセルに関連付けられたオブジェクトに変換(文字列→数値)
*/
- (BOOL)getObjectValue:(id *)object
forString:(NSString *)string
errorDescription:(NSString **)error {
*object = string;
return YES;
}
@end
newString
에 제한 문자수의 캐릭터 라인을 대입하고 있다. /**
@brief 部分文字列が有効かどうか - ユーザがキーを押す際に呼ばれる
@param partialString 現在セル内にあるテキスト
@param newString partialStringの変更が必要なときの置換文字列
@return 部分文字列が有効かどうか
*/
- (BOOL)isPartialStringValid:(NSString *)partialString
newEditingString:(NSString **)newString
errorDescription:(NSString **)error {
if ((int)[partialString length] > _charLimit) {
*newString = [partialString substringToIndex:_charLimit];
return NO; // newStringでpartialStringを置換
}
return YES;
}
NSFormatter
의 커스텀 클래스를 작성할 때 override가 필요한 메소드. // MARK:- NSFormatter Methods
// NSFormatterのカスタムクラス作成に必須なメソッド
/**
@brief セルのオブジェクトを文字列表現に変換(数値→文字列)
*/
- (NSString *)stringForObjectValue:(id)object {
return (NSString *)object;
}
/**
@brief 文字列をセルに関連付けられたオブジェクトに変換(文字列→数値)
*/
- (BOOL)getObjectValue:(id *)object
forString:(NSString *)string
errorDescription:(NSString **)error {
*object = string;
return YES;
}
구현 (xib 측)
CustomTextFieldFormatter
로 한다. 도전
/**
@brief 無効な文字を入力しないようにする
@param partialStringPtr 検証する新しい文字列
@param proposedSelRangePtr 文字列が受け入れられるか置き換えられる場合に使用される選択範囲。
@param origString 変更が提案される前の元の文字列。
@param origSelRange 変更が行われる選択範囲。
*/
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr
originalString:(NSString *)origString
originalSelectedRange:(NSRange)origSelRange
errorDescription:(NSString **)error {
int size = (int)[*partialStringPtr length];
if (size > _charLimit) {
return NO;
}
return YES;
}
Reference
이 문제에 관하여(NSTextField의 문자 수 제한 수행), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/IKEH/items/bd2a8b13b56fcae24d73텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)