2009-07-26 4 views
0

각 UIViewController 파생 클래스에 연결하는 각 TabBarItem있는 UITabBarController 들어있는보기 컨트롤러 (하자 그것을 MainViewController 호출하자). 특정 UIViewController의 경우 MainViewController를 통해 그 당시 값을 전달하려고합니다. 이 프록시를 수행하는 가장 좋은 방법은 무엇입니까?부모 ViewController를 통해 ViewController에 값을 프록시하는 것이 가장 좋습니다.

지금은 MainViewController에서 프록시 용도로 속성을 만들어야합니다. 그러나 이상적으로, MainViewController는 값을 전달해야하는 UIViewController의 특정 유형과 전달되는 값의 특정 유형을 알지 못합니다. 값은 MainViewController에서 사용되지 않으므로 불필요한 것으로 간주됩니다.

탭 막대 항목 2가 UIEmployeeInfoViewController 클래스에 연결한다고 가정 해 보겠습니다. UIEmployeeInfoViewController는 EmployeeInfo라는 유형의 객체에 관심이 있습니다.

여기에 내 현재 솔루션이지만 나는 더 나은 방법을 찾아 일을 피하려고 노력하고있는 작업은 다음과 같습니다 첫째 좋아

 

1) Somewhere where UIMainViewController is being create... 

UIMainViewController *mainViewController = [[UIMainViewController alloc] initWith...]; 

// a property called employeeInfo is created in UIMainViewController class so it can be forwarded later 
mainViewController.employeeInfo = employeeInfoObj; 

... 


2) Code to make UIMainViewController pass the employeeInfo along to UIEmployeeInfoViewController when the tabbar item is tapped: 

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{ 
    if ([viewController class] == [UIEmployeeInfoViewController class]) 
    { 
      // Need to create coupling to UIEmployeeInfoViewController class 
      // and to EmployeeInfo class as well 
      ((UIEmployeeInfoViewController *)viewController).employeeInfo = self.employeeInfo; 
    } 


    return YES; 
} 

답변

0

, 문자의 UI로 클래스를 접두사하지 않습니다. UIKit 용으로 예약되어 있습니다. Objective-C에는 네임 스페이스가 없으므로 잘 알려진 접두어 (특히 Apple에서 사용하는 접두어)를 사용하는 것은 좋지 않습니다.

여기에는 몇 가지 옵션이 있습니다.

모든 클래스가 그 클래스에서 파생되는 UIViewController 하위 클래스를 만들 수 있으며 생성시에 UIMainViewController *와 같은 공유 컨트롤러 객체를 사용하고 다른 클래스 대신 공유 객체를 쿼리하도록 할 수 있습니다. 그것은 의존성의 본질을 뒤집습니다.

@interface CoreViewController : UIViewController { 
    MainViewController *mainViewController; 
} 

@property (nonatomic, retain, readonly) MainViewController *mainViewController; 

@end 

@implementation CoreViewController 

@synthesize mainViewController; 

- (id) initWithMainViewController:(MainViewController *)mainVC { 
    self = [super initWithNibName:nil bundle:nil]; 

    if (self) { 
    mainViewController = [mainVC retain]; 
    } 

    return self; 
} 

- (void) dealloc { 
    [mainViewController retain]; 

    [super dealloc]; 
} 

@end 

그리고 self.mainViewController에서 가져온 데이터를 가져옵니다. 꽤 강한 커플 링이 될 수도있는 앱의 성격에 따라 다른 옵션은 모든 종류의 공유 ​​상태를 모든 것을 말하는 싱글 톤으로 밀어 넣는 것입니다. 그것은 당신이 당신의 모든 물체를 싱글 톤 워치에 KVO 옵저버에 명시 적으로 체크하지 않고 변경 사항을 등록시킬 수있는 이점이 있습니다.

+0

UI 네임 스페이스를 사용하는 것에 대해 지적 해 주셔서 감사합니다. 내 코드에서 사용하지 마십시오. 빠른 이름 만 사용했습니다. 이상적으로, 나는 그들이 서로에 대해 전혀 알지 못하게하여 자유롭게 연결하고 연주 할 수 있습니다. 이 유스 케이스에 의존성이 존재하지만, 그 때문에 어떤 커플 링도 개발되기를 원하지 않는다. 즉, CoreViewController를 아는 MainViewController를 제거 할 수 있고 그 반대 인 경우, 그 작업을 수행하려고합니다. – Boon

+0

생각해 보면 어떨까요? MainViewController가 CoreViewController의 대리자를 구현한다고 선언하고 CoreViewController가 위임자 (MainViewController)를 통해 데이터를 가져 오는 규칙적인 Delegate 패턴을 사용하면됩니다. – Boon

관련 문제