UITextfield и UIPickerView

на мой взгляд, у меня 4 текстовых поля, я перетащил их из xib,

поэтому, когда я нажимаю на первые три текстовых поля, я хочу открыть клавиатуру, а когда я нажимаю только на 4-е текстовое поле, я хочу открыть UIPickerView

Ниже я написал код, который открывает UIPickerView для всех текстовых полей.

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

Друзья, подскажите, как мне быть..

Спасибо и с уважением Ранджит


person Ranjit    schedule 26.08.2011    source источник


Ответы (6)


Вы должны проверить, какое текстовое поле находится в этом методе.

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

    if( textField == theFourthTextField ) {
        [textField resignFirstResponder];
        [self uiPickerPopUpDisplay];
    }
}

Это предполагает, что ваш класс имеет ссылку на theFourthTextField. Если это не так, вы можете добавить его и подключить к своему файлу XIB как IBOutlet.

В интерфейсе:

@interface YourClass {
    IBOutlet UITextField* theFourthTextField;
    //...
}

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

@end

В реализации:

@implementation YourClass

@synthesize theFourthTextField;

//...

@end

И подключите свое текстовое поле к theFourthTextField в Interface Builder.

person Luke    schedule 26.08.2011

Используйте метод textFieldShouldBeginEditing: вместо метода textFieldDidBeginEditing:. Скажем, имена ваших текстовых полей textField1, textField2, textField3, textField4. Затем в методе textFieldShouldBeginEditing:.

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

    if (textField == textField4) {

        [self uiPickerPopUpDisplay];
        return NO;
    } 

    return YES;
}
person EmptyStack    schedule 26.08.2011
comment
эй, в чем разница между ними, потому что это работает для текстового поляDidbeginEditing - person Ranjit; 26.08.2011
comment
Версия EmptyStack возвращает NO в этом методе, поэтому текстовое поле не будет находиться в состоянии редактирования. Мой просто вызывает средство выбора, когда оно уже находится в состоянии редактирования. - person Luke; 26.08.2011

Вы должны указать IBOutlet для всех четырех текстовых полей и установить делегат.

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    if(textField == textBox4) {

        [textField resignFirstResponder];
        [self uiPickerPopUpDisplay];
    }
}
person Mobile App Dev    schedule 26.08.2011
comment
Отредактировано: вы возвращали значение в функции void. - person Luke; 26.08.2011

Вы можете сохранить все ссылки на ваши textFields и поместить оператор переключения в свою функцию. Или вы можете установить разные теги для этих textField и проверить тег UITextField textField в своей функции.

person Nekto    schedule 26.08.2011

Если вы не хотите добавлять IBOutlet к каждому из текстовых файлов, вы можете сделать это другим способом — установить и отслеживать номер тега для идентификации каждого UITextField. Кстати, это также будет работать с любым объектом UIView, таким как кнопки, изображения и т. д. Добавление тега к чему-либо также позволяет вам получить ссылку на этот объект, вызвав [self.view viewWithTag:MY_DEFINED_TAG_ID];, что может пригодиться.

В этом случае вы должны начать с перехода в файл xib, в который вы перетащили UITextField в окно, и установить для каждого поля собственный тег №, который вы можете использовать для проверки идентификатора поля из вашего метода. Вы найдете поле тега в инспекторе атрибутов.

В дополнение к этому вы можете в своем файле .h определить теги, чтобы упростить их отслеживание. Этот список определений может находиться либо в файле yourClass.h, либо в файле Constants.h, если у вас есть такой файл, и в этом случае просто убедитесь, что вы #import Constants.h в файл yourClass.h. Я знаю, что есть и другие места, где вы могли бы определить все это, но это два.

#define TEXTFIELD1_TAG 900
#define TEXTFIELD2_TAG 901
#define TEXTFIELD3_TAG 902
#define TEXTFIELD4_TAG 903

Если вы собираетесь использовать – textFieldShouldBeginEditing: или любой другой метод делегата, убедитесь, что вы сделали свой класс UITextFieldDelegate. В yourClass.h (я предполагаю, что это viewController) вам понадобится такая строка:

@interface My_ViewController : UIViewController < UITextFieldDelegate >

Затем вы сможете использовать любой из этих методов в своем представлении для отслеживания текстовых полей:

– textFieldShouldBeginEditing:
– textFieldDidBeginEditing:
– textFieldShouldEndEditing:
– textFieldDidEndEditing:
– textField:shouldChangeCharactersInRange:replacementString:
– textFieldShouldClear:
– textFieldShouldReturn:

Но есть и другие варианты размещения кода переключателя/кейса в зависимости от вашего рабочего процесса. Если вы заглянете в свой файл xib, вы обнаружите множество событий, связанных с вашим текстовым полем, которые могут запускать любой написанный вами пользовательский метод. Например, вы можете подключить событие TouchDown для запуска пользовательского метода, подобного приведенному ниже, который имеет код переключателя/кейса, который вы можете поместить в любое место, где вам это нужно.

В этом методе я использую #define, который мы видели выше, для проверки значений тега. Таким образом, мне не нужно запоминать номер тега, я могу просто запомнить TEXTFIELD1_TAG, что намного проще.

    - (IBAction)textFieldHasBeenTouched:(id)sender {
         int textFieldTag = sender.tag
         switch (textFieldTag)
         {
              case TEXTFIELD1_TAG:
                   // TextField 1
                   break;
              case TEXTFIELD2_TAG:
                   // TextField 2
                   break;
              case TEXTFIELD3_TAG:
                   // TextField 3
                   break;
              case TEXTFIELD4_TAG:
                   // TextField 4
                   break;
              default:
                   break;
         }
}

Или используйте один из методов делегата. В этом методе я предполагал, что вы не использовали #define для отслеживания тегов. Но так как вы установили их в xib, вы знаете, что они из себя представляют.

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

             switch ([textField tag])
             {
                  case 900:
                       // TextField 1
                       break;
                  case 901:
                       // TextField 2
                       break;
                  case 902:
                       // TextField 3
                       break;
                  case 903:
                       // TextField 4
                       break;
                  default:
                       break;
             }
    return YES;
}
person Mark Andrews    schedule 26.08.2011

У вас должны быть ссылки на ваши 4 текстовых поля, верно? Проверьте, если (textField == textField4), а затем выполните свой код.

person Ved    schedule 26.08.2011