0

任何幫助表示讚賞!這幾天我正在與沒有結果的戰鬥。內存警告後遞歸調用中的UISpliviewcontroller失敗

場景:

我和iPad應用程序中有SplitViewController顯示2個controllersViews(在右側位置e詳細根)

根允許遞歸導航(樹,可能是幾個明細級別),我每次調用同一個控制器類(UITableView)始終在控制器堆棧中進行調用)。當用戶點擊一個單元格時(左側),詳細視圖(右側)顯示該信息。 請記住,詳細視圖控制器並不總是相同的類:這意味着我要根據必須顯示的信息種類以編程方式分配(和釋放)幾個detailView控制器。

這裏的片段:直到內存警告出現

UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil]; 

//the detailViewController has been defined in the head section as ItemGenericViewController 

//each detailViewController is a subclass of ItemGenericViewController 

detailViewController = newDetailViewController; 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController]; 

// Update the split view controller's view controllers array. 

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil]; 
self.splitViewController.viewControllers = viewControllers; 
[nav release]; 
[viewControllers release]; 
[detailViewController release]; 

一切工作正常。

從那一刻起,如果我嘗試顯示一個新的detailViewcontroller,SplitViewController中的RootController和detailController之間的「連接」似乎消失了。結果是:在splitController的右側沒有任何內容出現。 同時,如果我導航到根控制器中的父級別,情況仍然失敗。

每次我在棧中推入一個新的RootController實例(左列)時,我釋放相同的控制器(以節省內存像往常一樣),我懷疑,收到內存警告後,iOS正試圖釋放自己的記憶和我的「歷史」消失,並通過分離控制器也可以實現相關連接。

是一場噩夢;-)

你有什麼建議嗎?

感謝

達里奧

回答

1

我有一個類似的問題給你(甚至更糟 - 可能視交換機的16種組合)......但我相信我已經解決了它現在。所以,我相信你已經使用Apple的視圖切換的例子(我有,修改),如果你有這樣的問題是,「根」splitViewController(從MainWindow.xib)得到的「niled」作爲默認行爲當有記憶警告時。即使你添加了新的視圖控制器陣列,它也不會引起任何改變(甚至更糟糕的是,它不會顯示任何警告信號)。解決辦法是檢查是否爲零,如果是,則重新初始化它。

這裏是代碼,使用從上面的例子:

UIViewController <ItemGenericViewController> *newDetailViewController = [[NSClassFromString(cntrClass) alloc] initWithNibName:cntrXib bundle:nil]; 

//the detailViewController has been defined in the head section as ItemGenericViewController 

//each detailViewController is a subclass of ItemGenericViewController 

detailViewController = newDetailViewController; 
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:detailViewController]; 

// Update the split view controller's view controllers array. 

NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, nav, nil]; 

/**** Milos Edit ****/ 
if (self.splitViewController == nil) { 
    // I'm keeping reference in app delegate, but any way to reinitialize splitViewController is OK 
    self.splitViewController = delegate.splitViewController; 
} 
/**** end of edit ****/ 
self.splitViewController.viewControllers = viewControllers; 
[nav release]; 
[viewControllers release]; 
[detailViewController release]; 

希望這會有所幫助。

乾杯

米洛斯

+0

我想你回答,如果你提供的代碼示例會更有幫助。 – 2011-05-10 22:33:54

+0

當然沒問題(正如你所看到的,有史以來的第一條評論,所以......)。在這裏,使用上面的代碼: – Milos 2011-05-11 08:17:06