我无法弄清楚当我从viewController中的viewDidAppear创建UILabel时,为什么只显示UILabel。到目前为止,这是我的代码:
在AppDelegate中:
CGRect viewBounds;
viewBounds.origin.x = 0;
viewBounds.origin.y = 0;
viewBounds.size.width = screenBounds.size.height;
viewBounds.size.height = screenBounds.size.width;
view = [[EAGLView alloc] initWithFrame: viewBounds];
overlayView = [[OverlayView alloc] initWithFrame: screenBounds];
overlayViewController = [[OverlayViewController alloc] init];
[overlayViewController setView:overlayView];
[window addSubview:view];
[window addSubview: overlayViewController.view];
[window makeKeyAndVisible];
[view start];
在overlayViewController中:(此功能已成功调用,但UILabel未显示)
-(void)showText
{
NSLog(@"showText()");
textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 300.0f)];
textLabel.textColor = [UIColor whiteColor];
textLabel.backgroundColor = [UIColor clearColor];
textLabel.textAlignment = UITextAlignmentCenter;
textLabel.font = [UIFont fontWithName:@"Arial" size:30];
textLabel.text = [NSString stringWithFormat:@"TESTING!"];
[self.view addSubview:textLabel];
[self.view bringSubviewToFront:textLabel];
}
在overlayViewController中:(将上面的代码放入viewDidAppear使其从头开始显示)
-(void)viewDidAppear:(BOOL)animated
{
textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 300.0f)];
textLabel.textColor = [UIColor whiteColor];
textLabel.backgroundColor = [UIColor clearColor];
textLabel.textAlignment = UITextAlignmentCenter;
textLabel.font = [UIFont fontWithName:@"Arial" size:30];
textLabel.text = [NSString stringWithFormat:@"TESTING!"];
[self.view addSubview:textLabel];
[self.view bringSubviewToFront:textLabel];
[super viewDidAppear:animated];
}
为什么UILabel在调用时不会从showText()函数中显示出来?我验证了NSLog输出到控制台,但UILabel不在屏幕上。
为了提供更多上下文,这是一个AR应用程序。有一个EAGLView显示屏幕上的摄像头。正如我所说,UILabel放置在overlayViewController的viewDidLoad中时,会显示应用程序在摄像机视频源上方启动的时刻。放置在showText函数内部时,UILabel不会显示。
任何帮助将不胜感激!谢谢!
PS。为了提供更多信息,我尝试以两种方式调用showText():
在我的EAGLView.mm(处理大多数AR功能的地方)中,我设置了一个通知:
[[NSNotificationCenter defaultCenter] postNotificationName:@"showTextOverlay" object:nil];
然后,在OverlayViewController.m中,我在ViewDidAppear中放置了一个观察者(因为ViewDidLoad似乎没有被调用,但是ViewDidAppear会......)
-(void)viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear");
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(showText)
name:@"showTextOverlay"
object:nil];
[super viewDidAppear:animated];
}
此观察者的选择器调用showText(),它也在OverlayViewController中。
我接下来尝试了第二种方式:
在EAGLView.mm中,我直接获得了应用程序委托和控制器:
ImageTargetsAppDelegate *delegate = (ImageTargetsAppDelegate *)[UIApplication sharedApplication].delegate;
OverlayViewController *controller = delegate.overlayViewController;
[controller showText];
但两种方式仍然没有显示任何UILabel ...
ANSWERED:
我想出来了。事实证明,编写示例应用程序的方式是,未在主线程上调用UIKit的更新。因此,我在调用showText时使用了performSelectorOnMainThread ...
谢谢大家的帮助!
答案 0 :(得分:1)
要考虑的一件事是showText
以这些行结束:
[self.view addSubview:textLabel];
[self.view bringSubviewToFront:textLabel];
然后下一行是:
[overlayViewController setView:overlayView];
那么,如果viewController甚至将视图设置到下一行,那么self.view
的值是showText
会是什么?您可能会在nil
对象中添加子视图。
一般来说,你应该做的事情有点不同。视图控制器的指定初始值设定项为initWithNibName:bundle
,而不是init
,因此建议您使用它。
更重要的是,OverlayViewController
应该从.xib文件加载其视图,或者实现loadView
方法来创建其视图。如果您在该方法内或在其后调用的方法之一中添加标签,例如viewDidLoad
,您将看到标签。