1

私のiPhoneアプリには次の構造があります

AppDelegate / UITabBarController / 5 つの UINavigationControllers(マイ タブ) / UIViewController(各 UINavigationController の rootViewController など)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    HomeViewController *homeViewController = [[HomeViewController alloc] init];
    GoalsTableViewController *goalsTableViewController = [[GoalsTableViewController alloc] init];
    HistoryViewController *historyViewController = [[HistoryViewController alloc] init];
    SettingsViewController *settingsViewController = [[SettingsViewController alloc] init];
    InfoViewController *infoViewController = [[InfoViewController alloc] init];

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.delegate = self;

    self.navBarActivity = [[UINavigationController alloc] initWithRootViewController:homeViewController];

    self.navBarSettings = [[UINavigationController alloc] initWithRootViewController:settingsViewController];

    self.navBarHistory = [[UINavigationController alloc] initWithRootViewController:historyViewController];

    self.navBarGoals = [[UINavigationController alloc] initWithRootViewController:goalsTableViewController];

    self.navBarAbout = [[UINavigationController alloc] initWithRootViewController:infoViewController];

    self.tabBarController.viewControllers = [NSArray arrayWithObjects:self.navBarActivity, self.navBarGoals, self.navBarHistory,self.navBarSettings, self.navBarAbout, nil];

    self.window.rootViewController =  self.tabBarController;
    [self.window makeKeyAndVisible];

    return YES;

}

一部の UIViewController では、メールを送信するために MFMailComposeViewController を実装しました。

奇妙な問題を実験しました(シミュレーターと実際のデバイスiOS 5.0および5.1で再現)...

iPhone シミュレーター (iOS 5.0 または 5.1 のみ) を使用して、画面上で MFMailComposerViewController モーダルが開いているときにメモリ不足の警告をシミュレートし、[キャンセル] をタップしてから、[削除] をタップし、[下書きを保存] をタップすると、モーダルが親ビューで閉じられます。見えないようです (空白のビュー)。

同じ手順に従うが、メモリ不足の警告をシミュレートした後、MFMailComposeViewController モーダルから電子メールを送信すると、ライフ サイクルは正常に機能しているように見えます。モーダルが閉じられると、親ビューは正常に見えます。

親ビューがメモリ警告でアンロードされないようにする方法はありますか?


編集1

ビューをアンロードしてカムバックし、viewdidload(ライフサイクル)内の最後のビューに入った後、タブバーがナビゲーションビューを挿入していません。tabBar のサブビューを確認します。

UITransitionView
   ==><UIViewControllerWrapperView>
       ==> empty
<UITabBar>

viewdidload にサブビューとして追加して、navigationBar のビューを再統合しました。

    UIView *tabBarControllerWrapperView = [[[self.tabBarController.view.subviews objectAtIndex:0] subviews] objectAtIndex:0];

    // tabBar UIViewControllerWrapperView has not views
    if([tabBarControllerWrapperView.subviews count] == 0)
    {
         // add navigationbar view
         [tabBarControllerWrapperView addSubview:self.navigationController.view];
    }

それを修正するより良い方法はありません、何か考えはありますか?

4

1 に答える 1

0

目に見えないコントローラーで viewDidUnload (iOS <= 5) と呼ばれるメモリ警告が発生した後。あなたの場合、モーダルメールコンポーザーを提示したコントローラーのビューはおそらくアンロードされました。

viewDidUnload の背後にある考え方は、viewDidLoad が再度呼び出されたときにビューを復元するために必要なデータを保存するというものです。覚えておく必要があるのは、viewDidLoad を複数回呼び出すことができるということです。

iOS6 では viewDidUnload が呼び出されなくなったため、このロジックを didReceiveMemoryWarning に移動する必要があります。

于 2013-01-15T21:52:03.030 に答える