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イベントにimageviewがないようです。

簡単に言えば、私の質問は、これを達成するために正しい方法を使用しているということですか?もしそうなら、どうすればすべての子ビューコントローラを正常に解放できますか?

4

1 に答える 1

2

私はついに道を見つけました。私はおそらくエラーを見つけました。私がやったことは、私が座っている枝を切ることです。現在使用しているViewControllerをリリースしていました:)viewdidDisappearが呼び出されたとき、そのようなViewControllerはありません。私はすでにそれを宇宙に捨てているので。以下は私の作業手順です。誰かのお役に立てば幸いです。しかし、私はアップルが私のアプリを拒否するかもしれないと考えて我慢できません。適切な方法を見つけたいと思います。

これは、分割ビューコントローラーとナビゲーションコントローラーをウィンドウルートビューコントローラーとして交互に使用する私の究極の方法です。

まず、AppDelegateインターフェイスでNavigationControllerプロパティとSplitViewControllerプロパティを定義しました。

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

次に、AppDelegatedidFinishLaunchイベントで新しく作成された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;

第三に、スプリットビューコントローラーを作成し、アプリのルートビューコントローラーとして設定します

 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;          
 }

4番目に、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.
}   

5番目にクローズスプリットビュー機能を管理します。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;
} 

6番目にメイン画面の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.
 }
于 2012-12-04T00:07:56.880 に答える