Обмен данными между несвязанными (табличными) viewcontrollers? - PullRequest
3 голосов
/ 09 января 2012

У меня есть приложение с TabBar, под главной панелью вкладок находятся контроллеры навигации, под ними есть «ветви» tableviewcontollers.

Как я могу сделать два несвязанных, не связанных с segue, под двумя разными значками вкладок viewcontrollers обмениваться информацией между ними?

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

есть идеи?

* * 1008 практична: приложение показывает список подэлементов (у родительского табличного представления есть элементы), и на другой вкладке добавляются последние выбранные элементы (но maxiumum 10 и отсортированы по самым последним) .. ломает мои * * на это ...

спасибо

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Я считаю NSNotification не лучшим способом сделать это, так как вы соединяете несвязанные TableViewControllers. Я думаю, что поток информации в приложении имеет решающее значение.

Решение, которое я бы лично одобрил, - это наличие центрального класса, который управляет глобальными данными для вашего приложения. Это может быть класс AppDelegate или произвольный класс менеджера, который управляет потоком данных и «вытягивает строки» и является посредником между различными независимыми ViewControllers.

Пример:
Используя этот код, вы можете получить ваш UITabBarController и установить свой класс в качестве делегата ваших ViewControllers и т. Д.: * 10101 *

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    UITabBarController *rootTabBarController = (UITabBarController *)self.window.rootViewController;

    MyFirstTableViewController *firstVC = [rootTabBarController.viewControllers objectAtIndex:0];
   firstVC.delegate = self; // Get informed about events in the first ViewController

    MySecondTableViewController *secondVC = [rootTabBarController.viewControllers lastObject]; // Assuming you only have two Tabs

    // Once you have the rootTabBarController you can cast it to the corresponding ViewController and access any nested UIViewControllers

    return YES;
}

#pragma mark - MyFirstTableViewControllerDelegate
-(void)firstTableViewController:(MyFirstTableViewController *)sender didSomethingFancy:(MyFancyObject *)fancy{
    // Do stuff like fetching some data, based on the event from the first ViewController
    // Maybe tell the secondVC to refresh its data etc. etc.
}
1 голос
/ 09 января 2012

Вы можете использовать @property и @synthesize для создания методов получения и установки по умолчанию.Вы также можете создавать свои собственные методы получения и установки вручную.

1 голос
/ 09 января 2012

Рассматривали ли вы публикацию NSNotification с передачей данных, которые вы хотите передать, в userInfo?

Из документации Apple :

Объект, отправляющий (или отправляющий) уведомление, не должен знать, что это за наблюдатели.Таким образом, уведомление является мощным механизмом достижения координации и сплоченности в программе.Это уменьшает потребность в сильных зависимостях между объектами в программе (такие зависимости уменьшают возможность повторного использования этих объектов).

Класс, отправляющий уведомление, делает это следующим образом:

[[NSNotificationCenter defaultCenter] postNotificationName: <notification-name> 
                                                    object: self
                                                  userInfo: <your-user-info>]; 

и класс прослушивания уведомлений регистрируется для уведомлений с использованием:

[[NSNotificationCenter defaultCenter] addObserver: self 
                                         selector: @selector(someMethod:) 
                                             name: <notification-name> 
                                           object: nil];

и имеет метод:

- (void) someMethod: (NSNotification *) notification
{
    NSDictionary * myInfo = notification.userInfo;

    //do something with myInfo
}
...