UILabel仅在放置在viewcontroller的viewDidAppear中时显示

时间:2011-10-26 04:38:41

标签: ios views uilabel

我无法弄清楚当我从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 ...

谢谢大家的帮助!

1 个答案:

答案 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,您将看到标签。