Ios 交替使用拆分视图控制器和导航控制器作为窗口根视图控制器

Ios 交替使用拆分视图控制器和导航控制器作为窗口根视图控制器,ios,uinavigationcontroller,uisplitviewcontroller,ipad,Ios,Uinavigationcontroller,Uisplitviewcontroller,Ipad,我有一个导航控制器,它是我的应用程序的根视图控制器。这是我的主屏幕。我有一个拆分视图控制器,其主视图列出位置,而详细视图显示地图上的位置。我想将拆分视图控制器推送到导航控制器,但它抛出了一个错误,表示拆分视图控制器不能推送到导航控制器,它必须是应用程序的根视图控制器。 所以我尝试了一个艰难的方法 MyAppDelegate *myappdelegate= [[UIApplication sharedApplication] delegate]; UISplitViewController * v

我有一个导航控制器,它是我的应用程序的根视图控制器。这是我的主屏幕。我有一个拆分视图控制器,其主视图列出位置,而详细视图显示地图上的位置。我想将拆分视图控制器推送到导航控制器,但它抛出了一个错误,表示拆分视图控制器不能推送到导航控制器,它必须是应用程序的根视图控制器。 所以我尝试了一个艰难的方法

MyAppDelegate *myappdelegate= [[UIApplication sharedApplication] delegate];
UISplitViewController * vc= [[UISplitViewController alloc] init];
vs.viewControllers = [NSArray arraywithObjects......
....
myappdelegate.window.rootViewController= vc;
这很有效。它按预期显示没有动画的分割视图控制器。我在关闭“拆分视图控制器”时也执行了相同的步骤。我正在创建一个带有主屏幕nib的导航控制器,并再次设置我的应用程序代理的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\uu ViewDidDemouse:]:发送到实例0x7d的选择器无法识别…”

我认为由于已经发布了视图,ViewDidDemouse事件上没有imageview


简言之,我的问题是,我是否使用正确的方法来实现这一目标?如果是这样,我如何才能成功释放所有子视图控制器?

我终于找到了一种方法。我可能发现了错误。我所做的就是砍掉我坐的树枝。我正在释放我当前所在的视图控制器:)调用ViewDidDemouse时,没有这样的视图控制器。因为我已经把它扔到太空了。下面是我的工作步骤。我希望它对某人有用。但我无法忍受苹果可能会拒绝我的应用。我希望找到一个合适的方法

这是我交替使用拆分视图控制器和导航控制器作为窗口根视图控制器的最终工作方式。

首先,我在AppDelegate接口中定义了NavigationController和SplitViewController属性

AppDelegate.h
@property (assign,nonatomic) UINavigationController * NC;
@property (assign,nonatomic) UISplitViewController *SVC;
其次,我在AppDelegate didFinishLaunch事件上分配新创建的NC

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控制器并设置为应用程序的根视图控制器

 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;          
 }
第四,在SVC详细视图的viewDidLoad事件中释放未使用的NC

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.
}   
第五,管理关闭拆分视图功能。我在DetailView中使用了导航栏上的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.
 }

您的imageview如何拥有视图?您是不是在UIImageView上专门错误地将其命名为(viewdidegase)?如果您的窗口的rootviewController是一个普通的uiviewcontroller,充当主viewController,并且您根据自己的要求以模式显示splitVC和navVC,该怎么办?苹果文档称splitVC不能以模式显示。所以我认为这不是一个解决方案。谢谢你的评论。