2013-06-19 2 views
1

Я хочу, чтобы фокус текстового поля переключился на следующее текстовое поле, как только в текущее текстовое поле введено 2 символа. Я использую этот код, но я считаю, что размещение оператора return вызывает определенные проблемы, такие как: 1) в последнем текстовом поле оно не ограничивает его двумя символами. 2) После смещения фокуса на следующее текстовое поле. Если я вернусь в предыдущее поле «Текст», то он также позволит мне ввести более двух символов. 3) Из-за добавления «self.firstResponder = текстовое поле в методе редактирования textfieldDidBegin мои другие текстовые поля становятся невосприимчивыми, т. Е. Не позволяют мне вводить какой-либо текст. Вот мой код для всех трех методов .:-- это код в методе shouldCharctersInRange:Смещение фокуса на следующее текстовое поле

(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range 
    replacementString:(NSString *)string { 
    NSString * newString = [textField.text stringByReplacingCharactersInRange:range 
    withString:string]; 

    if (string.length==0) { 
    return YES; 
    } 


    if (textField == txt_mins) { 
    return [[AppDelegate sharedInstance] setNumberFormat:textField newString:newString 
    IntegerLimit:5 FractionLimit:2 NumberType:2]; 
    } 
    else if (textField == txt_units){ 
    return [[AppDelegate sharedInstance] setNumberFormat:textField newString:newString 
    IntegerLimit:5 FractionLimit:2 NumberType:2]; 
} 
    // Below logic is for All 4 Modifer Textfields 
    // we are restricting the user to enter only max 2 characters in modifier textfields 
    and 
    also automatically 
    // converting each entered character to the uppercase string. 
    if (textField==txt_modifier1 || textField==txt_modifier2 || textField==txt_modifier3 || 
    textField==txt_modifier4) { 
    // This condition is restricting the user from entering the special characters in the 
    modifier textfield. 
    if ([string rangeOfCharacterFromSet:[[NSCharacterSet alphanumericCharacterSet] 
    invertedSet]].location != NSNotFound) { 
     // There are non-alphanumeric characters in the replacement string 
     return NO; 
    } 
    //Added by Shikhar 
    // dated: 18 June, 2013 
    else{ 
     NSString *result = [textField.text stringByReplacingCharactersInRange:range 
     withString:string.uppercaseString]; 


     // this condition is automatically transferring the focus to the next textfield as 
     soon we type two characters in the\ 
     // the current textfield. 
     textField.text = result; 
     if (result.length == 2){ 
      [self toggleTextfield]; 
     } 

    return NO; 
    } 
} 
return YES; 

}

- (void) toggleTextfield 
{ 
NSInteger nextTag = self.firstResponder.tag; 
nextTag += 1; 
UITextField *nextTextField = (UITextField *)[self.view viewWithTag:nextTag]; 
if (nextTextField) 
{ [nextTextField setUserInteractionEnabled:YES]; 
    [nextTextField becomeFirstResponder]; 
} 

} и код для редактирования textfieldDidBegin заключается в следующем:

- (void)textFieldDidBeginEditing:(UITextField *)textField { 


    self.firstResponder = textField; 
    [textField setInputAccessoryView:tb_doneToolbar]; 
    txt_currentFocusedTextfield = textField; 




CGRect textFieldRect =[self.view.window convertRect:textField.bounds 
    fromView:textField]; 
CGRect viewRect =[self.view.window convertRect:self.view.bounds fromView:self.view]; 

CGFloat midline = textFieldRect.origin.y +1.0*textFieldRect.size.height; 
CGFloat numerator =midline - viewRect.origin.y- MINIMUM_SCROLL_FRACTION * 
viewRect.size.height; 
CGFloat denominator =(MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)* 
viewRect.size.height; 
CGFloat heightFraction = numerator/denominator; 

animatedDistance = floor(162.0 * heightFraction); 

CGRect viewFrame = self.view.frame; 

viewFrame.origin.y -= animatedDistance; 

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 
[self.view setFrame:viewFrame]; 
[UIView commitAnimations]; 

}

ЕСЛИ кто-то может помочь, тогда он будет высоко оценен.

+0

Никогда не устанавливайте firstResponder напрямую, используйте 'theFirstResponder' и' resignFirstResponder'. – Kevin

+0

Я не уверен, где вы предложили мне внести изменения. Вы можете указать это! Благодарю. – Shikhar

+0

Из вашего вопроса «3» Из-за добавления «self.firstResponder = текстовое поле в методе редактирования textfieldDidBegin» <- везде, где вы это сделали. И это, вероятно, не полное исправление, просто комментарий к этому конкретному коду. – Kevin

ответ

0

решение для 1-го вопроса будет

// добавить этот код, указанный выше код, где проверка toggleTextfield

if(textField==txt_modifier4 && result.length ==2) 
    [self resignFirstResponder] 

Вопрос: когда другие TextFields становятся отвечать на запросы?

+0

Прежде всего, где внести изменения, которые вы предложили, я не совсем понимаю об этом, а затем по вашему вопросу другие поля tExt становятся невосприимчивыми, как только я нажимаю одно из текстовых полей модификатора, то есть после ввода этих четырех текстовых полей, если я попытаюсь типа в других текстовых файлах они становятся невосприимчивыми. – Shikhar

+0

проверить измененный код. и о вашем третьем вопросе: магазин nil в self.firstResponder, когда он входит в любые другие поля или скрывает вашу клавиатуру. Я не уверен в этом, но он может решить вашу проблему. – keen

+0

Я сделал это изменение в моем didBeginEditing, но это другие текстовые поля по-прежнему не отвечают, даже предыдущий модификатор textfileds: if (textField == txt_modifier1 || textField == txt_modifier2 || textField == txt_modifier3 || textField == txt_modifier4) { self.firstResponder = textField; } else { self.firstResponder = Nil; } Можете ли вы сказать неправильный подход, которым я придерживался. – Shikhar

1

Мой код делает аналогичную вещь; Другое дело, что он переключает текстовые поля на следующие/предыдущие кнопки на inputAccessoryView на UIKeyboard. Сначала вам нужно реализовать метод, который возвращает массив из UITextField s на контроллере представления.

- (NSArray *)arrayOfTextFieldsOnTheVC{ 

    //Return an array of all the desired textfields on the VC 
    return [NSArray arrayWithObjects: self.textField1, self.textField2, nil]; 

} 

На данный момент я использую два различных метода под названием

- (void)tappedNextOnkeybardExtensionView:(KeyboardExtensionView *)keyboardExtensionView; 
- (void)tappedPreviousOnkeybardExtensionView:(KeyboardExtensionView *)keyboardExtensionView; 

KeyboardExtensionView обычай UIView, который я использую в качестве inputAccessoryView для клавиатуры. Когда пользователь нажимает следующий или предыдущий, я вызываю метод ниже. Вам нужен другой механизм, чтобы вызвать этот метод (я думаю, вы должны переопределить TextField: shouldChangeCharactersInRange), который последовательно между данными TextFields:

- (void)setNextTextFieldFirstResponderFromTextFieldsArray:(NSArray *)arrTextFields inForwardDirection:(BOOL)forwardDirection{ 

for (int i = 0; i < [arrTextFields count] ; i ++){ 

    UITextField *tfd = [arrTextFields objectAtIndex:i]; 
    if ([tfd isFirstResponder]){ 

     if (i == 0 && !forwardDirection){ 
      // Tapped previous on first text field 

      break; 
     } 

     else if (i == [arrTextFields count] - 1 && forwardDirection){ 
      //Tapped next on last text field 

      break; 

     } 

     else if (forwardDirection){ 

      [[arrTextFields objectAtIndex:i+1] becomeFirstResponder]; 
      break; 
     } 

     else if (!forwardDirection){ 

      [[arrTextFields objectAtIndex:i-1] becomeFirstResponder]; 
      break; 
     } 

    } 
} 
} 

forwardDirection должны быть NO, если вы хотите пойти на предыдущую клавиатуру, и YES если вы хотите перейти к следующему. arrTextFields - это массив UITextFields на VC, используйте первый метод для вызова этого в качестве первого параметра.

Смежные вопросы