0

我的應用程序有一個標籤欄控制器,其中一個標籤項是一個分離視圖控制器。它是主視圖控制器(即在索引0處)是一個從nib加載的導航控制器,由於它是自定義導航欄。爲什麼我的視圖在低內存警告中消失?

如果這聽起來有點模糊,那麼它的組合如下:1)無法將SVC添加到IB的TBC中; 2)iOS 4.2 splitview-navbar-colorTint錯誤。事實上,自從昨天實施解決方案以來,我一直在遇到低內存警告的問題。

解決方法之前我用2個導航控制器初始化SVC並以編程方式將其添加到TBC(由於IB對th標籤欄的限制)並且沒有問題 - 除了那個蘋果錯誤。

workaround demo也工作正常,即使在低內存警告後。但它不涉及標籤欄的額外開銷。

但在my adaption of the workaround demo它開始全部變成梨形。發出低存儲器警告,同時顯示分割視圖,整個左側(主視圖)消失。設備上的行爲完全相同,實際上我最初在那裏發現它。

我很困惑發生了什麼事。顯示的視圖(nav cont的根視圖)由表視圖子類控制。我重寫了didReceiveMemoryWarning,但這並沒有幫助。此外(相應地!),超級觀點不是零。這是一個UITableView。完全正確。

所以,我在想導航控制器正在發佈?但是哪裏?爲什麼不在原始演示中?現在的區別是添加了我的標籤欄控制器。這是我的代碼,將其添加到標籤欄:

- (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 2011-01-20 18:59:12

回答

1

解決了它。對於那種用編程方式初始化分割視圖控制器的奇妙組合,卻用從主窗口xib中讀取的導航控制器注入(所有這些都是因爲Apple bug需要自定義工具欄)。但我的猜測是,來自xib的導航控制器正在卸載視圖。

所以現在我只需從筆尖取整個SVC,而不是手動構建它。實際上更整潔,更簡單。

哦,夥計。我被an answer to this question('指定'答案!)帶入歧途。我現在剛剛注意到,這個更簡單的方法也作爲答案給出,實際上是最流行的方法。完全忽略它! ^^

0

沒有看到所有的代碼,我猜在mem警告期間,非活動視圖被破壞。 (代碼中說'didReceiveMemoryWarning',你可能有[超級didReceiveMemoryWarning])

你需要確保在你的loadView方法中,需要添加的任何子視圖都被重新添加到視圖中,並且相應地放下。希望有所幫助。

或者,如果您處於急於或懶惰狀態,只是防止所有常見事情發生。這可能很糟糕,可能會導致崩潰,但如果您不耐煩,這是一種替代方法。

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

正如我寫道:「我重寫了didReceiveMemoryWarning,但這並沒有幫助。此外(相應地!),超級視圖不是零,它是一個UITableView,正確如此。我沒有明確地說,但是,我確實刪除了味精超級。 – Rich 2011-01-20 19:11:12

+0

loadView看起來像什麼?你可以嘗試從數據源/代理重新加載UITableView嗎?像[self.tableView reloadData]? – 2011-01-20 19:24:37