Доступ к контроллеру представления, создаваемому с помощью раскадровки, с помощью приложения-делегата
Я работаю над приложением iOS5 с помощью раскадровки, и у меня есть метод в классе контроллера вида, с которым я хотел бы получить доступ из App Delegate. Проблема в том, что этот контроллер представления получает экземпляр через контроллер панели вкладок в раскадровке, поэтому у делегата приложения нет прямого способа вызова метода, который я хочу...
Чтобы диспетчер представлений мог связаться с делегатом приложения, все, что вам нужно сделать, это использовать:
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
Есть ли простой способ указывать на уже созданный контроллер или класс представления?
Ответы
Ответ 1
Вам нужно будет пересечь иерархию представлений из делегата приложения. Предполагая, что AppDelegate
содержит ссылку на UITabBarController
, вы можете использовать свойство viewControllers
или свойство selectedViewController
для доступа к вашему контроллеру вида.
Ответ 2
Благодаря Джерри (выше), вот код, который получил меня, что я хотел:
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
MasterViewController *result;
//check to see if navbar "get" worked
if (navigationController.viewControllers)
//look for the nav controller in tab bar views
for (UINavigationController *view in navigationController.viewControllers) {
//when found, do the same thing to find the MasterViewController under the nav controller
if ([view isKindOfClass:[UINavigationController class]])
for (UIViewController *view2 in view.viewControllers)
if ([view2 isKindOfClass:[MasterViewController class]])
result = (MasterViewController *) view2;
}
Ответ 3
Я, вероятно, сделаю это наоборот. Создайте метод в AppDelegate вызовите registerViewController или что-то в этом роде. В каждом ViewController вызовите метод с самим собой с именем. Затем в AppDelegate вы можете делать все, что захотите. Это грязно, чтобы делать все виды сверла
В AppDelegate
- (void)registerViewController:(NSString *)name controller:(UIViewController *)controller
{
if(_viewControllers == nil)
{
_viewControllers = [[NSMutableDictionary alloc] init];
}
[_viewControllers setObject:controller forKey:name];
}
В любом ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate registerViewController:@"feelings" controller:self];
}
В AppDelegate
XViewController *vc = (XViewController *)[_viewControllers objectForKey:@"X"];
[X startSpinner];
Надеемся на эту помощь
БС
Ответ 4
Если вы используете раскадровку и хотите использовать экземпляр viewController в раскадровке, вы можете использовать следующие
UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
id viewcontroller = [mystoryboard instantiateViewControllerWithIdentifier:@"identifier"];
Здесь "идентификатор" - это имя, указанное в конкретном идентификаторе storyBoard идентификатора viewController в разделе "Identity" в "Identity Inspector".
Ответ 5
У меня лучшее решение. Вы можете использовать window.rootViewController.storyboard
, чтобы получить ссылку на раскадровку этого вида.
Ответ 6
В AppDelegate вы можете просто использовать индексы для доступа к контроллерам через UITabBarController:
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
firstViewController = [[tabBarController viewControllers] objectAtIndex:0];
secondViewController = [[tabBarController viewControllers] objectAtIndex:1];
thirdViewController = [[tabBarController viewControllers] objectAtIndex:2];
Естественно, это изменится, если вы измените порядок на панели вкладок. Кроме того, если вы ищете контроллер глубже в иерархии, вам нужно сделать немного больше работы.
Ответ 7
Swift
Это версия Swift версии @infiniteLoop.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myViewController = storyboard.instantiateViewControllerWithIdentifier("identifier") as! MyViewController
Вам нужно заменить имя раскадровки, просмотреть имя контроллера и идентификатор контроллера просмотра, используя все, что вы использовали в своем проекте.
Связанные задачи