Как я могу избавиться от «призрачного» текста, который появляется в UITextField после очистки поля программно? - PullRequest
2 голосов
/ 18 июня 2011

У меня странная проблема с UITextField - я устанавливаю его значение равным @ "" (или что-то еще вызывает его), а затем сужаю поле до нуля. В следующий раз, когда я удаляю его, оно отображает то же значение, которое было до того, как я его сжал, независимо от того, изменил ли я текст в представлении. Ввод текста в поле приводит к исчезновению ошибки, но выглядит плохо.

Image showing the problem

Полный код для воспроизведения:

throwaway_testViewController.h:

#import <UIKit/UIKit.h>

@interface throwaway_testViewController : UIViewController <UITextFieldDelegate>{



    UITextField * unitField;
}

@property (nonatomic, assign) IBOutlet UITextField * unitField;



-(IBAction)setEditingSectionUnits;
-(void)setEditingSectionValue;

-(IBAction)equalsPress;

@end

throwaway_testViewController.m

#import "throwaway_testViewController.h"

@implementation throwaway_testViewController

@synthesize unitField;

#pragma mark - Inputs

-(IBAction)equalsPress{
    [UIView animateWithDuration:0.5 animations:^(void){
        [unitField setText:@""];
        [self setEditingSectionValue];
    }];
}


#pragma mark Input Control

-(void)setEditingSectionUnits{
    [UIView animateWithDuration:0.5 animations:^(void){
        CGRect newRect = unitField.frame;
        newRect.size.width = 160;
        unitField.frame = newRect;
    }completion:^(BOOL completed){
        completed ? [unitField setNeedsDisplay] : nil;
    }];

    [unitField becomeFirstResponder];
}

-(void)setEditingSectionValue{
    [UIView animateWithDuration:0.5 animations:^(void){
        CGRect newRect = unitField.frame;
        newRect.size.width = [unitField.text sizeWithFont:unitField.font constrainedToSize:CGSizeMake(80, 250)].width;;
        unitField.frame = newRect;
    }completion:^(BOOL completed){
        completed ? [unitField setNeedsDisplay] : nil;
    }];

    [unitField resignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    [self setEditingSectionValue];
    return TRUE;
}

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    [self setEditingSectionUnits];
}


@end

В xib поместите UITextField, привязанный к unitField, и установите для делегата текстового поля владельца файла.

Поместите UIButton, помеченный equalsPress, и привяжите его к этому IBAction, а другой, называемый edit, привязанный к setEditingSectionUnits. Чтобы увидеть воспроизведенную ошибку:

  • Запустить приложение
  • Нажмите изменить
  • введите что-нибудь в текстовое поле (минимум 8-10 символов)
  • нажмите клавишу ввода на клавиатуре
  • нажмите равноПресс
  • нажмите изменить
  • Должны появиться: курсор и пустое текстовое поле
  • На самом деле смотрите: все, что вы набрали последним, с курсором в начале.
  • При наборе текста этот текст исчезает.

Ответы [ 4 ]

2 голосов
/ 17 июля 2011

У меня проблемы с копированием вашей проблемы. Я смоделировал это, чтобы использовать те же механизмы, что и у вас, и это работает, как и ожидалось.

- (void)viewDidLoad
{
  [super viewDidLoad];
  [self.unitField setText:@"Testing"];
}

- (IBAction)hideButtonTapped:(id)sender
{
  [UIView animateWithDuration:0.5 animations:^(void)
    {
      [self.unitField setText:@""];
      self.unitField.frame = CGRectMake(10, 10, 0, 30);
    }
  ];
}

- (IBAction)showButtonTapped:(id)sender
{
  [UIView animateWithDuration:0.5 animations:^(void)
    {
      self.unitField.frame = CGRectMake(10, 10, 100, 30);
    }
  ];
}

Возможно, вы можете дать больше своего кода, так как я чувствую, что вы, возможно, пропустили что-то важное, или вы можете указать, где ваша реализация отличается от описанной выше.

1 голос
/ 21 июля 2011

после репликации вашего кода я обнаружил, что упомянутая вами проблема возникает только в том случае, если вы нажмете клавишу возврата на клавиатуре, а затем нажмете кнопку равенства ... отставка первого респондента перед вызовом блока анимации в вашем методе setEditingSectionValue решит проблему:

-(void)setEditingSectionValue{
    [unitField resignFirstResponder];
    [UIView animateWithDuration:0.5 animations:^(void){
        CGRect newRect = unitField.frame;
        newRect.size.width = [unitField.text sizeWithFont:unitField.font constrainedToSize:CGSizeMake(80, 500)].width;;
        unitField.frame = newRect;
    }completion:^(BOOL completed){
        completed ? [unitField setNeedsDisplay] : nil;
    }];
}
1 голос
/ 19 июля 2011

Я придумала решение вашей проблемы, это нехорошо, но, по крайней мере, работает: D

-(IBAction)equalsPress{
      tmp = nil;
      //same code as yours
}

-(void)setEditingSectionUnits{  
    if (tmp != nil) {
        unitField.text = tmp;
    }
    //same code as yours
}

-(void)setEditingSectionValue{
    if ([unitField.text length] > 9) {
            tmp = unitField.text;
            unitField.text = [unitField.text substringToIndex:9];
            [tmp retain];
    }else {
           tmp = nil;
    }
    //same code as yours
}

Я объявил tmp в заголовочном файле:

NSString *tmp;
0 голосов
/ 18 июля 2011

Я быстро посмотрел, но вы можете попробовать сохранить UITextField:

@property (nonatomic, retain) IBOutlet UITextField * unitField;

Также равноПресс может быть

-(IBAction)equalsPress{
    [unitField setText:@""];
    [UIView animateWithDuration:0.5 animations:^(void){
        [self setEditingSectionValue];
    }];
}
...