【问题标题】:destroy uiviewcontroller containing UIWebView when playing video?播放视频时销毁包含 UIWebView 的 uiviewcontroller?
【发布时间】:2011-06-03 21:24:20
【问题描述】:

大家好...我有一个视图控制器 (A),它在某些操作中分配 init 是另一个视图控制器 (B),然后将 B 的视图作为子视图添加到其视图中。所以现在 ViewController B 的视图是 ViewController A 的子视图。我遇到的问题是,如果我只是从 A 中删除 B 的视图,它似乎仍然存在。视图 B 包含 Web 视图,当我在 webView 上加载视频时,即使从视图控制器 A 的视图中删除视图后,我仍然可以听到视频??

如何销毁视图控制器 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;
}

【问题讨论】:

  • 请提供简化代码。抛开这一点,你为什么不只是推动和弹出?

标签: iphone uiwebview uiviewcontroller


【解决方案1】:

ViewController B 真的需要成为 ViewController 吗?

如果您要添加子视图,您可能应该使用 B 子类 UIView 而不是 UIViewController。将 B 的视图添加为子视图本质上否定了 B 作为 ViewController 的任何优势。

无论如何回答你的问题。您可能希望使 viewcontroller B 成为 A 的 ivar,以便 viewcontroller A 可以管理 viewController B 的内存。从 A 中删除 B 的视图后,您可以从内存中释放 viewcontroller B(我仍然不支持它,因为它听起来像是无效的代码。您可能应该说明您的目标是做什么,并发布一些关于您如何做的代码,以便我们可以更好地帮助您:))

编辑:

从您的代码看来,您应该只是推动和弹出。您是否使用 MyWebViewController 只是为了显示网页?使用简单的 UIWebView 可能会更好。

我还注意到您的动画代码中将 alpha 设置为 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];
}

【讨论】:

  • 感谢您的回复,请参阅上面的代码。我认为你可能是正确的 B 需要成为一个视图控制器。
  • 我刚刚在这里写了一条评论,但它消失了?!无论如何,感谢有关 setAnimationdidStopSelector 的提示...我会使用它。我的 WebController 不只是显示一个 webview,那里有控件可以共享、发送电子邮件、喜欢和关闭页面,所以不能真的只显示一个 webview。我尝试将 WebController 设置为 ivar 并在删除视图时释放它,但这没有效果,视频只是继续播放!!??很奇怪。还有其他想法吗?再次感谢您迄今为止的帮助。
  • 嗯.... 你仍然可以使用子类 UIView 来做这些事情。它不应该那么困难。除此之外,我不知道这里发生了什么。我确实有一个解决方案(老实说,我觉得这很糟糕,因为它会导致内存泄漏)。根据您希望停止播放该视频的程度,您可以实施以下方法。 UIWebView 允许您使用 loadHTMLString developer.apple.com/library/ios/documentation/uikit/reference/… 加载本地 HTML 字符串
  • 使用简单的本地字符串,例如 。就在您要释放控制器 B 之前,加载该本地 HTML 字符串以使 webview 导航离开视频页面。这将停止播放视频。再次强调,这不是正确的解决方案。最好的解决方案是将 UIView 子类化,并将所有控件和 UIWebView 放在上面。在其他地方添加另一个视图控制器的视图作为子视图是根本错误的。
  • 我认为你关于添加另一个 VC 的观点是正确的,但它仍然让我对这个记忆的东西发疯。我在这里转发了。 stackoverflow.com/questions/6267425/memory-bad-access
【解决方案2】:
ViewControllerB *vc = [[[ViewControllerB alloc] initWithNibName:@"SomeNib" bundle:nil] autorelease];

这应该可以解决问题。在初始分配结束时自动释放视图控制器应该告诉应用程序在您从视图控制器 A 中删除视图后释放它,因为没有其他东西在其上持有保留值。虽然如果您愿意修改代码以推送和弹出视图,但使用导航控制器可能是一个更简单的解决方案

【讨论】:

  • 您好,感谢您的回复,我已经尝试使用自动释放,但我立即无法访问...我将在原始问题中发布一些代码,以便您查看发生了什么。再次感谢。
  • 在这种情况下,我只需在您的头文件UIViewController *vcB 中设置一个变量,因此在您创建第二个视图控制器后,输入vcB = myWebView;。然后当你想摆脱视图时,调用[vcB.view removeFromSuperview];[vcB release];
  • 哈哈我已经尝试过确切的方法,但我仍然无法访问。不太清楚该去哪里......我什至在这里发布了另一个问题。stackoverflow.com/questions/6267425/memory-bad-access
  • 使用最后一条评论,分配时你还有autorelease吗?这会使应用程序崩溃,因为它试图两次释放 webView,这给它带来了错误的访问权限。如果您还没有,请尝试不使用 autorelease 并且(希望)它会为您工作
  • 没关系,我刚刚看到你的另一个问题,发现那里没有自动释放。如果我能想到一个,我会试着想一个理由并留下一个答案
猜你喜欢
  • 2011-12-15
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
相关资源
最近更新 更多