0

私のアプリにはタブバーコントローラがあり、タブアイテムの1つはスプリットビューコントローラです。マスタービューコントローラ(つまり、インデックス0)は、カスタムナビゲーションバーのため、ペン先からロードされたナビゲーションコントローラです。メモリ不足の警告が表示されるのはなぜですか?

これはちょっとあいまいですが、1)IBのTBCにSVCを追加できない、2)iOS 4.2 splitview-navbar-colorTintバグの組み合わせになります。そして、実際には、昨日回避策を実装して以来、私はメモリ不足の警告で問題が発生しています。

回避策の前に、私は2つのnavコントローラを使ってSVCを組み込み、TBCにプログラム的に(IBのタブバーによる制限のために)、問題がなくても問題なく - よく、そのリンゴのバグを除いていました。

小さなworkaround demoもメモリ不足の警告があっても正常に動作します。ただし、タブバーのオーバーヘッドが増えることはありません。

しかし、my adaption of the workaround demoではすべてが梨の形になり始めます。スプリットビューを表示している間にメモリ不足の警告を送信すると、左側(マスタービュー)全体が消えます。デバイス上での動作が同じで、実際には最初にそれを発見しました。

私は何が起こっているのか困惑しています。表示されるビュー(nav contのルートビュー)は、テーブルビューサブクラスによって制御されます。私はdidReceiveMemoryWarningをオーバーライドしましたが、それは助けになりません。さらに(対応して!)、スーパービューはゼロではありません。それはUITableViewです。完璧に正しい。

だから、私はnavコントローラがリリースされていると思っていますか?しかしここで?元のデモではなぜですか?違いは、私のタブバーコントローラの追加です。タブバーに追加するコードは次のとおりです。

- (void) addTabItemSplitViewWithNavConRoot:(BOOL)hasRootNC { 

    // init master/detail views 
    SV1RootViewController *rvc = [[SV1RootViewController alloc] initWithNibName:@"SVC1RootView" bundle:nil]; 
    SV1DetailViewController *dvc = [[SV1DetailViewController alloc] initWithNibName:@"SVC1DetailView" bundle:nil]; 

    rvc.detailViewController = dvc; 

    UINavigationController *nc = nil; 
    if (hasRootNC) { 
     nc = [self.pSVC1.viewControllers objectAtIndex:0]; 
     nc.viewControllers = [NSArray arrayWithObjects:rvc, nil]; 
     nc.navigationBar.tintColor = [UIColor redColor]; 
    } else { 
     nc = nil; 
    } 

    UIViewController *vc = (hasRootNC)? (UIViewController*)nc :rvc; 

    UISplitViewController *svc = [self newSplitViewControllerWithMasterVC:vc detailVC:dvc]; 
    svc.delegate = dvc; 

    // init the tab bar item 
    svc.tabBarItem = [[UITabBarItem alloc] initWithTitle:(hasRootNC)? @"SplitView with Nav Root":@"Simple SplitView" 
                image:nil 
                tag:0];  
    // int the split view 
    NSMutableArray *controllersArray = [NSMutableArray arrayWithArray:self.pTabBarController.viewControllers]; 
    [controllersArray addObject:svc]; 
    [self.pTabBarController setViewControllers:controllersArray]; 

    // cleanup 
    [nc release]; 
    [rvc release]; 
    [dvc release]; 
    [svc release]; 
} 

- (UISplitViewController*) newSplitViewControllerWithMasterVC:(UIViewController*)masterView 
                detailVC:(UIViewController*)detailView { 

    UISplitViewController *svc = [[UISplitViewController alloc] init]; 
    NSMutableArray *controllersArray = [NSMutableArray arrayWithObjects:masterView, detailView, nil]; 
    [svc setViewControllers:controllersArray]; 

    return svc; 
} 

私のためにアイデアはありますか? :)

それは私を狂ってしまう!

+0

コードを再フォーマットしてください。 – Joe

答えて

1

解決済みです。スプリットビューコントローラをプログラム的に初期化するという厄介なミックスではなく、メインウィンドウxibから読み込まれたnavコントローラを注入する(すべてがAppleのバグに必要なカスタムツールバーのため)。しかし、私の推測では、xibのnavコントローラがビューをアンロードしていたということです。

これで、手作業で構築するのではなく、ペン先からSVC全体を取得するだけです。実際にははるかに簡単で、はるかに単純です。

ああ男。私はan answer to this question( '指定された'答え!)によって迷子になった。私は今、このもっと単純な方法も答えとして与えられ、実際には最も人気があることに気づいた。それを完全に見落とした! ^^

+0

感謝します!私はまったく同じ問題で狂っていた。 IBを使って物事を整理するとすぐに、物事はうまくいくようになりました。 –

0

すべてのコードを見ることなく、私は非アクティブなビューがmem警告中に破棄されたと推測しています。 ( 'didReceiveMemoryWarning'というコードのビット)

loadViewメソッドでは、追加する必要があるサブビューがすべてビューに再追加されていることを確認する必要があります。それに応じてレイアウトされます。希望が役立ちます。

あなたが急いでいるか怠け者である場合は、すべての通常のことが起こらないようにしてください。これは悪い可能性があり、クラッシュを引き起こす可能性がありますが、あなたが気をつけている場合は別の方法です。

- (void)didReceiveMemoryWarning { 
    //do nothing 
    //[super didReceiveMemoryWarning]; 
} 
+0

私は "私はdidReceiveMemoryWarningをオーバーライドしましたが、それは助けにはならないと書いています。さらに(対応して!)、スーパービューは無しではありません、それはUITableViewです。私は明示的に言っていませんでしたが、はい、msgをスーパーに削除しました。 – Rich

+0

loadViewの外観はどうですか?そして、あなたはデータソース/デリゲートからそこにUITableViewをリロードしようとすることができますか? [self.tableView reloadData]のようなもの? –

+0

Hm ..ビューは(SV1RootViewController *)rvcに属するnib SVC1RootViewからロードされます。次に、rvcは、(UINavigationController *)nc.viewControllersに書き込まれます。これは、tabBarItemに割り当てられたSplit View Controllerの初期化に使用され、MainWindow.xibのタブバーコントローラに追加され、呼び出し後すぐにウィンドウに追加されます上記の方法。だから私はloadViewを直接フックする必要はありません。それとも、私は? – Rich