NSTextField의 입력 값 확인

6102 단어 코코아
출처 : htps : // 기주 b. 코 m / 누노 CKY / TE XT Fue LD ゔ ぃ 다치온

하고 싶은 일



네트워크 설정에서 IP 주소를 입력하거나 140자를 넘지 않는 텍스트를 입력하려는 경우 이러한 조건을 충족시키지 못한다고 사용자에게 알리는 방법은 무엇입니까?

덧붙여서 OSX의 네트워크 설정의 IP 주소 설정에서는 이런 경고가 나오고 텍스트가 "0.0.0.0"이 된다.



그 1 NSTextField의 notification 사용



TextFieldValidation에서는 NSTextFiled의 delegate에 AppDelegate를 지정하고 있다.
그리고 AppDelegate 에 controlTextDidEndEditing: 메소드를 구현해, 그 중에서 어느 TextField 로부터 온 통지인지를 판정, 적절한 평가기를 불러 평가한다.
이 방법을 사용하면 NSTextField 안에서 Enter를 누르거나 Tab 키 등으로 포커스를 다른 곳으로 이동했을 때 평가가 이루어진다.
-(void)controlTextDidEndEditing:(NSNotification *)notification
{
    NSTextField *tf = [notification object];
    NSString *identifier = [tf identifier];

    if ([identifier isEqualToString:@"ipaddress"]) {
        IPAddressTextValidator *validator = [[IPAddressTextValidator alloc] init];
        if (![validator validate:tf.stringValue]) {
            NSRunAlertPanel(@"error",
                            @"invalid format",
                            @"close",
                            nil,
                            nil);
        }
    }
.
.
.

그 두 문자열 속성에 bind하는 방법



TextFieldValidation2는 입력을 실시간으로 보는 방법.
AppDelegate에 NSString의 프로퍼티를 준비해, NSTextField의 value 프로퍼티에 각각 bind 한다. 그 때, 옵션 「Continuously Updates Value」를 유효하게 한다. 이제 문자를 입력할 때마다 속성 setter가 호출됩니다.



그리고는 프로퍼티의 setter 중에서 텍스트 평가기에 의한 판정을 실시하면 된다. 불법이라면 배경을 붉게 하거나 툴팁에 올바른 값의 샘플을 표시시키거나.

AppDelegate.m
-(void)setText0:(NSString *)text0
{
    if ([_text0 isEqualToString:text0])
        return;
    _text0 = [text0 copy];

    IPAddressTextValidator *validator = [[IPAddressTextValidator alloc] init];
    if (![validator validate:_text0]) {
        [_textField0 setBackgroundColor:[NSColor redColor]];
    }
    else {
        [_textField0 setBackgroundColor:[NSColor whiteColor]];
    }
}

어려움



TextFieldValidation2에서는 부정한 입력 시에 TextField의 배경을 붉게 할 생각이지만, 편집중에 setBackgroundColor를 실시해도 에리어의 위 부분이 조금 붉어지는 것만으로 전체가 붉게 되지 않는 문제가. 포커스를 떼면 전체가 붉어진다. 이것 어떻게 하면 고칠 수 있을까.

텍스트 평가기에 대하여



샘플에서는 IPAddressTextValidator와 LessThan30TextValidator의 2개를 만들어 보았다. 이 근처 뭔가 범용적인 클래스가 있지 않을까 싶다. 하지만 StackOverflow 봐도 특히 그럴듯한 클래스는 없는 것 같고, 모두 어떻게 하고 있을까.

좋은 웹페이지 즐겨찾기