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;

}

在一些 UIViewControllers 中,我实现了一个 MFMailComposeViewController 来发送电子邮件。

我实验了一个奇怪的问题(在模拟器和真实设备 iOS 5.0 和 5.1 上重现)...

使用 iPhone 模拟器(仅限 iOS 5.0 或 5.1),如果我在屏幕上打开 MFMailComposerViewController 模式时模拟内存不足警告,然后点击取消,然后点击删除|保存草稿,当模式被关闭时,父视图似乎不可见(空白视图)。

生命周期似乎工作正常,如果我按照相同的步骤但在模拟内存不足警告后我从 MFMailComposeViewController 模态发送电子邮件,当模态被解除时,我的父视图看起来很好。

有什么建议可以防止我的父视图在内存警告中被卸载吗?


编辑1

我弄清楚发生了什么,在卸载并返回视图并进入 viewdidload(生命周期)中的最后一个视图后,tabBar 没有插入导航视图。我检查 tabBar 的子视图:

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

我通过在 viewdidload 中添加子视图重新集成了导航栏的视图:

    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 回答