Определите экземпляры контроллера представления UITabBarItems надлежащим образом - PullRequest
0 голосов
/ 19 августа 2011

У меня есть приложение с панелью вкладок для открытия различных контроллеров представления, как это:

firstViewController = [[UITableViewController alloc] init];
UINavigationController *firstNavigationController = [[UINavigationController alloc] initWithRootViewController:firstViewController];
[firstNavigationController setTabBarItem:[[UITabBarItem alloc] initWithTitle:@"Add" image:[UIImage imageNamed:@"Add.png"] tag:1]];

[viewControllers addObject:firstNavigationController];

secondViewController = [[UITableViewController alloc] init];
UINavigationController *secondNavigationController = [[UINavigationController alloc] initWithRootViewController:secondViewController];
[secondNavigationController setTabBarItem:[[UITabBarItem alloc] initWithTitle:@"List" image:[UIImage imageNamed:@"List.png"] tag:2]];

[viewControllers addObject:secondNavigationController];

UITabBarController *tabBarController = [[UITabBarController alloc] init];

[tabBarController setViewControllers:viewControllers];

[[self window] setRootViewController:tabBarController];

Это нормально.Теперь у меня есть дополнительное требование для навигации, firstViewController может быть вызван из secondViewController, передавая ему данные.

Единственный найденный мной способ передачи данных в тот же экземпляр firstViewController, доступ к которому осуществляется с помощью вкладкиПанель выглядит следующим образом (во втором коде ViewViewController):

firstViewController = [[[[[self tabBarController] viewControllers] objectAtIndex:0] viewControllers] objectAtIndex:0];

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

Я также исследовал способ тегирования, но, похоже, не настолько улучшил код.

Есть ли другой, более чистый способ?

1 Ответ

0 голосов
/ 20 августа 2011

Я не могу утверждать, что знаю, чего вы пытаетесь достичь, отправляя данные из одного контроллера просмотра в другой, но если отправка данных является вашей единственной целью, я бы порекомендовал Singleton Pattern .Или я бы порекомендовал NSNotificationCenter .Одиночный файл может содержать данные всего приложения, которые могут быть получены из любого места.Вы даже можете (хотя это противоречит передовым методам) хранить ссылки на ваши контроллеры представления в одноэлементном классе.Я также активно использую уведомления для передачи данных.Просто отправьте уведомление и попросите его прослушать другой класс.

Например, в firstViewController в viewDidLoad вы можете сделать это:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(theMethodToCall:) name:@"myNotificationName" object:nil];

Затем в secondViewController, когда вы хотите передать данные, вы можетеопубликовать это (где «myData» является объектом данных (например, NSDictionary)):

[[NSNotificationCenter defaultCenter] postNotificationName:myNotificationName object:nil userInfo: myData];

Тогда в firstViewController этот метод будет получать данные.

-(void)theMethodToCall:(NSNotification *)notif
 {
      NSDictionary *dict = [notification userInfo];
 }

С этим кодом вы такжеполучить хорошую ссылку на объект

...