2010-11-19 85 views
0


感謝您的幫助,像往常一樣,我期待的一些詳細信息...iphone,瞭解視圖控制器,presentModalViewController

關於視圖控制器,我試圖發展與多個視圖的應用程序。從視圖A使用presentModalViewController

視圖控制器負載 - 和負載視圖B從那裏 - 也能正常工作,但我有一些惱人的問題...

觀中有一個表,它能夠深入查看B,然後我可以移回查看A usig dismissModalViewController,但是一旦回到視圖A中,我無法訪問視圖A中的表格。

當視圖B被按下時,視圖A中的控件/變量會發生什麼?是調用View B時調用的dealloc?如果我希望在視圖B被撤消並且視圖A重新回到視圖中時訪問控件/變量,我需要做什麼?

有沒有一些文章可以對此進行教育? 任何幫助,高度讚賞

再次重申

  • 視圖控制器從查看啓動頁X
  • 查看X負載 - 查看A,與表到使用presentModalViewController認爲
  • 表發佈在視圖A的dealloc
  • 視圖B加載罰款,工作正常 - 駁回視圖B控制器帶回視圖A
  • 在這一點上,我會喜歡E要重新加載在查看一個表,一旦它回來到屏幕

我敢肯定有很多其他的其他成員是誰在這種情況下

這裏是我的代碼,在比特和件

起始頁 - (這是應用程序的主頁)與啓動按鈕,包含

View Controller -> View 

在點擊開始按鈕,正在加載一個名爲ViewA視圖 - 控制(視圖控制器 - >查看),W第i個以下代碼

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil]; 
viewA.modalTransitionStyle=UIModalTransitionStyleCoverVertical; 
[naviControl presentModalViewController:viewA animated:YES];  
[viewA release]; 

論ViewA採摘表格行,另一個的ViewController ViewB(視圖控制器 - >查看)稱爲與follwoing代碼

UIViewController *viewB= [[viewB alloc] initWithNibName:@"viewB" bundle:nil]; 
viewB=UIModalTransitionStyleCoverVertical; 
[self viewB animated:YES]; 

ViewB被駁回並VIewA被示爲具有代碼

[self dismissModalViewControllerAnimated:YES]; 

在這一點上,與一些NSLogs,當ViewB被駁回,只有viewWillAppear中被稱爲上ViewA,不是viewDidLoad中,如果我嘗試重新加載在ViewA表數據中,應用crashses與EXC_BAD_ACCESS

由於 Veeru

+0

在我的情況下,如果視圖A有一個表,它能夠深入查看B,我想重新加載在視圖A表中的數據時查看B是解散..這是崩潰導致表不再有效。 – Veeru 2010-11-19 14:56:35

+0

當你說視圖A和視圖B時,你的意思是ViewController A和ViewController B?您無法以模態方式呈現視圖。 – kevboh 2010-11-19 15:44:50

+0

是的視圖A實際上是一個視圖控制器中的視圖和視圖B相同 - 所以基本上它們都是ViewControllers的權利? – Veeru 2010-11-19 16:15:14

回答

0

首先,請糾正以下語句:

UIViewController *viewA= [[viewA alloc] initWithNibName:@"viewA" bundle:nil]; 

UIViewController *viewA= [[UIViewController alloc] initWithNibName:@"viewA" bundle:nil]; 

其次,你需要了解視圖控制器,例如內存管理和流程

  1. 時分配然後視圖控制器與保留計數1中的存儲器被啓動的情況下,
  2. 當推或到屏幕上呈現該視圖控制器則其保留計數作爲現在變爲2的另一個實例導航控制器或視圖控制器正在使用您的實例,然後您釋放它,這會使您的視圖控制器實例的保留計數再次爲1,即減少1,(您必須知道,當保留計數變爲0時,只有它將從內存中釋放)。
  3. 然後你在這個當前視圖控制器的頂部調用了另一個視圖控制器,這使得它在後臺運行,並且因爲你沒有明確保留該實例,它會被你添加的導航控制器或視圖控制器釋放,所以其保留計數變爲0,因此從內存中釋放。
  4. 因此,當您嘗試重新加載tableview時,它會在您嘗試使用已釋放的實例時爲您提供EXC_BAD_ACCESS。

解決方案:

  1. 如果你想在你的應用程序中使用多個導航屏幕,你應該只使用的UINavigationController的pushViewController的方法是讓視圖 - 控制的情況下,直到你明確地釋放他們。

  2. 另外要小心使用本地實例或對象實例及其保留計數的,跟蹤ALLOC和釋放,即保留計數,除非你想他們應該不會是0。

希望這將有助於...

+0

嗨sanniv,感謝您花時間在視圖控制器上提供一些很好的見解,看起來像我有更多的閱讀要做。再次感謝 :) – Veeru 2010-11-25 02:01:09

0

當本的ViewController(VC)乙從VC甲一個模態(除非也許內存警告被髮送)它不應該的dealloc任何VC甲變量。如果你想重新加載駐留在VC A中的表數據,那麼你可以使用[UITableView reloadData]。你應該從viewDidAppear方法中調用它,因爲只要視圖返回到屏幕上就會調用它。希望這可以幫助!

ps ..用適當的表替換UITableView以重新加載。

+0

我以爲也一樣...但它沒有工作,我懷疑自從在模擬器中出現內存警告。我會再試一次,看看..其他建議? – Veeru 2010-11-19 17:12:12

+0

在代碼中放入一些NSLog語句(dealloc/etc)以查看它是否可能被調用。 – DerekH 2010-11-19 18:46:48

+0

我已經把一些NSLogs,並注意到以下 - ViewDidLoad不被稱爲當ViewB被解僱和看法A出現,只有ViewWillAppear被調用。如果我在這裏添加表格重新載入數據,它會與EXC_BAD_ACCESS一起崩潰。 viewDidLoad中被調用,只有當觀的第一次加載 的dealloc不會被調用一次 - 但仍表是無法訪問的 正在更新原來的職位與一些代碼 – Veeru 2010-11-20 00:35:37