Как выполнить [self.view addSubview: lbl] вне области видимости класса ViewController? - PullRequest
3 голосов
/ 23 июля 2011

Как выполнить [self.view addSubview: lbl] вне области видимости класса ViewController?

или:

Как добавить метку или другое представление в основное представление вне пределовкласс ViewController, в другом классе?

спасибо

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    [lbl setText:@"hi there"];

    [self.view addSubview:lbl];// <-- this works, but ...
        // what is "self" referring to? 
        // and how can I declare and call from another class? 

    ...


    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    [lbl setText:@"hi there"];

    calcRomanAppDelegate *v = [[calcRomanAppDelegate new] init]; 
    [v.viewController.view addSubview:lbl]; // this compiles, but...
         // fails to shows a label on the form

     ...


    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
    [lbl setText:@"hi there"];

    calcRomanViewController *v = [[calcRomanViewController new] init];
    [v.view addSubview:lbl]; // this just makes a call back to viewDidLoad... endless loop

}

Ответы [ 3 ]

3 голосов
/ 23 июля 2011

Ну, view - это просто свойство класса UIViewController. Предполагая, что у вас есть переменная UIViewController *controller, вы можете просто использовать

[controller.view addSubview:subview]
1 голос
/ 23 июля 2011

Причина, по которой [v.viewController.view addSubview:lbl]; не работает, заключается в том, что v является новым экземпляром calcRomanAppDelegate. Каждое приложение имеет общий экземпляр делегата приложения, к которому можно получить доступ через [[NSApplication sharedApplication] delegate]. Следовательно, ваш код станет:

calcRomanAppDelegate *v = (calcRomanAppDelegate *)[[NSApplication sharedApplication] delegate]; 
[v.viewController.view addSubview:lbl]; // this compiles but shows a blank form

Также в написанном вами коде я укажу, что новый метод возвращает инициализированный объект, поэтому вам не требуется дополнительный вызов init в [[calcRomanAppDelegate new] init]. Вместо использования метода new я предлагаю использовать alloc, который не вызывает инициализатор. Очевидно, что это не проблема в данном конкретном случае, но это важно знать.

0 голосов
/ 23 июля 2011

Не уверен, что вы пытались достичь.

Но давайте представим, что вы находитесь в view1 и хотите создать другое представление (view2) с вашей UILabel lbl, добавленной в это представление2.Вот что вы должны сделать:

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(x, y, w, h)]; //x,y, w h are for your view2
[view addSubview:lbl];

[self.view addSubview:view2];  //self is your current viewcontroller - you add view2 on top of view1

С другой стороны, если у вас уже есть класс ViewController ViewController2.h, ViewController2.m и ViewController2.xib.Вот что вы сделаете:

ViewController2 *viewController2 =  [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];
[viewController2.view addSubview:lbl];

[self.view addSubview:viewController2.view];  //same as before, you need to add viewController2's view to the current view

Надеюсь, эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...