2012-02-04 3 views
2

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

В ThirdViewController.h я получил

@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. Моя раскадровка в Project Navigator по умолчанию называется MainStoryboard.storyboard. Я делаю что-то не так с получением экземпляра классов ThirdViewController?

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

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

Спасибо!

ответ

2

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

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

+0

Ok, это то, что я боялся. Так есть ли другой способ (я нашел что-то вроде AppDelegate.window.ThirdViewController, который тоже не работает), чтобы каким-то образом получить экземпляр ThirdViewController над иерархией ViewController? Спасибо за вашу рекомендацию, я знаю, что это не хороший стиль, код будет меняться, но поскольку логика приложения отсутствует, я пытаюсь получить доступ к ViewController прямо таким образом. – ZCDev

+0

Вам нужно будет получить контроллер панели вкладок (контроллер корневого представления делегата приложения.window), затем получите свой третий контроллер представлений из массива viewcontrollers контроллера панели вкладок. – jrturton

+0

'AppDelegate.window.UINavigationController.ThirdViewController' меня не достает. Кто-нибудь сделал это раньше и готов поделиться некоторыми фрагментами кода? Я был бы признателен, что. В противном случае мне придется изменить часть структуры кода. – ZCDev

3

Я не обращал внимания на эту тему какое-то время, но только для тех, кто интересуется, как это работает. Я публикую это, хотя я не буду использовать это в своем коде (спасибо за комментарии от @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]; 

Таким образом, я отвечу на ответ jrturton как принятый.

0

ZCDev's ответ не работает для меня. Это сработало:

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

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