UITextFieldDelegate вложенных UITextFields, которые не вызываются
-
27-10-2019 - |
Вопрос
У меня есть подкласс a UIView
(MyView), который имеет некоторые UITextField
как подвиды.MyView реализует UITextFieldDelegate
протокол для того, чтобы получать уведомления при нажатии на текстовые поля.Это работало хорошо.Теперь мне нужно поместить текстовые поля в своего рода "контейнер", чтобы иметь возможность входить и выходить из этого контейнера (и всех его дочерних элементов) с UIView
Анимация.Итак, я создал UIView (MySubview), сделал его подвидом MyView и поместил в него все текстовые поля.Анимация работает нормально, но UITextFieldDelegate
ему больше не звонят.Я думаю, это потому, что текстовые поля больше не являются прямыми дочерними элементами MyView.Есть ли какие-то другие способы справиться с этим?
Обновить
Я сделал небольшую версию своего кода, возможно, это поможет найти проблему:
@interface MyView : UIView <UITextFieldDelegate>
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
// This is MySubview:
UIView *tempLabelsContainer = [[UIView alloc] initWithFrame:self.bounds];
[tempLabelsContainer setUserInteractionEnabled:YES];
[self addSubview:tempLabelsContainer];
self.labelsContainer = tempLabelsContainer;
[tempLabelsContainer release];
UITextField *aTextField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
[aTextField setBackgroundColor:[UIColor clearColor]];
[aTextField setText:@"Some text"];
[aTextField setTag:1];
[aTextField setDelegate:self];
[self.labelsContainer addSubview:aTextField];
[aTextField release];
// More labels are being added
}
return self;
}
#pragma mark - UITextFieldDelegate methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
// This is not being called
NSLog(@"TextField with the tag: %d should be edited", [textField tag]);
return NO;
}
Решение 2
Я отвечу на свой собственный вопрос на всякий случай, если у кого-то случится такая же проблема - хотя трудно представить, что кто-то совершает такую глупую ошибку:
Я устанавливал рамку контейнера labels в значение self.bounds.Но MyViewController создавал MyView с фреймом CGRectZero!Я внес это изменение для поддержки анимации одновременно с добавлением контейнера.Поэтому я подумал, что проблема связана с иерархией представлений.Как мне не стыдно!!!
В любом случае, спасибо всем помощникам, особенно Мадхумалу Гунетилике, который своим ответом заставил меня посмотреть в другом направлении.
Другие советы
Хорошо, тогда я попробовал написать ваш код, и у меня все получилось.Вот несколько пунктов, которые вы могли бы попробовать изменить;
- Причина, по которой вы не можете отредактировать свое текстовое поле, заключается в том, что вы возвращаете NO методу textFieldShouldBeginEditing .Измените это на "ДА".
- Попробуйте расположить (если возможно) свое текстовое поле немного ниже того, что вы указали.Кроме того, 20 пикселей в любом случае слишком малы для правильного текстового поля, сделайте его как минимум 40 пикселей.Текстовое поле размером 20 пикселей, расположенное на 0,0, может быть вообще скрыто, если строка состояния включена в телефоне.
- Установите стиль границы для вашего текстового поля.Насколько я знаю, это важно для того, чтобы текстовое поле отображалось и хорошо взаимодействовало.(например,Текстовое поле.BorderStyle = UITextBorderStyleRoundRect)
Скрестив пальцы!:)