Работа с видами и некоторыми другими вещами - PullRequest
0 голосов
/ 29 января 2012

Я занимаюсь разработкой iOS. Сейчас играю с видами. В данный момент я не использую конструктор интерфейсов, потому что предпочитаю понимать, как все вещи работают под капотом. Вот почему я создаю элементы пользовательского интерфейса Views и т. Д. Программно. Тем не мение. Вот как выглядит мой проект.

У меня есть класс с именем RootViewController. Я использую этот класс в качестве окна rootViewController. Внутри этого класса у меня есть логика, которая загружает / выгружает представления. Вот некоторый код.

RootViewController.m

-(void)loadView
{
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
    self.view = view;
    self.view.backgroundColor = [UIColor lightGrayColor];

    // create FirstViewController button
    UIButton *firstViewButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
             firstViewButton.frame = CGRectMake(20, 60, 280, 50);
             firstViewButton.tag = 1;
             [firstViewButton setTitle:@"Load First view" forState:UIControlStateNormal];
             [firstViewButton addTarget:self 
                   action:@selector(loadViewControlllers:) 
             forControlEvents:UIControlEventTouchUpInside];

    // crate SecondViewController button
    UIButton *secondViewButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
             secondViewButton.frame = CGRectMake(20, 140, 280, 50);
             secondViewButton.tag = 2;
             [secondViewButton setTitle:@"Load Second view" forState:UIControlStateNormal];
             [secondViewButton addTarget:self 
                        action:@selector(loadViewControlllers:) 
              forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:firstViewButton];
    [self.view addSubview:secondViewButton];
    [self.view release];
}

-(void)loadViewControlllers:(UIButton *)sender
{
    if ([sender tag] == 1) {
        if(firstViewController == nil) {
            firstViewController = [[FirstViewController alloc]
                                   initWithNibName:@"FirstViewController" 
                                   bundle:nil];
            [self.view addSubview:firstViewController.view];
        }  
    } else {
        if(secondViewController == nil) {
            secondViewController = [[SecondViewController alloc]
                                    initWithNibName:@"SecondViewController" 
                                   bundle:nil];
            [self.view addSubview:secondViewController.view];
        }
    }
}

Первый и второй контроллеры представления содержат одинаковый код

-(void)loadView
{
    UIView *view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];   
     self.view = view;

    self.view.backgroundColor = [UIColor redColor];

    UIButton *remove = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    remove.frame = CGRectMake(20, 60, 280, 50);
    [remove setTitle:@"Remove First view from superview" forState:UIControlStateNormal];
    [remove addTarget:self 
               action:@selector(removeFromView:) 
     forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:remove];
    [self.view release];
}

-(IBAction)removeFromView:(id)sender
{
    [self.view removeFromSuperview];
}

Пока все хорошо. Здесь начинаются мои вопросы.

1) Это правильный подход к отображению / удалению просмотров. Один контроллер (rootViewController в моем случае), чтобы управлять ими всеми?

2) Не могли бы вы предложить мне способ передачи данных между первым, вторым и корневым представлениями? Допустим, загружен первый ViewController. Этот контроллер содержит текстовое поле и кнопку. Я хочу, чтобы пользователь вводил что-то в текстовое поле и нажимал кнопку, чтобы данные в этом текстовом поле были доступны для чтения rootViewController и secondViewController

3) Приложения работают хорошо. Нет сбоев и т. Д. Проблема в том, что когда ни один из первого или второго контроллера не вызывается, они не могут быть загружены снова. Когда я нажимаю кнопку, ничего не происходит.

Последнее, но не извиняюсь за мой язык.

1 Ответ

0 голосов
/ 29 января 2012

1) Это правильный подход для показа / удаления просмотров.Один контроллер (rootViewController в моем случае), чтобы управлять ими всеми?

Все нормально.Однако, если firstViewController и secondViewController совместно используют одну и ту же логику, тогда они на самом деле являются одним классом, и, как правило, безопасно удалить избыточность.

2) Не могли бы вы предложить мне способпередать данные между первым, вторым и корневым представлениями?Допустим, загружен первый ViewController.Этот контроллер содержит текстовое поле и кнопку.Я хочу, чтобы пользователь вводил что-то в текстовое поле и нажимал кнопку, чтобы данные в этом текстовом поле могли быть прочитаны rootViewController и secondViewController

Вы можете использовать экземпляр-одиночку для хранения общегосостояние (модель в шаблоне MVC), но это не рекомендуется.ИМХО, вы можете использовать модель Observer с шаблоном наблюдения значения ключа.См. Руководство Apple здесь .Или вы можете опубликовать NSNotification (s) с одного контроллера, чтобы уведомить любые другие контроллеры, которые заинтересованы в этом типе уведомлений.См. [Руководства здесь]. 2

3) Приложения работают хорошо.Нет сбоев и т. Д. Проблема в том, что когда ни один из первого или второго контроллера не вызывается, они не могут быть загружены снова.Когда я нажимаю кнопку, ничего не происходит.

В приведенном выше коде подпредставления были добавлены только тогда, когда контроллеры ivars были равны нулю.Попробуйте исправить эту логику.

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