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

标签 ios view uilabel

我不明白为什么 UILabel 仅在我从 viewController 中的 viewDidAppear 创建它时才显示。到目前为止,这是我的代码:

在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 放置在 overrideViewController 的 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 中,我直接获得了应用程序委托(delegate)和 Controller :

ImageTargetsAppDelegate *delegate = (ImageTargetsAppDelegate *)[UIApplication sharedApplication].delegate;
OverlayViewController *controller = delegate.overlayViewController;

[controller showText];

但是两种方式仍然没有显示任何UILabel...

已回答:

我想通了。事实证明,按照示例应用程序的编写方式,UIKit 的更新并未在主线程上调用。因此,我在调用 showText 时使用了 PerformSelectorOnMainThread...

感谢大家的帮助!

最佳答案

需要考虑的一件事是 showText 以这些行结尾:

[self.view addSubview:textLabel];
[self.view bringSubviewToFront:textLabel];

然后下一行是:

[overlayViewController setView:overlayView];

那么,如果 viewController 甚至将其 View 设置到下一行,那么 showTextself.view 的值会是多少?您可能会向 nil 对象添加 subview 。

一般来说,您应该采取一些不同的做法。 View Controller 的指定初始化程序是 initWithNibName:bundle 而不是 init,因此建议您使用它。

更重要的是,OverlayViewController 应该从 .xib 文件加载其 View ,或者实现 loadView 方法来创建其 View 。如果您在该方法内部或在该方法之后调用的方法之一(例如 viewDidLoad)中添加标签,您将看到该标签。

关于ios - UILabel 仅在放置在 viewcontroller 的 viewDidAppear 中时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7898772/

相关文章:

MySQL View : polymorphic associations and child tables

ios - 以编程方式添加 UILabel 不可见

objective-c - 将数据永久保存在 iOS 设备上

objective-c - objc_setAssociatedObject 在 iOS 中不可用吗?

ios - 制作自定义 View 并初始化它时的边界与框架

iphone - objective-c - 文本缩进

ios - 如何根据其结果更改文本标签的颜色?

html - 防止单词在 iOS 电子邮件客户端中中断/换行

objective-c - 消除 NSString 中垃圾值的出现?

php - 将chunk中的记录插入到mysql View 中