我不明白为什么 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 设置到下一行,那么 showText
中 self.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/