2015-04-08 1 views
1

Я пытаюсь создать представление контейнера, где контроллеры представлений контейнера могут манипулировать кнопками/метками на контроллере корневого представления.Создание делегатов для моего контейнера View

По существу, я пытаюсь создать настраиваемую панель навигации в верхней части моего контроллера представления, где навигация контейнера определяет название кнопки «Назад». Кнопки «назад» могут вызывать «Просмотр контроллеров» в моем представлении контейнера.

Я смущен относительно того, как я настроил делегатов.

Контроллеры просмотра для моего контейнера должны иметь возможность прослушивать, когда пользовательская кнопка возврата нажата. И я также пытаюсь установить заголовок кнопки «Назад», в зависимости от того, какой диспетчер представлений отображается в моем представлении контейнера. Спасибо за любой совет.

Моя иерархия выглядит следующим образом.

      Root View Controller -- Custom Navigation Buttons 
            | 
          Container View 
            | 
          Navigation Controller 
            | 
         Custom View Controller 
            | 
         Custom View Controller 
+2

Это звучит, как вы, возможно, легче с NSNotificationCenter. Кажется, вам нужно больше, чем один объект, чтобы знать о вашем пользовательском состоянии viewController. NSNotifications также с удовольствием работают по сравнению с написанием отдельных делегатов вплоть до Root VC. Вот об этом [Статья NSHipster] (http://nshipster.com/nsnotification-and-nsnotificationcenter/). – Dare

ответ

3

enter image description here

UPDATE

Я сделал учебник для этого: Custom Navigation. В видео я использую UISegmentedController, однако используется тот же метод.


Постараюсь и шаг за шагом, как это сделать.

Создайте класс NSObject и назовите его ButtonHandler.

Создать такие методы, как

//create as many as needed 
-(IBAction)handleButton1:(id)sender 
{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"notifyButtonPressed1" object:self]; 
} 

Перетащите NSObject на свой корневой View Controller и установить его класс ButtonHandler

Control + перетаскивание из ваших кнопок в пользовательском нав на объект и выбрать, какой метод они должны использовать.

В вашем viewDidLoad метод вашего Root View, добавьте это:

//Notify the Root View when the button has been pressed 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeView1:) name:@"notifyButtonPressed1" object:nil]; 

Добавить как многие из них со своими селекторов, чтобы изменить точку зрения.

Поместите этот код в нижней части Root View Class

-(void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

NSNotificationCenter прослушивает уведомления в приложении для выполнения действий. Они действительно удобны и могут сэкономить много кодировок, однако они не подходят для каждого случая перехода.

Добавить @property (nonatomic, weak) UIViewController * content в корневой Посмотреть .h файл и в файле .m добавить этот метод под вашим viewDidLoad

//SET THE NEW CONTENT INSIDE THE ROOT VIEW 
-(void)setContent:(UIViewController *)content 
{ 
    //CHECK FOR EXISTING CONTENT 
    if(_content) 
    { 
     //IF CONTENT EXISTS, REMOVE IT 
     [_content.view removeFromSuperview]; 
     [_content removeFromParentViewController]; 
    } 

    //NOW ADD THE NEW CONTENT AND DISPLAY 
    _content = content; 
    [self addChildViewController:_content]; 
    [_content didMoveToParentViewController:self]; 
    [self.view addSubview:_content.view]; 

} 

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

Это мой метод отображения:

-(void)changeView1: (id) sender 
{ 
    //create access to the next view 
    NSString * storyboardName = @"Main"; 
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil]; 
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"View1"]; 

    NSLog(@"Button 1 pressed"); 

    //set the _content of the declared UIViewController to be the assigned view 
    self.content = vc; 

    //THIS SETS THE SIZE AND POSITION OF THE NEW CONTENT 
    self.content.view.frame = CGRectMake(10, 65, 300, 300); 

} 
+0

Кстати, с этим методом вам не нужно встраивать –

+0

Спасибо за ответ. Дело в том, что я хочу, чтобы моя навигация была анимирована и в том же потоке, что и навигационный контроллер. Могло ли это это сделать? – Andy

+1

@ Andy Да, конечно, вы можете анимировать переход с помощью '//self.content.view.frame = CGRectMake (10, 65, 300, 300); [UIView animateWithDuration: 1.3 анимации:^{ self.content.view.frame = CGRectMake (10, 65, 300, 300) ;; }]; ' –

Смежные вопросы