gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:56:19 25 4
gpt4 key购买 nike

我不明白为什么 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com