UITextField在添加为子视图时未显示

时间:2010-08-30 20:11:47

标签: iphone objective-c uikit ios

我正在制作一个OpenGL ES应用程序,我正在尝试研究如何在视图上将UIKit GUI的一部分合并到OpenGL ES上。

EAGLView类的init方法中,我设置了UITextField

add_name_field = [[UITextField alloc] initWithFrame: CGRectMake(10, 10, [UIScreen mainScreen].bounds.size.width, 50)];

drawRect方法中的某个地方,我为游戏渲染和处理了所有内容:

[add_name_field becomeFirstResponder];
[self insertSubview: add_name_field atIndex:0];

我可以确认调用此代码是因为我使用NSLog来测试它,但是当它运行时,文本字段不显示在游戏的OpenGL视图中。如果我将代码放在init方法中,则文本字段会在游戏开始时用键盘正确显示。

那么如何让它在drawRect方法中运行?

谢谢你的回答。在此期间,我将为代表编写一些代码。

4 个答案:

答案 0 :(得分:2)

感谢所有其他答案,但我找到了解决方案。

这是一个简单的解决方案。我只是将addSubView方法移动到EAGLView类的初始化。键盘不会显示,直到我将文本字段作为第一响应者。当我完成它之后,我可以简单地清除文本并使EAGLView类再次成为第一个响应者并再次隐藏它。

这样我就可以简单地使用键盘为我的游戏输入文字,在输入时显示文字并在之后隐藏它。

答案 1 :(得分:1)

我假设你在UIViewController子类中,上面的代码?如果是,那么而不是

[self insertSubview: add_name_field atIndex:0];

做的:

[self.view addSubview:add_name_field];

重要的是,您在self.view而不是self上调用此方法。添加子视图是VIEW功能,而不是View CONTROLLER功能。

insertSubview:atIndex:也应该工作(如果在正确的对象上调用),但addSubview:会将它贴在视图的顶部,无论其他什么,所以它有点清洁。

答案 2 :(得分:1)

在drawRect之外添加文本子视图。 drawRect用于渲染一个视图,可能会或可能不会忽略绘制任何其他视图(例如文本视图),具体取决于视图堆栈的呈现方式。

答案 3 :(得分:0)

有没有理由在drawRect方法中完成它?你说它在init方法中工作正常,那么为什么不在那里呢?

至于为什么它不起作用,我并不完全了解OpenGL视图,但是,假设它们像普通的UIViews一样工作,你可能不应该在drawRect函数中添加其他UIViews。 UIViews没有得到展示&立即绘制;他们必须等到跑道告诉他们画画。可能会发生的事情是,当你的superview的drawRect完成时,它假定它的所有子视图都已完成绘图,并没有意识到你新添加的文本字段没有机会。您可以尝试在文本字段上调用setNeedsDisplay。

相关问题