2012-12-10 2 views
0

이 작업을 수행했지만이 작업을 수행하면 더 많은 것을 요구합니다. 애플의 설명서와 iOS 프로그래밍 서적에 빠져있다. 그 이후로 나는 재사용 성 및 모든 좋은 것들을 위해 나의 애플 리케이션을 완전히 고쳤다.루트 컨트롤러에 얼마나 많은 수준의 깊은 액세스가 있더라도 모든 하위보기 컨트롤러를 제공합니다.

이제 UINavigationController 및 사용자 지정 MenuController를 처리하는 RootController라는 UIViewController가 있습니다. UIViewController 포함 내 RootController 최상의 접근 방식을 결정했습니다.

RootController ---> UINavigationController 
       ---> MenuController 

이제 기본 RootController와 통신하기 위해 UINavigationController의 하위 UIViewController가 필요했던 곳에 문제가 발생했습니다.

RootController ---> UINavigationController --> UIViewController 
     ^_____________________________________________| 

내가 결정한 것은 UIViewController를 카테고리로 확장 한 것입니다.

의 UIViewController + RootController.h

@interface UIViewController (RootController) 

@property (nonatomic, readonly) RootController *rootController; 

@end 

의 UIViewController + RootController.m [자기 rootController 임의 UIViewController에 의해 호출된다

@implementation UIViewController (RootController) 

- (RootController *)rootController { 
    static RootController *rootControler; 
    if(rootControler == nil) { 
     UIViewController *vc = self; 
     while((vc = vc.parentViewController)) { 
      if([vc isMemberOfClass:[RootController class]]){ 
       rootControler = (RootController *)vc; 
       break; 
      } 
     } 
    } 
    return rootControler; 
} 

@end 

는 상위 뷰 컨트롤러를 통해 루프하는 것은 그 하나를 찾을 때까지 RootController와 일치하면 일치 항목을 반환합니다. 또한 속성을 정적으로 만들었으므로 한 번만 조회했습니다.

제 궁금한 점은 제가 만든 올바른 방법 이었습니까? UIViewController의 navigationController 메서드와 비슷한 것을 만들려고했습니다.

내 응용 프로그램 내의 모든보기에서 MenuController를 처리 할 수 ​​있도록 기본 루트 컨트롤러에 대한 액세스가 필요합니다.

+0

기술적으로는 괜찮은 것처럼 보이지만, 말하면 쉽게 주석을 달 수 있습니다 왜 다른 컨트롤러에서 루트 컨트롤러에 액세스해야하는지. –

+0

고마워, 나는 이것을했다. – arosolino

답변

1

해결 방법은 정확하지만 깨끗하지는 않습니다. 유사한 상황에서 저는 보통 AppDelegate를 사용하여 "역"방법으로 참조를 얻는 것을 선호합니다. 예를 들어

:

#import "AppDelegate.h" // at the top of your file 

UIViewController *vc = [[(AppDelegate *)[[UIApplication sharedApplication] delegate] window] rootViewController]: 

VC는 루트 뷰 컨트롤러에 대한 참조입니다. 윈도우의 루트보기 컨트롤러가 바뀔 수 있으므로주의하십시오 (변경하면 :-). 따라서이 경우에는 aproach를 변경해야합니다 (예 : AppDelegate에 @property를 추가하고 RootController가이 속성을로드 할 때).

+0

이 방법을 고려했지만 재사용성에 좋지는 않았습니다. UIWIndow의 rootViewController가 아니라면 코드의 모든 라인을 다른 곳에서 참조하도록 수정해야합니다. – arosolino

+0

내 대답의 마지막 두 줄을보십시오 :-) 또 다른 방법은 AppDelegate에 @property를 추가하고 RootVC가이 속성을로드 할 수있게 만드는 것입니다. 이것은 훨씬 더 재사용이 가능합니다. (AppDelegate에 속성을 추가하는 것만으로) 빠른 설정이 필요합니다. – LombaX

+0

또한 뭔가 바뀌면 코드의 모든 단일 라인을 수정하여 다른 곳을 참조 할 필요가 없습니다. 카테고리 방법을 사용하고 솔루션에서했던 것처럼 [self rootController]를 사용하여 액세스하십시오. 그래서, 한 줄만 바꿔야합니다. (첫 번째 경우) – LombaX

관련 문제