2011-09-07 50 views
1

我有一个UIView(MyView)的子类有一些UITextField作为子视图。 MyView实现UITextFieldDelegate协议,以便在单击文本字段时收到通知。这很好。现在,我需要将文本框放在一个“容器”中,以便能够使用UIView动画淡入淡出此容器(及其所有子项)。所以我创建了一个UIView(MySubview),使其成为MyView的子视图,并将所有文本字段放入其中。动画效果很好,但UITextFieldDelegate不再被调用。我认为这是因为textfields不再是MyView的直接子代。 有没有其他方法可以解决这个问题?嵌套的UITextFields不被调用的UITextFieldDelegate

UPDATE

我做了一个小版本的我的代码,也许这有助于发现问题:

@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; 
} 
+0

你能编辑文本字段吗? – EmptyStack

+0

嗨桑德拉,我假设一切都与这写在相同的控制器?即MySubView不是一个单独的类,而只是在同一个控制器中的UITextFields及其委托方法被写入的变量。当然,我确定你会完成UITextFields上的委托任务。 – Madhu

+0

将代表写入单独的类文件中,并使用tat类名称代替在文本字段的委托属性中提供自我 – booleanBoy

回答

0

我会回答我的问题,以防万一有人恰巧有此相同的问题 - 很难想象有人做这样愚蠢的错误,但:

我的标签容器的框架设置自。界限。但MyViewController正在创建一个CGRectZero框架的MyView!我在添加容器的同时进行了更改以支持动画。所以我认为这个问题与视图层次有关。对我感到羞耻!

无论如何,感谢所有的帮手,特别是Madhumal Gunetileke,他的回答让我看到了不同的方向。

4

那好吧,我把一试写出你的代码,它的作品出来我。以下是您可以尝试更改的一些项目;

  • 您无法编辑textField的原因是因为您将no返回到textFieldShouldBeginEditing方法。将其更改为YES。
  • 试着定位(如果可能)你的textField比你给出的低一点。另外,无论如何,20px对于正确的textField来说太小了,至少要40px。如果手机中的状态栏已打开,则位于0,0的20px textField可能完全隐藏。
  • 为您的textField设置borderStyle。据我所知,这对textField显示和交互很好很重要。 (例如textField.borderStyle = UITextBorderStyleRoundRect)

手指交叉! :)

+0

非常感谢您的详细解答。我不明白为什么它适用于你,而不是我:(我尝试#1,虽然我不想编辑文本,但只知道用户触摸它,但我没有工作,然后我尝试#2(只有身高),我的真实代码的x和y位置不同于我发布的代码,它没有工作,最后我尝试了#3没有成功,奇怪的是我的代码是我在添加容器之前工作并改变了视图层次结构,所以我确信它必须这样做,我会建立一个虚拟的继续测试并重新发布。 – strave