2012-12-03 3 views
2

내 응용 프로그램의 루트보기 컨트롤러 인 탐색 컨트롤러가 있습니다. 그것은 내 메인 화면입니다. 마스터보기에서 위치 및 상세보기를 나열하는 분할보기 컨트롤러가지도의 위치를 ​​보여줍니다. 분할보기 컨트롤러를 탐색 컨트롤러에 푸시하고 싶지만 분할보기 컨트롤러를 탐색 컨트롤러에 푸시 할 수 없다는 오류가 발생하고 응용 프로그램의 루트보기 컨트롤러 여야합니다. 그래서 열심히 노력했습니다.분할보기 컨트롤러 및 탐색 컨트롤러를 윈도우 루트보기 컨트롤러로 사용

MyAppDelegate *myappdelegate= [[UIApplication sharedApplication] delegate]; 
UISplitViewController * vc= [[UISplitViewController alloc] init]; 
vs.viewControllers = [NSArray arraywithObjects...... 
.... 
myappdelegate.window.rootViewController= vc; 

이것은 작동합니다. 예상대로 애니메이션이없는 분할보기 컨트롤러를 보여줍니다. 그리고 분할보기 컨트롤러를 닫을 때 같은 단계를 수행합니다. 메인 스크린 펜촉으로 내비게이션 컨트롤러를 만들고이 애플 리케이션 델리게이트의 window.rootviewController를 다시 설정합니다. 그리고 성공적으로 메인 화면을 다시로드합니다.

그러나 이것이 올바른 방법이라고 생각합니다. 이 일을하기에 더 적합한 방법이 있습니까?

그리고 분할 뷰 컨트롤러의 하위 컨트롤러를 릴리스 할 수 없습니다. 나는 자식 컨트롤러의 릴리스 방법에 중단 점을 만들었습니다. 그것은 걸리지 않았다. 나는 내 앱의 루트보기 컨트롤러를 탐색 컨트롤러로 설정할 때 오래된 루트보기 컨트롤러 (분할보기 컨트롤러)를 자식과 함께 릴리스해야한다고 생각했습니다. 다음 분할보기 컨트롤러를 닫을 때 아래 코드를 시도했다.

UISplitViewController *oldviewcontroller= (UISplitViewController*) myappdelegate.window.rootViewController; 
for (UIViewController *child in oldviewcontroller.viewControllers) 
{ 
    [child release]; 
} 

//Setting the navigation controller as window.rootviewController again in here. 

이 코드가 없다는 오류 던져

내가 때문에 이미보기를 해제의 생각 "[UIImageView에 __viewDidDisappear이 :] 알 수없는 선택기 인스턴스 0x7d ....로 전송"을, viewdidDisappear에 아무런 이미지 뷰가 없다 행사.

간단히 말해서, 내 질문은 내가 이것을 달성하는 올바른 방법을 사용하고 있습니까? 그렇다면 어떻게 모든 하위보기 컨트롤러를 성공적으로 릴리스 할 수 있습니까?

+0

어떻게 이미지 뷰에 viewDid가 사라질 수 있습니까? 그것을 (viewDidDisappear) UIImageView에서 실수로 호출하고 있습니까? 윈도우의 rootviewController가 마스터 viewController 역할을하는 일반 uiviewcontroller이고 요구 사항에 따라 splitVC 및 navVC를 모달로 표시하면 어떻게됩니까? –

+0

apple docs는 splitVC를 모달로 표시 할 수 없다고 말합니다. 그래서 나는 이것이 해결책이 아니라고 생각합니다. 당신을 비평 해 주셔서 감사합니다. – bselvan

답변

2

나는 마침내 길을 발견했다. 나는 아마 그 오류를 발견했다. 내가 한 일은 내가 앉아있는 지부를 자르는 것입니다. 나는 현재보기 컨트롤러를 공개했다 :) viewdidDisappear 호출 할 때 해당보기 컨트롤러가 없습니다. 내가 이미 우주에 던져 버리기 때문에. 저 아래는 내 작업 단계 야. 누군가에게 도움이되기를 바랍니다. 하지만 애플이 내 앱을 거부 할지도 모른다고 생각하지 않는다. 나는 적당한 길을 찾고 싶다.

이것은 분할보기 컨트롤러와 탐색 컨트롤러를 윈도우 루트보기 컨트롤러로 번갈아 사용하는 궁극적 인 방법입니다.

먼저 AppDelegate 인터페이스에서 NavigationController 및 SplitViewController 속성을 정의했습니다.

AppDelegate.h 
@property (assign,nonatomic) UINavigationController * NC; 
@property (assign,nonatomic) UISplitViewController *SVC; 

두 번째로 새로 만든 NC를 AppDelegate didFinishLaunch 이벤트에 할당합니다.

AppDelegate.m 
//Creating my main screen controller 
//Creating my navigation controller with my view controller instance. Then 
self.NC= my_navigation_controller; 
self.window.rootViewController= self.NC; 

은 셋째 splitview 컨트롤러 만들기 넷째 SVC의 상세보기의 viewDidLoad 이벤트 않는 NC 해제 응용 프로그램의 루트 뷰 컨트롤러

MyMainScreen.m 
-(void) OpenSplit() 
{ 
     //Creating my master view controller of SVC 
     //Creating my detail view controller of SVC 
     //Creating my SVC; 
     AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate]; 
     app_delegate.SVC= newly created my SVC; 
     app_delegate.window.rootViewController= app_delegate.SVC;   
} 

으로 설정.

MyDetailView.m 
- (void) viewDidLoad() 
{ 
    ... 
    AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate]; 
    app_delegate.NC= nil; //i dont need it now. i am releasing. Releasing Navigation Controller release as well child controllers. I learned with testing. 
} 

다섯 번째보기 닫기 분할보기 기능. DetailBase의 NavigationBar에서 UIBarButton을 사용했습니다.

MyDetailView.m 
-(void) closeSplitView 
{ 
    //Creating navigation controller with my main screen view controller 
    AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate]; 
    app_delegate.NC= newly_created_NC; 
    app_delegate.window.rootViewController= appdelegate.NC; 
} 

여섯 번째로 메인 화면의 viewDidLoad 이벤트에서 사용되지 않은 분할 뷰 컨트롤러를 처리합니다.

MyMainScreen.m 
-(void) viewDidLoad 
{ 
    AppDelegate * app_delegate= [[UIApplication sharedApplication] delegate]; 
    app_delegate.SVC= nil; //I am releasing it because i am working with NC now. 
} 
관련 문제