2013-04-21 62 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