Протокол UITextFieldDelegate изменен между iOS 4.3 и 5.0.Что происходит? - PullRequest
0 голосов
/ 05 января 2012

Кажется недокументированными изменения в том, как протокол UITextFieldDelegate работает между iOS 4.3 и iOS 5.0, что нарушает мой код.

Просто воспроизвести следующим образом: Используя XCode 4.2, создайте проект 'Single View Application', который называетсятестовое задание.Использовать параметры по умолчанию (т. Е. Нет раскадровки, но да - ARC). Задайте цель развертывания 4.3 (чтобы мы могли запустить приложение как в 5.0, так и в 4.3)

Поместите этот код в заголовочный файл ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@property(nonatomic,strong) UITextField *textField1;
@property(nonatomic,strong) UITextField *textField2;
@property(nonatomic,strong) UILabel *resultsLabel;

@end

Поместите это в файл ViewController.m:

#import "ViewController.h"

@implementation ViewController

@synthesize textField1,textField2,resultsLabel;

- (void)viewDidLoad {
    textField1=[[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 30)];
    textField1.tag=1;
    textField1.backgroundColor=[UIColor whiteColor];
    textField1.delegate=self;
    [self.view addSubview:textField1];

    textField2=[[UITextField alloc] initWithFrame:CGRectMake(10, 50, 300, 30)];
    textField2.tag=2;
    textField2.backgroundColor=[UIColor whiteColor];
    textField2.delegate=self;
    [self.view addSubview:textField2];

    resultsLabel=[[UILabel alloc] initWithFrame:CGRectMake(10, 90, 300, 30)];
    resultsLabel.backgroundColor=[UIColor clearColor];
    [self.view addSubview:resultsLabel];

    [super viewDidLoad];
}

-(void)textFieldDidEndEditing:(UITextField *)textField {
    switch (textField.tag) {
        case 1:
            // textField1
            [textField2 becomeFirstResponder];
            resultsLabel.text=@"Finished editing 1st box";
            break;

        case 2:
            // textField2
            resultsLabel.text=@"Finished editing 2nd box";
            break;
    }
}

@end

Запустите код в симуляторе, и он отобразит два белых поля UITextFields.Коснитесь первого, затем коснитесь второго.

Если запустить на iOS 4.3 на симуляторе, UILabel отобразит «Закончено редактирование 1-го окна». Если запустить на iOS 5.0 на симуляторе, UILabel отобразит «Завершено редактирование 2-го окна."

Я пытаюсь сделать так, чтобы при выходе из поля i вы автоматически переходили в поле (i + 1).Любые предложения относительно того, что не так, и как это исправить?Я не вижу никаких упоминаний в заметках о выпуске iOS 5 от Apple.

Ответы [ 2 ]

0 голосов
/ 05 января 2012

При прикосновении ко второму полю оно автоматически становится первым респондентом, поэтому при его постепенной установке - дважды.

-(void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField  == textField2) {

        resultsLabel.text=@"Finished editing 2nd box";
    }
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    if (textField == textField1) {
        [textField1 resignFirstResponder];
        [textField2 becomeFirstResponder];
    }
    if (textField == textField2) {
        [textField2 resignFirstResponder];
        [textField1 becomeFirstResponder];
    }
    return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
        if (textField == textField2) {
        resultsLabel.text=@"Finished editing 1st box";

    }
}

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

0 голосов
/ 05 января 2012

Я подозреваю, что textFieldDidEndEditing: вызывается дважды.

Один раз, когда вы выбираете textField2 (который завершает редактирование в textField1), а затем снова, когда вы вызываете [textField2 becomeFirstResponder];: Поскольку textField2, это уже первый ответчик.(потому что вы прикоснулись к нему, чтобы завершить редактирование textField1), когда вы говорите, что он снова становится firstResponder, он фактически отказывается от статуса firstResponder (который вызывает textFieldDidEndEditing), а затем снова становится firstResponder.

Попробуйте изменить [textField2 becomeFirstResponder]; на следующее:

 if (![textField2 isFirstResponder]) {
      [textField2 becomeFirstResponder];
 }  
...