2013-02-08 16 views
6

Uwaga! To pytanie nie jest duplikatem pytania o numer this lub this! Jest to nowe pytanie, które wyjaśnia sprawę.Wykrywanie Backspace w UITextField we właściwy sposób

Tak postępowałem zgodnie ze wszystkimi instrukcjami zamieszczonymi powyżej i mam to UITextField, które staje się puste i przesuwa się do nowej pozycji za każdym razem, gdy użytkownik kliknie przycisk powrotu. Co więcej, śladowe wejścia w TextView i utworzyć etykietę tego tekstu w położeniu TextView było tak:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 

    if (textField.text.length > 5) { 
     CGRect labelFrame = CGRectMake(textField.frame.origin.x, textField.frame.origin.y, 0, 0); 
     UILabel *label = [[UILabel alloc] initWithFrame: labelFrame]; 
     label.font = [UIFont fontWithName:@"HelveticaNeue" size:14]; 
     [label setText:textField.text]; 
     [label setTextColor: [BSFunctions getColorFromHex:@"3f3f3f"]]; 
     label.backgroundColor =[UIColor lightGrayColor]; 
     [label sizeToFit]; 
     [labelsArray addObject:label]; 
     [self.view addSubview: label]; 

     CGRect newTextFieldFrame = CGRectMake(labelFrame.origin.x + label.frame.size.width + 5, labelFrame.origin.y, 320, 30); 
     NSLog(@"Rect is %@", NSStringFromCGRect(newTextFieldFrame)); 
     textField.frame = newTextFieldFrame; 
     textField.text = @"\u200B"; 
    }  
    return YES; 
} 

ustawić tekst w UITextField tekst będzie @"\u200B" i potem chce wykryć przycisk Backspace na nim tak:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ 

    if ([string isEqualToString:@""]) { 
     NSLog(@"backspace button pressed"); 

     if (labelsArray.count > 0) { 
      UILabel *labelToDelete = [labelsArray lastObject]; 
      CGRect labelPosition = labelToDelete.frame; 
      CGRect oldPosition = textField.frame; 
      textField.frame = CGRectMake(labelPosition.origin.x, labelPosition.origin.y, oldPosition.size.width, oldPosition.size.height); 
      [labelToDelete removeFromSuperview]; 
      [labelsArray removeLastObject]; 
      textField.text = @"\u200B"; 
     } 
    } 

    return YES; 
} 

Ale problemem jest to, że działa tylko raz a następnie, nawet z znak specjalny dodany na początku textField to nie działa. Co jest prawdopodobnie nie tak?

Odpowiedz

6

Po ustawieniu

textField.text = @"\u200B"; 

w textField: shouldChangeCharactersInRange: replacementString:

Trzeba będzie dodać

return NO; 

inaczej będzie nadal powrotu tak i zastąpić go z @ "", a następnie po ponownym naciśnięciu backspace nic się nie zmieni i metoda delegata nie zostanie wywołana.

Możliwe, że źle zrozumiałem twój cel tutaj, ale mam nadzieję, że to pomoże.

Powiązane problemy