Я не могу понять, почему UILabel появляется только когда я создаю его из viewDidAppear в моем viewController. Вот мой код:
В 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, когда она помещается в viewDidLoad в overlayViewController, отображается в тот момент, когда приложение запускается над видеопотоком с камеры. При помещении внутрь функции 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 ...
ОТВЕТИЛ:
Я понял это. Оказывается, при написании примера приложения обновления для UIKit не вызывались в главном потоке. Поэтому я использовал executeSelectorOnMainThread при вызове моего showText ...
Спасибо всем за помощь!