2013-04-21 2 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"는 어떤 목적을 가진 공간입니까? –

+0

흠, 아니. 그러나 나는 그것이 문제가 아니라고 확신합니다! – Mangy92

+0

내 대답을 확인하십시오. 그것은 당신을 위해 일하고 있습니까? –

답변

1

-(IBAction) sprakSE -(IBAction) sprakEN 메소드의 수퍼 클래스를 통해 ViewDidload 메소드를 호출하기 때문입니다. 따라서 두 방법 모두에서 을 [self viewDidLoad];으로 대체하십시오. 제대로 작동합니다.

희망이 있으면 도움이됩니다.

+0

고마워, 작동 해! 그러나 다른 시각에서 어떻게 언어를 구할 수 있습니까? 이 시작 화면은 탭 표시 줄의 첫 번째 탭입니다. viewdidload의 두 번째 탭에서 언어를 가져 오려고하면 처음에만 작동합니다!돌아가서 언어를 변경 한 다음 탭 2로 돌아 가면 언어가 변경되지 않습니다. 그러나 완전히 다른보기를 처음 입력하고 돌아가서 언어를 변경하면 두 번째 탭에서 한 번만 변경됩니다! – Mangy92

1

의 viewDidLoad는 뷰가 nib 파일에서로드 된 후 호출하는 방법입니다. 수동으로 호출하지 않아도됩니다.

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의 두 번째 탭에서 언어를 가져 오려고하면 처음에만 작동합니다! 돌아가서 언어를 변경 한 다음 탭 2로 돌아 가면 언어가 변경되지 않습니다. 그러나 완전히 다른보기를 처음 입력하고 돌아가서 언어를 변경하면 두 번째 탭에서 한 번만 변경됩니다! – Mangy92

+1

viewDidLoad 메서드는 viewController 당 한 번만 호출됩니다. 즉, 처음으로로드됩니다. 두 번째 탭을 처음 클릭하면이 탭이 호출됩니다. viewWillAppear에서 adjustControlsForLanguage 메소드를 호출하여 동기화 문제를 제거 할 수 있습니다. 이 메소드는, 뷰가 표시 될 때마다 불려갑니다. – Anupdas

+0

쓴 코드를 추가했지만 "UIViewController"에 대해 표시되지 않는 @interface가 "selector"viewWillAppear "을 선언하는 것과 같은 오류가 나타납니다. 내가 바꿔야 할 것이 있습니까? – Mangy92