2013-09-07 2 views
1

탭 응용 프로그램의 몇 가지 ViewController간에 변수를 공유하려고합니다. [NSUserDefaults]를 사용하여 변수를 저장하고로드하려고 시도했지만 매번 응용 프로그램이 충돌합니다. 다음은 SecondViewController 그것은 강조탭 응용 프로그램에서 ViewControllers간에 데이터를 공유하는 방법

- (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     // Do any additional setup after loading the view, typically from a nib. 

     totalApples = [[NSUserDefaults standardUserDefaults]integerForKey:@"numberOfApples"]; 
     [self setText:[NSString stringWithFormat:@"%g", totalApples] withExistingAttributesInLabel:self.l1]; 

    } 

에 내 코드 인 [슈퍼 viewDidLoad에] 탭을 클릭하면 두 번째보기가 충돌의 원인으로 열립니다.

+1

[super viewDidLoad] 이외의 두 줄을 주석 처리하고 충돌이 발생하는지 확인하십시오. 그렇다면 충돌은 뷰 컨트롤러 간의 데이터 공유와 아무 관련이 없습니다. – zolio

+2

'totalApples'는 정수입니까? '% g' 형식은 부동 소수점 숫자를위한 것입니다 ... –

답변

2

여러 VC에서 데이터를 공유해야하는 경우 NSUserDefaults이 모델에 가장 적합하지 않을 수 있습니다. 이 경우 싱글 톤 디자인 패턴의 이점을 사용하여 공유 데이터가있는 클래스를 만드는 것이 좋습니다.

+1

+1 또는,'UITabBarController'를 서브 클래스 화하고,이 서브 클래스를 탭 뷰 컨트롤러 씬의 기본 클래스로 사용하고, 그 서브 클래스에서 모델을 인스턴스화 한 다음 뷰 컨트롤러는'self.parentViewController'를 참조하고 거기에서 모델 객체에 접근 할 수 있습니다. – Rob

0

tabbarcontroller에는 계층 적 데이터가 포함 된 UINavigationController와 달리 동일한 수준의 viewController가 포함되어 있으므로 첫 번째 viewController가 데이터의 일부를 전달합니다. 해당 뷰 컨트롤러에는 다음 중 하나가 필요합니다. - 일부 개체에 데이터를 전달합니다. - 일부 개체는 데이터를 가져올 수 있습니다.

두 번째 방법은 해당 viewController가 데이터를 제공 할 수있는 객체에 대한 지식이 있어야하므로 엄격한 설계로 간주되어야합니다. 첫 번째 방법은 데이터에 접근 할 수있는 (또는 이미 포함 된) 상위 수준의 개체를 가지고 있으며 뷰 컨트롤러에 제공 할 수 있음을 의미합니다. 이 기능은 viewCOntrollers가 더 많은 플러그가 가능할수록 훨씬 더 우아한 솔루션입니다. 여기에서 사용할 수있는 객체는 UITabBarController의 하위 클래스입니다. 이 객체에는 viewControllers가 포함되어 있습니다 ('알고 있습니다'). 이 객체에 dat가 포함되어 있거나 검색 할 수있는 경우이 객체는 viewController에 객체를 넘겨 줄 수 있습니다.

마찬가지로 LudoZik (@LudoZik : 답을 upvote하고 싶었지만 담당자가 충분하지 않아 허용되지 않았습니다.) 데이터를 보유하고있는 커스텀 클래스를 (또는 NSDictionary도 괜찮습니다) 생성하십시오. 그런 다음 UITabBarController의 하위 클래스가 소유 할 수 있으며 필요에 따라 하위 viewController에 부여 할 수 있습니다 (예 : 선택한 경우 또는로드되었을 때).

관련 문제