TextFieldDidBeginEditing: для более чем одного текстового поля
Я новичок в программировании на iphone, и здесь я столкнулся с некоторыми проблемами. Теперь в моем приложении у меня есть два текстовых поля, и я хочу запустить событие, когда второе текстовое поле начинает редактирование. теперь я использую следующую функцию
- (void)textFieldDidBeginEditing:(UITextField *)textField
но дело в том, что событие запускается, когда первое текстовое поле начинает редактирование. Он не ждет второго текстового поля. Есть ли способ использовать эту функцию для второго текстового поля или может каким-то образом узнать и передать ему значение активного текстового поля?
Я попытался записать имя текстового поля вместо (UITextField *) textField в функции, но все тот же результат.
Ответы
Ответ 1
Если бы я был вами, я бы установил тег (в Interface Builder) второго textField
to 2 или что-то подобное. Тогда вы можете просто сделать это:
-(void)textFieldDidBeginEditing:(UITextField *)textField {
if (textField.tag == 2) {
//this is textfield 2, so call your method here
}
}
РЕДАКТИРОВАТЬ. Пожалуйста, сделайте это, чтобы узнать, был ли метод даже вызван:
-(void)textFieldDidBeginEditing:(UITextField *)textField {
NSLog(@"The method was called");
}
Для Swift 2.2
func textFieldDidBeginEditing(textField: UITextField) {
if textField.tag == 2 {
//this is textfield 2, so call your method here
}
}
Ответ 2
Этот метод делегата будет вызван каждый раз, когда будет начато редактирование ЛЮБОГО текстового поля, поэтому вы должны контролировать, что делается, когда это происходит. Я предлагаю вам сделать что-то вроде:
-(void)textFieldDidBeginEditing: (UITextField *)textField
{
if (textField == mySecondTextField)
{
//Do what you need
}
else
{
//Do nothing
}
}
Надеюсь, это поможет вам!
Ответ 3
Утилита свойство тега в Interface Builder для идентификации ваших объектов вида в приложении во время выполнения. Это облегчит жизнь, особенно когда вы будете готовы локализовать свое приложение для разных языков.
![Screenshot of the tab property in IB]()
В вашем файле заголовка для вашего контроллера просмотра
#define kUsernameField 100
#define kPasswordField 101
#define kStartButton 300
В файле реализации контроллера представления
- (void)textFieldDidBeginEditing:(UITextField *)textField {
switch (textField.tag) {
case kUsernameField:
// do user name stuff
break;
case kPasswordField:
// do password stuff
break;
default:
NSLog(@"No case statement for %@", [textField description]);
break;
}
}
Здесь вы найдете много учебников, которые используют поле заголовка UIButton для их идентификации. Например:
- (IBAction)buttonTouchUp:(id)sender {
UIButton *button = (UIButton *)sender;
// don't like
if ([button.currentTitle isEqualToString:@"Start"] == NSOrderedSame) {
// because if localize your for other language then you will have
// include code for those other language
// French: Démarrer
// Spanish: Inicio
// blah blah blah
}
// better
if (button.tag == kStartButton) {
// very simple, no code changes for localization
// blah blah blah
}
}
Если вы создаете объект с кодом, вы можете установить тег:
button.tag = kStartButton;
// or
[button setTag:kStartButton];
Ответ 4
Вы должны сначала объявить UITextFieldDelegate
в своем контроллере .h
И установите делегат вашего текстового поля. ех. myInput.delegate = self;
-(void)textFieldDidBeginEditing:(UITextField *)sender
{
if ([sender isEqual:myInput])
{
NSLog(@"test");
}
}
Это отлично работает для меня.
Ответ 5
Вы проверили, настроен ли ваш второй делегат textViews на себя? У меня была такая же проблема, когда я забыл установить делегат из других текстовых полей, и, следовательно, метод делегата не срабатывал.
Ответ 6
Пожалуйста, взгляните на мой ответ в этом Вопросе, это именно то, что вы ищете
Цель C: что такое отправитель "(id)" ?