2011-06-03 21 views
0

嘿所有...我有一個視圖控制器(A),它的一些動作,分配init的另一個視圖控制器(B),然後將B的觀點,以它作爲一個子視圖視圖。所以現在ViewController B的視圖是ViewController A的一個子視圖。我遇到的問題是如果我簡單地從A中刪除B的視圖,它似乎仍然堅持例如。視圖B包含一個Web視圖,當我在視圖上加載視頻時,即使從視圖中刪除視圖後控制器A的視圖仍然可以聽到視頻?在播放視頻時摧毀包含UIWebView的uiviewcontroller?

我怎麼能滅的ViewController B和從A刪除其子視圖?我發現這個棘手,因爲我真的沒有把它推到導航控制器的堆棧上,我可以從中彈出...我希望這是有道理的,如果不是請說,我會嘗試澄清。

非常感謝

-(void)showNewsWebView:(int)index { 

NewsWebViewController *myWebView = [[[NewsWebViewController alloc] initWithNibName:@"NewsWebViewController" bundle:nil]autorelease]; 

//setup webview with request etc 

[[self.view.superview superview] addSubview:myWebView.view]; 
myWebView.alpha = 0. 
[UIView beginAnimations:@"test" context:nil]; 
[UIView setAnimationDuration:.3]; 
myWebView.view.alpha = 1.; 
[UIView commitAnimations]; 

} 

//called after delegate callback from webviewcontroller 
- (void)newsWebViewDismissedView:(NewsWebViewController *)controller { 
[UIView beginAnimations:@"test" context:nil]; 
[UIView setAnimationDuration:.3]; 
controller.view.alpha = 0.0; 
[self performSelector:@selector(removeView:) withObject:controller.view afterDelay:.5]; 

[UIView commitAnimations]; 
} 

-(void) removeView:(UIView *)view { 
[view removeFromSuperview]; 
view = nil; 
} 
+0

請提供簡化的代碼。哎呀,爲什麼你不是在推擠和彈出? – 2011-06-03 21:35:27

回答

1

不ViewController中乙真正需要的是一個視圖控制器可能是一個簡單的解決方案?

如果要添加子視圖你應該具有B-子類的UIView不是UIViewController中。將B的視圖添加爲子視圖基本上否定了B作爲ViewController的優點。

反正回答你的問題。您可能想讓viewcontroller B成爲A的ivar,這樣viewcontroller A就可以管理viewController B的內存。一旦從A中刪除了B的視圖,您可以從內存中釋放viewcontroller B(我仍然不支持它,因爲它聽起來像無效代碼,你或許應該說明你的目標是什麼什麼,並張貼一些代碼爲你怎麼做的,所以我們可以更好地幫助你了:))

編輯:

從你的代碼看起來像你應該推動和彈出。你使用MyWebViewController只是爲了顯示一個網頁?使用簡單的UIWebView可能會更好。

我也注意到一些錯誤設置阿爾法爲0。您的動畫代碼如果希望在動畫結束時,你應該使用下面的代碼來執行一些方法:

//called after delegate callback from webviewcontroller 
- (void)newsWebViewDismissedView:(NewsWebViewController *)controller { 
[UIView beginAnimations:@"test" context:nil]; 
[UIView setAnimationDuration:.3]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(removeView)]; 

controller.view.alpha = 0.0; 

[UIView commitAnimations]; 
} 
+0

感謝您的答覆,請參閱上面的代碼。我想你可能是正確的需要B成爲一個視圖控制器。 – Jules 2011-06-03 22:50:32

+0

我剛剛在這裏寫了評論,但它消失了?!無論如何,感謝您在setAnimationdidStopSelector上的提示......我會使用它。我的WebController不只是顯示一個webview,有控制在那裏共享,電子郵件,喜歡和關閉頁面,所以不能真正顯示一個webview。我嘗試將WebController設置爲ivar,並在刪除視圖時將其釋放,但這不起作用,視頻只是繼續播放!! ??很奇怪。任何其他想法?再次感謝迄今爲止的幫助。 – Jules 2011-06-03 23:32:32

+0

嗯....你仍然可以用子類UIView做這些事情。這不應該那麼困難。除此之外,我不知道這裏發生了什麼。我確實有一個解決方案(說實話,我覺得它很糟糕,因爲它會導致內存泄漏)。根據你有多麼絕望地停止播放視頻,你可以實現下面的方法。 UIWebView允許您使用loadHTMLString加載本地HTML字符串http://developer.apple.com/library/ios/documentation/uikit/reference/UIWebView_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006950-CH3 -SW10 – Sid 2011-06-03 23:51:59

0
ViewControllerB *vc = [[[ViewControllerB alloc] initWithNibName:@"SomeNib" bundle:nil] autorelease]; 

這應該做的伎倆。在初始分配結束時自動釋放視圖控制器應該告訴應用程序在從viewcontroller A中刪除視圖後將其釋放,因爲沒有其他東西在其上持有保留值。雖然使用導航器,如果你願意返工你的代碼來推動和流行的看法,而不是

+0

嗨,感謝您的回覆,我已經嘗試過使用autorelease,但是我馬上得到了錯誤的訪問權限......我會在原始問題中發佈一些代碼,以便您可以看到發生了什麼。非常感謝。 – Jules 2011-06-03 22:40:30

+0

在這種情況下,我只希望建立一個變量在頭文件'的UIViewController * vcB'所以你創建你的第二個視圖 - 控制後,把'VCB = myWebView;'。然後,當你想擺脫視圖,請調用'[vcB.view removeFromSuperview];''和'[vcB發佈];' – justin 2011-06-04 00:15:50

+0

哈哈我已經嘗試了確切的事情,我仍然無法訪問。不知道該去哪裏...我甚至在這裏發佈了另一個問題。http://stackoverflow.com/questions/6267425/memory-bad-access – Jules 2011-06-07 15:41:21