2012-12-03 149 views
2

我有一个导航控制器,它是我的应用程序的根视图控制器。这是我的主屏幕。我有一个拆分视图控制器,其主视图列出位置和详细信息视图,显示地图上的位置。我想将分割视图控制器推送到导航控制器,但是它会抛出一个错误,说分割视图控制器不能被推送到导航控制器,并且它必须是应用程序的根视图控制器。 所以我努力了。交替使用分割视图控制器和导航控制器作为窗口根视图控制器

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

This Works。它按预期显示没有动画的分割视图控制器。当我关闭分割视图控制器时,我会执行相同的步骤。我正在用主屏幕笔尖创建一个导航控制器,并再次设置我的应用程序委托的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没有的ImageView事件。

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

+0

你的imageview如何有一个viewDidDisappear?你是否错误地在UIImageView上调用它(viewDidDisappear)?如果你的窗口的rootviewController是一个普通的uiviewcontroller,它充当主viewController,并且根据你的需求显示你的splitVC和navVC模态? –

+0

apple文档说splitVC无法以模态呈现。所以我认为这不是一个解决方案。感谢您的评论。 – bselvan

回答

2

我终于找到了一种方法。我可能找到了错误。我所做的就是削减我所坐的分支。我正在释放视图控制器,我目前在:)当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控制器和设置为应用程序的根视图控制器

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. 
} 
相关问题