2013-02-08 33 views
6

Chú ý! Câu hỏi này không trùng lặp với câu hỏi this hoặc this! Đây là một câu hỏi mới để làm cho mọi thứ rõ ràng hơn.Phát hiện backspace trong UITextField đúng cách

Vì vậy, tôi đã làm theo tất cả các hướng dẫn của bài viết ở trên và tôi có điều này UITextField trở nên trống và di chuyển đến vị trí mới mỗi lần người dùng nhấn nút trả về. Hơn nữa, tôi theo dõi các đầu vào của TextView và tôi tạo ra một nhãn văn bản mà ở vị trí TextView là, như thế này:

- (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; 
} 

tôi đặt văn bản trong UITextField văn bản để được @"\u200B" và sau đó tôi muốn phát hiện nút backspace trên nó như thế này:

- (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; 
} 

Nhưng vấn đề là, nó hoạt động chỉ lần và sau đó, ngay cả với các ký tự đặc biệt thêm vào đầu của TextField nó không hoạt động. Điều gì có thể sai?

Trả lời

6

Sau khi thiết lập

textField.text = @"\u200B"; 

trong TextField: shouldChangeCharactersInRange: replacementString:

Bạn sẽ phải thêm

return NO; 

nếu không nó sẽ tiếp tục sự trở lại YES và thay thế bằng một @ "" và sau đó khi nhấn backspace một lần nữa không có gì sẽ được thay đổi và phương thức đại biểu sẽ không được gọi.

Có thể tôi đã hiểu nhầm mục tiêu của bạn ở đây, nhưng tôi hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan