2011-04-26 5 views
0

4 탭이있는 UITabBar 응용 프로그램이 있습니다. 각 탭에는 고유 한 ViewController가 있습니다.다른보기 컨트롤러의 xcode 액세스 클래스 변수/속성

때로는 Tav2ViewControllerTab3의 Tab1ViewController에서 변수에 액세스하려고합니다. 예를 들어

:

Tab1ViewController.h

#import <UIKit/UIKit.h> 
@interface Tab1ViewController : UIViewController { 
NSMutableArray *contentArray; 
} 
@property (nonatomic, retain) NSMutableArray *contentArray; 
@end 

Tab2ViewController.m

#import "Tab2ViewController.h" 
#import "Tab1ViewController.h" 
@implementation Tab2ViewController 
- (void) viewDidLoad { 
NSLog(@"Data count Tab1: %@", [Tab1ViewController.contentArray count]); 
} 

이 엑스 코드로 보이기 때문에이 작동하지 않는이 contentArray가 될 것으로 예상 방법. 그러나 다른 ViewController에서이 속성에 어떻게 액세스 할 수 있습니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

덕분에, 팻

답변

1

Tab1ViewController의 인스턴스가 있습니까? 클래스의 인스턴스가 아닌 클래스의 속성에 액세스하려고합니다. 이 속성은 속성이 정적 인 경우에만 작동합니다. 나는 서로 통신하는 탭이 앱의 디자인에 약간의 명확성이 없음을 나타낼 수도 있음을 경고해야합니다. 이상적으로,보기 컨트롤러는 중앙 위치와 대화해야합니다.

+0

그래서 응용 프로그램을 시작한 후 초기화하고 각 tabcontroller에서 해당 인스턴스를 수신하는 4 개의 get-methods를 만드는 App-Delegate에서 일부 인스턴스 변수를 정의 할 수 있습니까? 그게 최선의 방법일까요? – crimi

+0

@crimi - 확실히 유망한 옵션으로 들립니다. 탭 뷰 컨트롤러는 앱 위임에 접근하기 위해'[[UIApplication sharedApplication] delegate]'를 사용하거나, 앱 위임자가 구현하는 자신 만의 델리게이트 프로토콜을 작성할 수 있습니다. – Tejas

1

컨트롤러를 서로 분리하려고 시도하는 것이 좋습니다. 어떤 컨트롤러가 다른 컨트롤러를 인식 할 수 있으면 하나의 컨트롤러를 변경하면 다른 모든 컨트롤러가 변경 될 수 있습니다. 이는 확장되지 않으며 개발자로서의 삶을 불필요하게 어렵게 만듭니다.

대신에 앱을 독립적 인 모듈로 분리하여 통신 할 수 있지만 그 종류의 응용 프로그램 전체에 긴밀한 결합이 필요하지 않은 효과적인 패턴이 있습니다.

컨트롤러간에 이벤트를 보내려면 대리자가 첫 번째 컨트롤러를 인식하지 않고도 한 컨트롤러가 두 번째 대리자 컨트롤러와 통신 할 수 있도록 대리인 패턴을 고려하십시오. 컨트롤러가 이벤트를 청취하는 다른 컨트롤러에 대해 알 필요없이 이러한 이벤트를 알리는 통보 기능을 제공합니다.

컨트롤러간에 데이터를 공유하려면이 데이터를 저장하고 각 컨트롤러에 대한 참조를 제공하기 위해 공유 모델 객체 (또는 ManagedObjectContext와 같은 모델을 얻기위한 서비스)를 구성하십시오. 그렇게하면 앱 위임자가이 모델을 구성하여 각 컨트롤러에 전달할 수 있습니다. 각 컨트롤러는 모델에 대한 변경 사항을 관찰하고 해당 모델을 사용하는 다른 컨트롤러를 인식 할 필요없이 필요에 따라 모델을 수정할 수 있습니다.

Apple의 WWDC talk on MVC는 유용한 가이드입니다.

관련 문제