UILabel отображается только при помещении в viewDidAppear viewcontroller - PullRequest
0 голосов
/ 26 октября 2011

Я не могу понять, почему 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 ...

Спасибо всем за помощь!

1 Ответ

1 голос
/ 26 октября 2011

Стоит подумать, что showText оканчивается этими строками:

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

, а затем следующая строка:

[overlayViewController setView:overlayView];

Итак, каково значениеself.view быть в showText, если viewController даже устанавливает свой вид до следующей строки?Скорее всего, вы добавляете подпредставление к объекту nil.

Вообще говоря, вы должны делать вещи немного по-другому.Назначенный инициализатор для контроллера представления - initWithNibName:bundle, а не init, поэтому рекомендуется использовать его.

Что более важно, OverlayViewController должен либо загрузить свое представление из файла .xib, либо реализоватьloadView метод для создания своего представления.Если вы добавите метку внутри этого метода или в один из методов, вызванных после него, например viewDidLoad, вы увидите метку.

...