2014-10-27 2 views
0

У меня есть простое приложение, которое представляет собой комбинацию UITableViewController s, UIViewController s и UISplitViewController s. Сейчас я привожу ландшафтную ориентацию в свое приложение для iPad.Изменение фонового изображения UITableViewController Мастер UISplitViewController в альбомной ориентации

У меня он сконфигурирован так, что в Portrait, Master View скрыт за UIBarButtonItem, а в ландшафте отображаются оба уровня мастера и детали. У меня есть собственные темы в моем приложении, которые меняют фон и UINavigationBar в соответствии с выбранной темой.

Выпуск

Когда в ландшафтном и на странице выбора темы, вид Мастер меню (UITableViewController) и Detail страница Выбор темы (UICollectionView). Если я выберу тему, то UICollectionView обновит ее фон, чтобы представить новую тему. Однако Мастер-вид не обновляет тему. Это проблема.

В портретном режиме, Мастер обновляется, потому что в это viewWillAppear, у меня есть вызов метода changeAppThemes:

- (void)changeAppThemes 
{  
    NSLog(@"This is getting called"); 
    self.selectedTheme = [[NSUserDefaults standardUserDefaults] objectForKey:@"Theme"]; 

    if ([self.selectedTheme isEqualToString:@"Mystical"]) 
    { 
     ThemeManager *themeManager = [ThemeManager sharedManager]; 

     themeManager.backgrounds = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PurplepinkIPAD.png"]];  
     self.tableView.backgroundView = themeManager.backgrounds; 
     UIImage *navBackgroundImage = [UIImage imageNamed:@"Purplepinknav.png"]; 
     [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 

    } 

В пределах моей didSelectMethod от UICollectionView, я поставил вызов метода changeAppThemes:

[[NSUserDefaults standardUserDefaults] setObject:self.selectedTheme forKey:@"Theme"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 
[self changeAppThemes]; 

MasterTableViewController *master = [[MasterTableViewController alloc] init]; 
[master changeAppThemes]; 

Это работает в ландшафтном режиме, потому что отображается NSLog «This is getting called». Однако темы не меняются.

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

Кажется, что отсутствует один ключевой элемент для обновления, хотя я явно вызываю метод changeAppThemes из UICollectionView.

Любые рекомендации по этому вопросу будут действительно оценены.

ответ

2

Я думаю, что вы можете получить MasterTableViewController в detailView таким образом, если вы создадите проект UISplitViewController с настройкой по умолчанию через xcode.

NSArray *viewControllers = self.splitViewController.viewControllers; 
UINavigationController *controller = viewControllers[0]; 
MasterViewController * masterController = (MasterViewController *)controller.topViewController; 
[masterController changeAppThemes]; 

Пожалуйста, убедитесь, что вы получите masterController в viewcontrollers вашего splitViewController вместо создания нового, новый один не внутри splitViewController.

+0

Большое спасибо @gabbler - этот ответ работал отлично, и я так благодарен за вашу помощь в этом. Понятно, почему это не сработало с моим кодом, потому что он создавал новый экземпляр вместо использования в splitView - это блестяще. Еще раз спасибо, и награда счастливо награждена! – amitsbajaj

+0

@Lavanya, добро пожаловать! – gabbler

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