2011-04-20 4 views
0

많은 응용 프로그램에서 필자는 현재 시각적 컨트롤러에 대한 참조가없는 일부 클래스에서 컨트롤러를 모달로 제공해야한다는 것을 여러 번 경험했습니다. (예 : 제품의 다운로드 진행 상황을 표시하는 데 사용되는 컨트롤러를 제공하는 StoreKit 트랜잭션 관찰자).어디서나 UIViewController를 모달로 표시 할 때 권장되는 방법은 무엇입니까?

Three20을 사용하면 - [TTNavigator visibleViewController]을 사용하여 작업을 완료 할 수 있지만 프레임 워크를 사용하지 않으려면 어떻게해야합니까? TTNavigator처럼 작동하는 사용자 지정 함수를 다시 구현해야합니까? Apple API에 비슷한 방법이 있을까요? 예를 들어 내 응용 프로그램의 모든 컨트롤러에 대해 공통의 부모 클래스를 만든 다음 NSNotificationCenter을 사용하여 모든 응용 프로그램 전체 알림을 처리하는 것이 더 좋을까요? (물론 이것은 하나의 클래스에서 관련없는 코드를 갖는 부작용을 가질 것입니다.)

저는 Apple이 그의 표준 API에서이 기본 기능을 제공하지 않았다는 것에 정말 놀랐습니다. 아니면이 문제가 반복적으로 발생한다는 사실은 잘못된 설계 관행의 징조입니까?

답변

1

몇 가지 생각은 반드시 정확하다고 보장 할 수는 없지만 올바른 방향으로 유도 할 수 있습니다. 문제를 올바르게 이해하면 기본적으로 (완료시 말하면) 몇 가지 구체적인 조치가 필요합니다. 모달보기로 표시되지만 액션에는 현재 화면에있는보기 컨트롤러에 대한 참조가 없습니다 (예를 들어 백그라운드에서 작업을 수행하고 사용자가 여전히 프로그램을 탐색하도록하고 완료시 사용자).

이 문제를 해결하는 방법은 응용 프로그램의 전체 아키텍처에 따라 달라집니다. 대부분의 앱에는 네비게이션을 제어하는 ​​루트 뷰 컨트롤러가 있습니다. 앱 대행자에서 생성 한 UITabBarController이 있고 모든 탐색이 해당 컨트롤러에서 나옵니다. 이 최상위 뷰 컨트롤러를 통해 모달 뷰 컨트롤러를 표시 할 수 있습니다 (앱 대리자 내에서이 작업을 수행 할 수 있습니다).

또는, 모달 뷰 컨트롤러를 표시하고 뷰를 응용 프로그램 창에 직접 첨부 할 수 있습니다. MBProgressHUD과 같이 꽤 인기있는 라이브러리를 보면 모든보기 컨트롤러가있는 앱 윈도우에 제공되는 모달로드보기를 첨부 할 수 있습니다.

그래서 원하는 것을 성취하기위한 다양한 전략이 있습니다. 아마도 일부 모달 대화 상자를 표시하고 현재 볼 수있는 컨트롤러가 무엇인지 모를 시나리오가 있기 때문에 문제가 불쌍한 앱 디자인의 결과라고 말할 필요는 없습니다. 즉, 다운로드 진행 상황을 보여주는 StoreKit 트랜잭션 옵저버 (예 : 제품 구매 등) 후에 트리거가 발생한다고 가정하고 실행 된 뷰 컨트롤러를 알 수 있습니다. .

+0

자세한 답변 해 주셔서 감사합니다. App Delegate에는 (메인 윈도우를 통해) 루트보기 컨트롤러에 대한 참조가 있습니다. 그러나 여전히 현재 보이는 컨트롤러를 즉시 볼 수는 없습니다. 현재 컨트롤러의 맨 위에 표시되는 모달 컨트롤러가있을 수 있으며 탐색 스택이 더 복잡 할 수 있습니다. 제가 제시 한 예에서, 당신이 말한대로 문제를 처리하는 순간 : 애플이 낙담 했음에도 불구하고 스토어 컨트롤러를 거래 관측자로 설정했습니다. 애플리케이션이 시작되는 즉시 미완료 트랜잭션을 처리해야하므로 . – eugeniodepalo

+0

아, 알겠습니다. - 모달 컨트롤러가 이미 표시되어있을 가능성을 고려하지 않았습니다 (예 : 모달 내 모달). 이 경우 가장 간단한 방법은 창을 덮어 쓰고 전체 앱보기 계층 구조 위에 덤프하는 것일 수 있습니다. – lxt

관련 문제