0

간단한 컨트롤을 사용하여 혈압 앱을 만들어 결과를 추가하려고합니다. 간단하게하기 위해 사용자가 수축기 혈압에 3자를 입력하면 앱에서 커서 (및 첫 번째 응답자)를 이완기 값으로 이동시킨 다음 맥박을 이동해야한다고 결정했습니다. 그래서 이렇게 만들었습니다.UITextField에서 키 입력 이벤트를 설정하는 올바른 방법

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    if ([self systolicValue].isFirstResponder && [self systolicValue].text.length == 3) { 
     [[self diastolicValue] becomeFirstResponder]; 
    } 
    else if ([self diastolicValue].isFirstResponder && [self diastolicValue].text.length == 2) { 
     [[self pulseValue] becomeFirstResponder]; 
    } 
    else if ([self pulseValue].isFirstResponder && [self pulseValue].text.length == 2) { 
     [[self pulseValue] resignFirstResponder]; 
    } 
    return YES; 
} 

나는 좋은 해결책이라고 생각하지만 원하는 방식으로 작동하지 않습니다. systolicValue의 세 숫자는 diastolicValue 첫 번째 응답자를 즉시 ​​만들지 않습니다. 첫 번째 사용자가 다른 번호를 누른 다음 커서가 다음 텍스트 필드로 이동하고 숫자가 여기에옵니다. 사용자가 세 개의 숫자 뒤에 커서가 자동으로 이동한다는 단서가 없기 때문에 약간 불편합니다.

어떤 아이디어가 다음 텍스트 필드에 즉시 집중합니까? 나는 을 viewDidLoad()에 넣고 위의 방법과 비슷하지만 (void이기 때문에 물론 return이 아니지만), 작동하지 않습니다.

2013-08-07 08:39:09.805 MyApp[973:c07] -[AddViewController textFieldTextDidChange:]: unrecognized selector sent to instance 0x7580000 
2013-08-07 08:39:09.809 MyApp[973:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AddViewController textFieldTextDidChange:]: unrecognized selector sent to instance 0x7580000' 
*** First throw call stack: 
(0x1c92012 0x10cfe7e 0x1d1d4bd 0x1c81bbc 0x1c8194e 0xb904f9 0x1cec0c5 0x1c46efa 0xac4bb2 0xad7e6b 0xe5174 0xef5a6 0xb904f9 0x1cec0c5 0x1c46efa 0xac4bb2 0x35689de 0x26b61da 0x2aefdfc 0x2af2bf8 0x3543612 0x354374a 0x3543ec0 0x3543cb8 0x3543204 0x293122b 0x2931193 0x3515e96 0x35424cc 0x2aed136 0x2aec3c6 0x2b1f980 0x317b7fd 0x2b16576 0x2b176da 0x2b1572e 0x3179eaa 0x2b2faf1 0x2b1f72a 0x2af36ae 0x26f262b 0x10e36b0 0x355e810 0x27311a4 0x27332ff 0x1d50b4 0x197aef 0x198e58 0x1979fe 0x1a1d29 0x24ddb 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x1227f5 0x24e35 0x24806 0x24beb 0x16698 0x1beddf9 0x1bedad0 0x1c07bf5 0x1c07962 0x1c38bb6 0x1c37f44 0x1c37e1b 0x1bec7e3 0x1bec668 0x13ffc 0x1f2d 0x1e55 0x1) 
libc++abi.dylib: terminate called throwing an exception 
(lldb) 

답변

1

같은 일을 시도해보십시오 : 첫 번째 숫자는이 수 사실이 작동하지 않습니다 전혀, 이후

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string // return NO to not change text 
{ 

    NSMutableString *finalString = [[NSMutableString alloc] initWithString:textField.text]; 
    [finalString replaceCharactersInRange:range withString:string]; 


    if ([self systolicValue].isFirstResponder && [self systolicValue].text.length == 3)) 
    { 
     [[self systolicValue] setText:finalString]; 
     [[self systolicValue] resignFirstResponder]; 
     return NO; 
    } 

    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField   // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called 
{ 
    [[self diastolicValue] becomeFirstResponder]; 
} 
+0

너무 감사합니다! 그것은 실제로 작동합니다 :) 실제로 왜 나는 모르지만 그것은 '[self systolicValue] .text.length == 2'3'대신 3 자로 올바르게 작동해야합니다. BTW 첫 번째 응답자를 사퇴시키는 것이 정말로 필요합니까? 그것 없이는 효과가 있지만 왜 사임하는 것이 더 나은지? –

+0

좋습니다. 바로 이거 야. 추가해야 할 것을 무시해야하기 때문에 길이는 2입니다. 우리는 shouldChangeCharactersInRange 메서드를 호출하고 있습니다. 하지 않았다. 무언가 ... :) – nithinbhaktha

+0

당신은 정말로 옳았습니다. 그리고 지금 나는 어떤 일이 일어나는지 봅니다. 나는 다시 한번 너에게 감사하고 싶다. :) –

관련 문제