2014-03-19 76 views
0

我有一個標籤欄控制器,由3個標籤表視圖控制器(時間軸中,活動和設置)和我與主題進行工作。自定義導航欄圖像,不符合同步NSUserDefaults的

如果用戶點擊設置,他們可以點擊「主題」單元格並從各種主題中進行選擇。

通過NSUserDefaults的使用中,我保存在SelectThemesTableViewController的didSelectCell主題:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath]; 
    self.selectedTheme = selectedCell.textLabel.text; 
    [[NSUserDefaults standardUserDefaults] setObject:self.selectedTheme forKey:@"Theme"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

在時間軸和事件視圖控制器,我設置的背景,導航欄和圖像標籤欄圖像在viewWillAppear中,這取決於小區的用戶選擇這樣的:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.selectedTheme = [[NSUserDefaults standardUserDefaults] objectForKey:@"Theme"]; 

    if ([self.selectedTheme isEqualToString:@"Blur"]) 
    { 
     // View Background 
     UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Purplepink.png"]]; 
     self.tableView.backgroundView = backgroundImageView; 

     // Navigation Bar 
     UIImage *navBackgroundImage = [UIImage imageNamed:@"Purplepinknav.png"]; 
     [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 

     // Tab Bar 
     UIImage *tabBackground = [[UIImage imageNamed:@"SolidPurple.png"] 
            resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
     [self.tabBarController.tabBar setBackgroundImage:tabBackground]; 

    } 
    else if ([self.selectedTheme isEqualToString:@"Red Slanted"]) 
    { 
     // View Background 
     UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"RedSlanted.png"]]; 
     self.tableView.backgroundView = backgroundImageView; 

     // Navigation Bar 
     UIImage *navBackgroundImage = [UIImage imageNamed:@"RedSlantedNav.png"]; 
     [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 

     // Tab Bar 
     UIImage *tabBackground = [[UIImage imageNamed:@"RedSlantedTab.png"] 
            resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
     [self.tabBarController.tabBar setBackgroundImage:tabBackground]; 

    } 

    else if ([self.selectedTheme isEqualToString:@"Twirl"]) 
    { 
     // View Background 
     UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Twirl.png"]]; 
     self.tableView.backgroundView = backgroundImageView; 

     // Navigation Bar 
     UIImage *navBackgroundImage = [UIImage imageNamed:@"ReddishBlackNav.png"]; 
     [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 

     // Tab Bar 
     UIImage *tabBackground = [[UIImage imageNamed:@"ReddishBlackTab.png"] 
            resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; 
     [self.tabBarController.tabBar setBackgroundImage:tabBackground]; 
    } 

當我設置在SelectTheme主題,它的工作原理,當我去到時間軸表視圖,主題是全面應用與背景,導航欄和標籤欄圖像。如果我退出應用程序並返回,所有內容都仍然存在。

但是,問題是:如果我從模擬器或我的設備上的多任務中關閉應用程序並重新打開我的應用程序,背景和選項卡欄就是我最後設置的,但導航欄會顯示回到App Delegate中應用的默認值。如果我切換到另一個選項卡並返回到時間軸,導航欄會變爲選定的導航,但問題在於初始視圖會加載默認導航欄而不是選定的導航欄,如果我更改選項卡並返回到時間軸選項卡,然後再次顯示。

我在viewDidDisappear:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    UIImage *navBackgroundImage = [UIImage imageNamed:@"purplynav.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 
    UIImage *tabBackgroundImage = [UIImage imageNamed:@"purplytab.png"]; 
    [[UITabBar appearance] setBackgroundImage:tabBackgroundImage]; 

} 

如果我刪除此viewDidAppear代碼,同樣的事情發生。 我錯過了什麼嗎?爲什麼導航欄不符合NSUserDefaults?

的任務AppDelegate低於:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSLog(@"Is this getting called?"); 
    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 
    UIImage *navBackgroundImage = [UIImage imageNamed:@"purplynav.png"]; 
    [[UINavigationBar appearance] setBackgroundImage:navBackgroundImage forBarMetrics:UIBarMetricsDefault]; 
    UIImage *tabBackgroundImage = [UIImage imageNamed:@"purplytab.png"]; 
    [[UITabBar appearance] setBackgroundImage:tabBackgroundImage]; 
    ... 
} 

編輯:我添加了一些日誌按照註釋。 AppDelegate中的didFinishLaunchingWithOptions中的NSLog總是首先運行。在此之後,時間軸表視圖(初始視圖控制器)的viewWillAppear被NSLog調用。

這解釋了爲什麼導航欄在多任務中死亡(或未打開幾小時)後第一次啓動應用程序時會回到默認值。但是,我不一定需要在AppDelegate中設置代碼。起初,應用程序沒有主題,因此設置AppDelegate的導航欄非常重要。但是現在,我想用主題啓動應用程序,但是當選擇了新主題時,不應該在應用程序被殺死後第一次運行應用程序委託的導航欄。

任何這方面的援助將不勝感激。

+0

應用程序委託中調用的默認設置在哪裏?你在使用故事板嗎?添加日誌並檢查您的代碼在哪個訂單中運行... – Wain

+0

謝謝@Wain - 默認設置正在App Delegate的didFinishLaunchingWithOptions中調用。我在didFinishLaunchingWithOptions方法中也有默認的標籤欄圖像,當從多任務中關閉應用程序時,該方法不會被調用。我在這裏爲整個應用程序使用所有故事板。登錄AppDelegate - 在我啓動應用程序時被調用,但在關閉應用程序時沒有受到攻擊,但在從多任務中終止應用程序時會被調用。謝謝Wain – amitsbajaj

+0

對不起@你是否對這個問題有任何進一步的想法? – amitsbajaj

回答

1

修剪下來,讓你配置所有使用UIAppearance代理主題基於UI的2處簡化您的解決方案:

  1. 應用程序的委託 - 使用存儲的設置(最好的,如果這是一個打電話給你主題經理)
  2. 主題管理 - 使用新存儲的設置

這樣你的主題代碼包含和組織,你總是有應用(而不是一些默認)相應的主題。

+0

非常感謝@Wain - 選項1在這裏工作得像一個絕對的對待。 – amitsbajaj