Вопрос

У меня есть подкласс 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)

Скрестив пальцы!:)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top