iOS: доступ к раскадровке TabBar ViewController из другого класса - PullRequest
2 голосов
/ 04 февраля 2012

У меня следующая проблема: я создал приложение iOS 5 SDK со Storyboard, которое содержит TabBar и три ViewControllers.Из другого класса (Receiver.m) я хочу получить доступ к метке пользовательского интерфейса, например, ThirdViewController.m, который является одним из ваших ViewControllers в TabBar.

В ThirdViewController.hi есть

@interface ThirdViewController : UIViewController {
}
@property (weak, nonatomic) IBOutlet UILabel *textlabel1;
@end

и в ThirdViewController.h:

@implementation ThirdViewController
@synthesize textlabel1;
...

Кажется, все в порядке, так как я могу установить свойства метки из экземпляра ThirdViewController.Теперь, чтобы получить доступ из Receiver.m я использую:

   UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:[NSBundle mainBundle]];
   ThirdViewController *myVC = [storyboard instantiateViewControllerWithIdentifier:@"ThirdViewController"];
   myVC.textlabel1.text = @"Hello"; 

Это не работает.Я не хочу создавать новый экземпляр ThirdViewController, но получить доступ к существующему, чтобы обновить только UILabel.Моя раскадровка в Навигаторе проекта по умолчанию называется MainStoryboard.storyboard.Я делаю что-то не так с получением экземпляра классов ThirdViewController?

Ошибка говорит:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 
'Storyboard (<UIStoryboard: 0x190590>) doesn't contain a view controller with 
identifier 'ThirdViewController''

Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Я некоторое время не обращал внимания на эту тему, но только для тех, кому интересно, как она работает, я пишу это, хотя я не буду использовать это в своем коде (спасибо комментариям от @jrturton выше)

// Bad style:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSArray *vcs = appDelegate.window.rootViewController.childViewControllers;   
YourFirstViewController *fvc  = [vcs objectAtIndex:0];
YourSecondViewController *svc = [vcs objectAtIndex:1];

Поэтому я отмечу ответ Джртертона как принятый.

2 голосов
/ 04 февраля 2012

Раскадровка не дает вам доступа к уже представленной версии контроллера представления - как вы обнаружили, используемый вами метод создает новый экземпляр.

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

0 голосов
/ 20 июня 2017

Ответ ZCDev у меня не сработал.Это сработало:

let tabBarViewController = UIApplication.shared.windows.first!.rootViewController as!   UITabBarController

Безопасный вариант:

if let tabBarViewController = UIApplication.shared.windows.first?.rootViewController as? UITabBarController {
    // access your tab bar controller here.
}

Swift 3, Xcode 8, iOS 10

...