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

Posted

技术标签:

【中文标题】交替使用拆分视图控制器和导航控制器作为窗口根视图控制器【英文标题】:Using Split View Controller and Navigation Controller As Window Root View Controller Alternately 【发布时间】:2012-12-03 14:57:58 【问题描述】:

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

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:]: unrecognized selector sent to instance 0x7d....”

我认为由于已经释放视图,因此 viewdidDisappear 事件上没有图像视图。

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

【问题讨论】:

你的imageview怎么会有viewDidDisappear?您是否错误地专门在 UIImageView 上调用它(viewDidDisappear)?如果你的窗口的 rootviewController 是一个普通的 uiviewcontroller 作为主视图控制器,并且你根据你的要求以模态方式显示你的 splitVC 和 navVC 怎么办? 苹果文档说 splitVC 不能以模态方式呈现。所以我认为这不是一个解决方案。谢谢你的评论。 【参考方案1】:

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

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

首先我在 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控制器并设置为app的根视图控制器

 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的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.
 

【讨论】:

以上是关于交替使用拆分视图控制器和导航控制器作为窗口根视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将 segue 添加到拆分视图控制器

如何在窗口中添加视图,该视图将在每个视图控制器的滑动时显示?

更改 iOS 窗口的根视图控制器

更改根视图控制器不会释放同一窗口上的先前视图控制器

如何将一个导航控制器转换为拆分视图控制器

返回导航到根视图控制器后,折叠的大标题导航栏变得展开