2013-09-10 5 views
3

Вот моя проблема:Как отправить данные в RootViewController

У меня есть простое приложение с UIViewController встроенного в NavigationController. Это также RootViewController приложения. Оттуда у меня есть нажимной сегмент до нормального UIViewController и второй нажимной сегмент до UITableViewController с его собственным UIViewController для детального просмотра.

В корневом представлении есть экземпляр класса, целью которого является отправка сообщения с помощью протокола определения. В представлении таблицы пользователь выберет тип сообщения, которое он хочет отправить, и подробно просмотрите содержимое этого сообщения.

Теперь пользователь указал все, и я хочу, чтобы он нажал кнопку «отправить». Эта кнопка должна делать две вещи: вернуться к корневому представлению и отправить определенное пользователем сообщение экземпляром класса протокола. я могу сделать поп назад просто отлично с:

[self.navigationController popToRootViewControllerAnimated:true]; 

, но я понятия не имею, как отправить сообщение (экземпляр класса) обратно к просмотру корневого каталога. Приложение все еще свежо, поэтому я могу полностью изменить структуру, если это неверно.

Лучшим для меня было бы получить доступ к экземпляру класса протокола извне (я буду нуждаться в нем в другом UIViewController), но я не уверен, как это сделать, поэтому я подумал о том, чтобы отправить сообщение обратно в корень Посмотреть.

Если вы знаете, как сделать одно из двух выше, пожалуйста, дайте мне руку!

Cheers.

EDIT: Технически NavigationController является начальным ViewController, поэтому я не уверен, кто является RootViewController.

+0

может это поможет вам http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers – vamsi575kg

+0

@Gup Спасибо, я смотрю на него прямо сейчас. –

ответ

4

Первое: Вы можете сделать следующее: (работает только, когда ваш взгляд был добавлен к окну)

[self.view.window.rootviewcontroller doSomething]; 

Второй вариант заключается в определении собственности на вашем AppDelegate:

@property (nonatomic, strong) UIViewController *root; 

И позвоните по адресу:

AppDelegate *appDelegate= (YourAppDelegateClass *) [[UIApplication sharedApplication] delegate]; 

[appDelegate.root doSomething]; 
+0

Я согласен с небольшим завихрением ... Я держу класс делегата в классе чистым и сосредоточен на своих обязанностях 'UIApplicationDelegate'. Поэтому вместо добавления этого свойства «root» я создаю объект singleton 'XXNavigator' (подкласс NSObject) для такой информации, связанной с навигацией. Этот объект - это то место, где я делаю такие вещи, как отслеживание истории использования пользователя (подобно истории веб-браузера) и реагирование на целевые действия с помощью дополнительных кнопок панели инструментов навигационного контроллера. Вы можете подклассифицировать UINavigationController для такого свойства, но Apple рекомендует против этого до iOS 6 - и это делает просто грязью воды. –

1

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

1

Вы можете попробовать:

UIApplication *myApp = [UIApplication sharedApplication]; 
UIWindow *frontWindow = [myApp.windows lastObject]; 
UIViewController *myRootViewController = frontWindow.rootViewController; 
1

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

зрения корень путем добавления наблюдателя к нему.

+0

Можете ли вы привести пример для этого? – Anuj

1

один способ заключается в использовании протокола и другой способ передать свой вид корневой экземпляр контроллера для вашего tableviewcontroller (с помощью зрения контроллера), используя свой собственный метод инициализации, как:

UIViewController.м

- (id)initWithRoot:(id)rootInstance 
     withNibNameOrNil:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) 
    { 
     self.root = (RootView *)rootInstance; 
    } 

} 

RootViewController.m

viewcontrollerInstance = [[viewcontroller alloc] initWithRoot:self      withNibNameOrNil:@"viewcontroller" 
bundle:[NSBundle mainBundle]]; 

[self.navigationController pushViewController:viewcontrollerInstance animated:YES]; 

UITableViewController.m

- (id)initWithRoot:(id)rootInstance 
     withNibNameOrNil:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) 
    { 
     self.root = (RootView *)rootInstance; 
    } 

} 

ViewController.m

tableViewInstance = [[tablecontroller alloc] initWithRoot:self      withNibNameOrNil:@"tablecontroller" 
bundle:[NSBundle mainBundle]]; 

[self.navigationController pushViewController:tableViewInstance animated:YES]; 

UITableViewController.m

теперь контроллер представления таблицы использовать корневой экземпляр (родом из вида контроллера), чтобы вызвать функцию просмотра корневого контроллера, как:

[self.root displayMessage:message]; 

извините за опечатку , надеюсь, это поможет.

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