我有一个导航控制器,它是我的应用程序的根视图控制器。这是我的主屏幕。我有一个拆分视图控制器,其主视图列出位置和详细视图显示地图上的位置。我想将拆分视图控制器推送到导航控制器,但它会抛出错误,说拆分视图控制器无法推送到导航控制器,它必须是应用程序的根视图控制器。 所以我努力了。
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事件没有imageview。
简而言之,我的问题是我使用正确的方法来实现这一目标吗?如果是这样,我如何成功释放所有子视图控制器?
答案 0 :(得分: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控制器并设置为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.
}