2012-10-16 27 views
0

我面臨的問題在iOS 6的iPad的iOS6的UIViewControllerHierarchyInconsistency上的按鈕進行點擊

  1. 在點擊按鈕 - >開酥料餅與UITable
  2. 在選擇行 - > modalviewcontroller開放。
  3. 駁回modalviewcontroller(正常工作)
  4. 然後再次點擊按鈕,按鈕點擊應用程序崩潰(第一步)

這個問題只在iOS的6,工作正常的iOS 5,iOS版4.3

*** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'A view can only be associated with at most one view controller at a time! View <UITableView: 0xb847400; frame = (0 0; 185 104); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xa469e50>; layer = <CALayer: 0xa469f00>; contentOffset: {0, 0}> is associated with <UIViewController: 0xa462f60>. Clear this association before associating this view with <UIViewController: 0xa5dac40>.' 
*** First throw call stack: 
(0x2769012 0x1d0be7e 0x2768deb 0xca1309 0xd385ac 0xd34a90 0x69b19 0x1d1f705 0xc56920 0xc568b8 0xd17671 0xd17bcf 0xd16d38 0xc8633f 0xc86552 0xc643aa 0xc55cf8 0x29a2df9 0x29a2ad0 0x26debf5 0x26de962 0x270fbb6 0x270ef44 0x270ee1b 0x29a17e3 0x29a1668 0xc5365c 0x24ca 0x23d5) 
libc++abi.dylib: terminate called throwing an exception 

添加代碼

listTable.frame = CGRectMake(0, 0, listWidth, listItemHeight*[listArray count]-1); 
UIViewController* popoverContent = [[UIViewController alloc] init]; 
popoverContent.view = listTable; 
popoverContent.contentSizeForViewInPopover = CGSizeMake(listWidth, listItemHeight*[listArray count]); 
listPopOver = [[UIPopoverController alloc] initWithContentViewController:popoverContent]; 
[listPopOver setDelegate:self]; 
[listPopOver setPopoverContentSize:listTable.frame.size]; 
[listPopOver presentPopoverFromRect:self.frame inView:self.superview permittedArrowDirections:arrowDirection animated:YES]; 
[listTable reloadData]; 
[popoverContent release]; 
+0

最有可能你正在發佈popover這是一個簡單的問題來解決你可以顯示代碼調用和解散popover? –

+0

添加代碼。 。 。 –

+0

我的代碼崩潰行'popoverContent.view = listTable;' –

回答

5

更加緊密地檢查你的例外:

'UIViewControllerHierarchyInconsistency', reason: 
'A view can only be associated with at most one view controller at a time! 
View UITableView: 0xb847400; frame = (0 0; 185 104); clipsToBounds = YES; 
autoresize = W+H; gestureRecognizers = NSArray: 0xa469e50; layer = CALayer: 0xa469f00; 
contentOffset: {0, 0} is associated with UIViewController: 0xa462f60. 
Clear this association before associating this view with UIViewController: 0xa5dac40.' 

具體做法是:

A view can only be associated with at most one view controller at a time! 
View UITableView: 0xb847400 
is associated with 
UIViewController: 0xa462f60. 
Clear this association before associating this view with 
UIViewController: 0xa5dac40. 

這意味着你有一個視圖控制器,它的.view屬性設置爲您listTable對象。然後,在不破壞該關聯的情況下,您將另一個視圖控制器並嘗試將其.view屬性設置爲listTable對象。這違反了視圖層次結構規則,蘋果在iOS 6.0中強制執行這些規則,直到它現在拋出異常並使應用程序崩潰。

所以這裏真正的問題是,您使用兩個視圖控制器相同的listTable對象,特別是popoverContent。這意味着當你的代碼第二次執行時,舊的popoverContent仍然存在,這就是爲什麼它在第二次運行時崩潰而不是第一次崩潰。我猜想你的代碼在新的嘗試創建之前不會完全釋放並銷燬舊的彈出窗口;如果你確定發生這種情況,你可能會很好。

我還注意到,顯然,你使用相同的listTable爲兩個彈出。你可能想爲每個popover懶惰地創建這個listTable而不是保持它?

如果您想調查更多內容,可以在代碼中設置斷點並使用po命令打印不同視圖和視圖控制器的描述,以查看哪些十六進制地址與隨後出現在例外,並獲得有關該問題的更多信息。或者,您甚至可以直接使用十六進制地址打印說明:例如po 0xa469e50(可能需要對其進行註釋)。

除此之外,你還沒有真正提供足夠的代碼讓別人看看它,並說出問題是什麼:)但上面應該可以幫助你解決這個問題。

+0

那麼,它的細節導向的答案,也檢查這一個。 http://stackoverflow.com/questions/11877264/uiviewcontrollerhierarchyinconsistency –

1

與其替換popoverContent的視圖,您可以將listTable作爲子視圖添加嗎?

不知道這是否會完全實現您正在尋找的內容,但它可能會避免層次不一致錯誤。