タブ付きのアプリケーションテンプレートから作成したアプリケーションがあります。(ARC、iOS 4)
- いくつかのタブがあり、2。タブviewcontroller.view(ViewCont2)にボタンがあります。
- このボタンは、presentModalViewControllerメソッドによって別のviewcontrollerの(ModalViewCont)ビューをロードします。
- ModalViewContには、dismissModalViewControllerAnimatedを呼び出す閉じるボタンがあります。
- ViewCont2のviewDidDisappearで、ビューをアンロードするためにself.view = nilおよびその他のアウトレットをnilに設定しているので、次に画面に表示されたときにビューが新しくロードされます。これを行っているのは、ビューコントローラのいくつかの一般的なプロパティを初期化し、viewDidLoadメソッドにいくつかのボタンやラベルなどを追加する基本クラス(BaseViewCont)を継承しているためです。したがって、この基本クラスから継承するViewControllerは、viewDidLoadメソッドで必要に応じてこれらのプロパティを異なる方法で構成できます。
問題
これで、ModalViewContが画面に表示されているときに、ホームボタンを押してアプリケーションをバックグラウンドに戻し、アプリケーションを元に戻した後、ModalViewContを閉じると、ViewCont2のビューは返されませんが、下部にタブバーがある黒い画面になります。アプリケーションのバックグラウンド/フォアグラウンドを設定しなくても同じことが起こります。2.タブをタップする前に他のタブをタップした場合(編集:これは、viewDidDisappearではなくviewWillDisappearでself.viewがnilに設定されている場合にのみ発生します。)
ViewCont2が新しいビューをロードすると判断しました(参照を確認しました)が、ビューのスーパービューがnilであるため、新しいビューは表示されず、黒い画面が表示されます。
うまくいかなかったこと
- [self.viewremoveFromSuperview]を使用します。self.view = nilを設定する前に、
- viewWillAppearで、親にビューを追加します。[self.parentViewController.view addSubview:self.view]; これはスムーズに機能しませんでした。ビューは画面の少し上に配置されました。これは、階層に他のいくつかのスーパービューがあるためです。
私が検討したソリューション。
- 1-スーパービューがviewDidLoadでnilの場合、viewWillAppear (仮定)で使用可能になります。したがって、ViewCont2のviewWillAppearメソッドを使用して、次の方法でスーパービューを正しくロードできます。
_
if (self.view.superview == nil)
{
self.tabBarController.selectedViewController = nil;
self.tabBarController.selectedViewController = self;
}
- 2-基本クラスのviewWillAppearメソッドを代わりに初期化に使用できるため、ビューをアンロードする必要はありません。したがって、パフォーマンスを最適化することができ、ビューが消えるたびにアンロードされることはありません。また、フラグが表示されるたびに実行するのではなく、フラグをチェックして初期化を1回だけ実行することをお勧めします。
質問
- 1-スーパービューが復元されないのはなぜですか?私はそれのために何をすべきですか?(これは、代替案を試すのではなく、理解して解決したい主な問題です...)
- 2-アンロードするために表示するnilを割り当てることで、何か問題が発生していますか?もしそうなら、このような場合(タブ付きアプリケーション)にビューを適切にアンロードするにはどうすればよいですか?
- 3- 1.ソリューションに何か問題がありますか?応急修理のように見えますか?superviewとviewWillAppearに関するその仮定は正しいですか?
編集: viewDidLoadが必要以上に早く呼び出された場合(つまり、viewDidDisappearではなくviewWillDisappearでビューがnilledされた場合)、スーパービューが設定されていないようです。