2013-04-21 34 views
0

在我的應用程序的開始屏幕中,您可以通過單擊英國或瑞典的標誌來選擇英語和瑞典語之間的語言。 問題是,當您單擊按鈕時,ViewDidLoad無法識別NSUserDefaults中的更改。但是,當您重新啓動應用程序時,語言是您點擊的最新標誌!因此它保存了NSUserDefault,但它只在ViewDidLoad中第一次加載它。從ViewDidLoad中的NSUserDefaults加載數據

當您單擊英語國旗時,sprakval設置爲0,並且如果單擊瑞典國旗,sprakval將設置爲1.單擊標誌,它將更改爲標誌前方帶有刻度圖標的圖像。

代碼:

-(IBAction) sprakEN 
{ 
    sprakval=0; 
    NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
    [sprakvalet setInteger:sprakval forKey:@"Sprak "]; 
    [sprakvalet synchronize]; 

    [super viewDidLoad]; 
} 



-(IBAction) sprakSE 
{ 
    sprakval=1; 
    NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
    [sprakvalet setInteger:sprakval forKey:@"Sprak "]; 
    [sprakvalet synchronize]; 

     [super viewDidLoad]; 
} 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 

     NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
     sprakval2 = [sprakvalet integerForKey:@"Sprak "]; 

     if (sprakval2==0) 
     { 
      spraklabel.text = [NSString stringWithFormat:@"Language:"]; 

      [lhb setTitle:@"english" forState:UIControlStateNormal]; 
      [hlb setTitle:@"english" forState:UIControlStateNormal]; 
      [fhb setTitle:@"english." forState:UIControlStateNormal]; 
      [blandatb setTitle:@"english.." forState:UIControlStateNormal]; 

      UIImage *encheck = [UIImage imageNamed:@"United_Kingdomchecked.png"]; 
      [enbutton setImage:encheck forState:UIControlStateNormal]; 

      UIImage *seuncheck = [UIImage imageNamed:@"Sweden.png"]; 
      [sebutton setImage:seuncheck forState:UIControlStateNormal]; 

      self.title = @"Game"; 
     } 
     else if(sprakval2==1) 
     { 
      spraklabel.text = [NSString stringWithFormat:@"Språk:"]; 

      [lhb setTitle:@"swedish" forState:UIControlStateNormal]; 
      [hlb setTitle:@"swedish" forState:UIControlStateNormal]; 
      [flb setTitle:@"swedish" forState:UIControlStateNormal]; 
      [fhb setTitle:@"swedish" forState:UIControlStateNormal]; 
      [blandatb setTitle:@"swedish" forState:UIControlStateNormal]; 

      self.title = @"Spel"; 
      UIImage *secheck = [UIImage imageNamed:@"Swedenchecked.png"]; 
      [sebutton setImage:secheck forState:UIControlStateNormal]; 

      UIImage *enuncheck = [UIImage imageNamed:@"United_Kingdom.png"]; 
      [enbutton setImage:enuncheck forState:UIControlStateNormal]; 
     } 

    // Do any additional setup after loading the view, typically from a nib. 
    } 
+0

'@「Sprak」'是有目的的空間嗎? – 2013-04-21 17:11:11

+0

嗯,沒有。但我確定這不是問題! – Mangy92 2013-04-21 17:12:41

+0

檢查我的答案。它對你有用嗎? – 2013-04-21 18:15:08

回答

1

這是因爲您在-(IBAction) sprakSE -(IBAction) sprakEN 方法中通過其超類調用ViewDidload方法。因此在兩種方法中用 [self viewDidLoad];代替 [super viewDidLoad];。它會正常工作。

希望它可以幫助你。

+0

謝謝,它的工作原理!但是,我如何從另一種觀點獲得語言?此啓動畫面是選項卡欄中的第一個選項卡。當我嘗試在第二個選項卡viewdidload中獲取語言時,它只能在第一次使用!當我回去改變語言,然後回到第二個標籤時,語言不會改變。 但是,當我第一次進入一個完全不同的視圖,然後返回並更改語言時,它也會在第二個選項卡中更改一次! – Mangy92 2013-04-21 20:06:02

1

viewDidLoad中是視圖已經從筆尖文件加載之後調用的方法。你不應該手動調用它。

如果您已經編寫了代碼來刷新viewDidLoad中的控件,將其移入其他方法並從您的按鈕事件處理程序中調用該方法。

- (void)adjustControlsForLanguage 
{ 
    NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
    sprakval2 = [sprakvalet integerForKey:@"Sprak "]; 

    if (sprakval2==0) 
    { 
     spraklabel.text = [NSString stringWithFormat:@"Language:"]; 

     [lhb setTitle:@"english" forState:UIControlStateNormal]; 
     [hlb setTitle:@"english" forState:UIControlStateNormal]; 
     [fhb setTitle:@"english." forState:UIControlStateNormal]; 
     [blandatb setTitle:@"english.." forState:UIControlStateNormal]; 

     UIImage *encheck = [UIImage imageNamed:@"United_Kingdomchecked.png"]; 
     [enbutton setImage:encheck forState:UIControlStateNormal]; 

     UIImage *seuncheck = [UIImage imageNamed:@"Sweden.png"]; 
     [sebutton setImage:seuncheck forState:UIControlStateNormal]; 

     self.title = @"Game"; 
    } 
    else if(sprakval2==1) 
    { 
     spraklabel.text = [NSString stringWithFormat:@"Språk:"]; 

     [lhb setTitle:@"swedish" forState:UIControlStateNormal]; 
     [hlb setTitle:@"swedish" forState:UIControlStateNormal]; 
     [flb setTitle:@"swedish" forState:UIControlStateNormal]; 
     [fhb setTitle:@"swedish" forState:UIControlStateNormal]; 
     [blandatb setTitle:@"swedish" forState:UIControlStateNormal]; 

     self.title = @"Spel"; 
     UIImage *secheck = [UIImage imageNamed:@"Swedenchecked.png"]; 
     [sebutton setImage:secheck forState:UIControlStateNormal]; 

     UIImage *enuncheck = [UIImage imageNamed:@"United_Kingdom.png"]; 
     [enbutton setImage:enuncheck forState:UIControlStateNormal]; 
    } 

} 

viewDidLoad中

- (void)viewDidLoad{ 
    [super viewDidLoad]; 
    [self adjustControlsForLanguage]; 
} 

按鈕事件處理

-(IBAction) sprakEN { 
    sprakval=0; 
    NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
    [sprakvalet setInteger:sprakval forKey:@"Sprak "]; 
    [sprakvalet synchronize]; 

    [self adjustControlsForLanguage]; 
} 

-(IBAction) sprakSE { 
    sprakval=1; 
    NSUserDefaults *sprakvalet = [NSUserDefaults standardUserDefaults]; 
    [sprakvalet setInteger:sprakval forKey:@"Sprak "]; 
    [sprakvalet synchronize]; 

     [self adjustControlsForLanguage]; 
} 

編輯:由於您使用的是基於的TabBar的應用程序,這是更好地使用viewWillAppear中重新加載特定語言的控制

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self adjustControlsForLanguage]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
} 
+0

謝謝!有用!但是,我如何從另一種觀點獲得語言?此啓動畫面是選項卡欄中的第一個選項卡。當我嘗試在第二個選項卡viewdidload中獲取語言時,它只能在第一次使用!當我回去改變語言,然後回到第二個標籤時,語言不會改變。 但是,當我第一次進入一個完全不同的視圖,然後返回並更改語言時,它也會在第二個選項卡中更改一次! – Mangy92 2013-04-21 20:06:19

+1

viewDidLoad方法每個viewController只調用一次,即第一次加載。當您第一次單擊第二個選項卡時,只會調用此選項卡。您可以從viewWillAppear調用adjustControlsForLanguage方法來刪除同步問題。每次顯示視圖時都會調用此方法。 – Anupdas 2013-04-21 20:13:06

+0

我添加了你寫的代碼,但是我得到一個錯誤,說「UIViewController沒有可見的@interface」聲明選擇器「viewWillAppear」「。 有什麼我必須改變? – Mangy92 2013-04-21 20:30:57

相關問題