Не удается изменить пользовательский интерфейс из AppDelegate при создании экземпляра UIViewController из раскадровки - PullRequest
1 голос
/ 20 февраля 2012

Мне нужно установить некоторые элементы интерфейса UIViewController из AppDelegate.Я использую раскадровку, поэтому UIViewController не инициализируется в AppDelegate.

Я пытаюсь получить экземпляр UIViewController с помощью:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
TableViewController* myTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"myTableViewController"]; 

Но когда я пытаюсь установить некоторый элемент пользовательского интерфейсакак UIBarButtonItem UINavigationBar, как здесь:

UIBarButtonItem* refreshButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshEntry)];
    myTableViewController.navigationItem.rightBarButtonItem = refreshButton;

UINavigationBar остается пустым, а UIBarButtonItem не появляется ...

Как я могу изменить пользовательский интерфейс?

1 Ответ

5 голосов
/ 20 февраля 2012

К сожалению, насколько я могу судить, у Storyboards нет способа подключиться к делегату приложения. Следовательно, вы не можете напрямую получить дескриптор контроллера представления в методах жизненного цикла делегата приложения, чтобы выполнить дополнительную работу.

Однако вы ДЕЙСТВИТЕЛЬНО знаете, что свойство rootViewController окна делегата приложения будет начальным контроллером представления, указанным вами в раскадровке. Так что вы всегда можете сделать что-то вроде этого:

XXRootViewController *rootViewController = (XXRootViewController *)self.window.rootViewController;
[rootViewController doAdditionalWork];

Кроме того, причина, по которой вызов -instantiateViewControllerWithIdentifier: на вашем раскадровке не работает, заключается в том, что он фактически создает экземпляр нового контроллера представления. Однако иерархия контроллера представления, которую вы настроили в файле раскадровки, - это то, что фактически не архивируется при запуске вашего приложения. Таким образом, вы эффективно создаете экземпляр этого контроллера представления, вносите в него некоторые изменения, а затем он освобождается.

...