2011-02-16 5 views
2

UIViewController의 하위 클래스 인이 클래스 (FooViewController)를 사용합니다. rootController이 있다는 점에서 UINavigationController과 유사하게 작동하며 다른 UIViewController을 추가 할 수 있습니다. 그리고 각각 UIViewController 내에서 FooViewController은 또 다른 UIViewController을 생성하고 그 새로운 UIViewControllerFooViewController으로 푸시 할 수 있습니다.모든 UIViewController에 변수 추가

다음은 내가 말하는 의미의 예입니다. 새 UITableViewController을 프로젝트에 추가하면이 코드가 자동 생성됩니다.

DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"Nib name" bundle:nil]; 
// ... 
// Pass the selected object to the new view controller. 
[self.navigationController pushViewController:detailViewController animated:YES]; 
[detailViewController release]; 

여기에 질문입니다 : 어떻게 UIViewController의 모든에 navigationController 같은 변수를 가질 수있다? 범주를 사용하여 기존 클래스에 메서드를 추가 할 수있는 것처럼 기존 클래스에도 변수를 추가 할 수 있습니까? Associative References이 내가 찾고있는 것 같지만 Mac에서만 사용할 수 있습니다.

나를 위해 작동 할 수있는 한 가지 해결책은 내가 사용할 수있는 UIViewController을 모두 서브 클래스 화하고 실제 클래스를 하위 클래스로 서브 클래 싱하는 것입니다. 예를 들어 다음과 같이 할 수 있습니다.

@interface FooUIViewController : UIViewController { 
    FooViewController *fooViewController; 
} 

@interface FooUITableViewController : UITableViewController { 
    FooViewController *fooViewController; 
} 

이렇게 할 수있는 것은 : [self.fooViewController pushViewController:detailViewController];입니다. 그러나 이것은 이것을하는 더러운 방법처럼 보입니다.

나는 이것이 어려운 일이 아니어야하고 어쩌면 내가 잘못 생각하고 있다고 생각합니다. 이견있는 사람? 감사!

답변

4

아니요, UIViewController에 인스턴스 변수를 추가 할 수 없습니다.

서브 클래 싱은 FooViewController와 관련하여 할 수있는 많은 일을 고려할 때 나쁜 방식은 아닙니다. 어쨌든 FooViewController에 의존하기 때문에 클래스 디자인을 해치지 않습니다 (navigationController 속성을 갖는 UIViewController와 동일).

또 다른 방법은 응용 프로그램 대리인을 통해 FooViewController 개체에 액세스하는 것입니다. 하지만이 방법이 더러운 방법이라고 생각합니다 (이제 응용 프로그램 위임자에 의존하기 때문입니다).

+0

응용 프로그램 대리인을 사용해 주셔서 감사합니다. 대신 싱글 톤을 사용하고 있으며 솔루션에 만족하지는 않지만이 프로젝트에서 작동합니다. 감사! – donkim