Вызовите rootViewController для переключения представлений в представлении содержимого (iOS) - PullRequest
3 голосов
/ 13 февраля 2011

Я работаю над довольно простым многоцелевым приложением для iOS, и я следую великолепному учебнику в книге Apress .По сути, мой экземпляр rootViewController был создан и отображен вместе с делегатом приложения, и у меня есть несколько представлений содержимого viewControllers (6), которые я хотел бы менять на основе пользовательского ввода.Однако в книге они выполняют свои переключения с помощью кнопки на панели инструментов, помещенной в rootView, с помощью Interface Builder.Он запускает метод в rootView, который загружает новый контент ViewController и отображает его.

Моя проблема в том, что я хотел бы выполнить переключение представления контента (которое находится в моем экземпляре rootViewController), но я бы хотелнравится запускать действие переключения с помощью кнопки, которая находится в моем представлении содержимого (и поэтому недоступна, поскольку мой владелец файла - мой contentViewController, ссылка на который хранится в моем rootViewController).

Надеюсь, я объяснил это достаточно хорошоПожалуйста, дайте мне знать, если я должен уточнить подробнее.Я ценю любую помощь!

Ответы [ 2 ]

5 голосов
/ 13 февраля 2011

Вам необходимо передать ссылку на ваш корневой контроллер представления (RootViewController * rootViewController), когда вы создаете представление контента либо в пользовательском методе init, либо просто назначая его после того, как создали его: = я; .

Теперь в вашем представлении содержимого вы можете вызвать соответствующий метод в контроллере корневого представления для переключения: [self.rootViewController switchView] . Этот вызов затем может быть запущен внутри метода, который вызывается при нажатии кнопки (метод IBAction).

Так вот что вам нужно сделать: 1) Создайте свойство в вашем контроллере представления контента типа RootViewController

@class RootViewController;

@interface MyContentViewController : NSObject {
@private
    RootViewController *rootViewController;
}

@property (retain) RootViewController *rootViewController;

и убедитесь, что он сохраняет ссылку. 2) Синтезируйте свойство и добавьте обратный вызов в корневой контроллер представления, который переключает представление:

@implementation MyContentViewController

@synthesize rootViewController;

- (IBAction) switchView:(id) sender {
    [rootViewController switchToNextView];
}

-(void) dealloc {
    [rootViewController release];
    [super dealloc];
}

Также в конце отпустите сохраненную ссылку.

3) Назначьте контроллер корневого представления представлению содержимого внутри вашего RootViewController:

self.contentViewController = [[[MyContentViewController alloc]
                         initWithNibName:@"ContentView" 
                         bundle:nil] autorelease];
self.contentViewController.rootViewController = self;

Это должно быть все. Я надеюсь, что это поможет вам.

2 голосов
/ 13 февраля 2011

Ну, вы можете просто создать IBAction в каждом из ваших дочерних контроллеров, который вызывает:

 [self.parentViewController switchToDifferentController:(int) viewNumber]

, а затем реализуйте метод switchToDifferentController в своем корне. Помимо игнорирования предупреждения компилятора о том, что parentView может не реализовывать этот метод, он может работать.

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

Как правило, вы используете концепцию «делегировать» для дочернего контроллера, чтобы попросить его родителя что-то сделать. Общая идея заключается в том, что вы объявляете группу методов как «протокол». Думайте об этом как о договоре между объектами. Один объект может сказать «я обещаю реализовать эти методы», а другой может затем отправить эти сообщения ему. Контракт позволяет компилятору / системе проверять соответствие. Вы увидите это в UITableView, где ОС предоставляет стандартную таблицу, но она вызывает ваш код для предоставления отдельных ячеек по мере необходимости.

Чтобы реализовать протокол, вы должны сделать следующее: (См. Сегменты кода ниже

  1. Объявляет протокол для разговора
  2. Укажите, что родитель будет следовать этому протоколу
  3. Создайте свойство делегата в вашем ребенке
  4. Когда родитель собирается запустить дочерний элемент, он назначает себя делегатом для этого дочернего элемента.
  5. Когда ребенок хочет переключиться, он вызывает родителя по этому протоколу

@protocol myVCDelegate
    - (void)switchToDifferentController:(int) viewNumber ;
@end


@interface ParentViewController : UIViewController <VCDelegate>

@property(nonatomic, assign) id <VCDelegate> delegate

childController.delegate = self;

[self.delegate switchToDifferentController:kController5];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...