【发布时间】:2012-09-28 23:41:49
【问题描述】:
我正在调试一个自定义 UIViewController 子类,它包装了一个 UIWebView 以便我们可以处理自定义 URL。
我似乎没有问题将相关视图添加到层次结构中,但是当我在 webview 上调用 loadRequest: 时,它什么也没显示。 似乎好像它甚至没有尝试执行请求 - 我的子类将自己设置为 UIWebView 的委托,但没有从它接收任何委托回调,甚至 @ 987654326@ 或 shouldStartLoadWithRequest (!)。这可能是什么原因造成的?
以下是我班的相关代码:
- (void)viewDidLoad {
[super viewDidLoad];
// add the webview
m_webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
m_webView.delegate = self;
m_webView.dataDetectorTypes = UIDataDetectorTypeNone;
// adding a border to see if the view is visible onscreen
[[m_webView layer] setBorderColor:[[UIColor darkGrayColor] CGColor]];
[[m_webView layer] setBorderWidth:50];
[self.view addSubview:m_webView];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
NSURLRequest *request = [NSURLRequest requestFromUrl:[NSURL urlFromString:@"http://www.google.com"]];
[self.m_webView loadRequest:request];
NSLog(@"Loading URL: %@ in view: %@; delegate set as %@", @"http://www.google.com", m_webView, m_webView.delegate);
NSLog(@"WebView is %@", self.m_webView.loading ? @"loading" : @"not loading");
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSLog(@"Loading URL of type %@, relative = %@", [[request URL] scheme], [[request URL] relativeString]);
return YES;
}
- (void)webViewDidStartLoad:(UIWebView *)webView {
NSLog(@"Started");
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
NSLog(@"Failed, error %@", error);
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSLog(@"Finished");
[self finishedReloading];
}
以及来自控制器的父视图的代码,它试图添加这个实例的一个实例(当前位于该控制器的 viewDidLoad 方法中):
ZUIWebViewController *testWebView = [[[ZUIWebViewController alloc] initWithAddress:@"deal/recentDrops"] autorelease];
[m_scrollView addSubview:testWebView.view];
[testWebView viewWillAppear:YES];
NSLog(@"Added webview");
我运行的结果是:
Loading URL: http://www.google.com in view: <UIWebView: 0x1114eb30; frame = (0 0; 320 480); layer = <CALayer: 0x1114eb90>>; delegate set as <ZUIWebViewController: 0x1114d7a0>
Webview is not loading
Added webview
“Added webview”消息后的视图层次结构是:
(lldb) po [m_scrollView recursiveDescription]
(id) $1 = 0x0a634b00 <UIView: 0xbba3430; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0xbba3840>>
| <UIImageView: 0xbba3490; frame = (0 0; 320 480); userInteractionEnabled = NO; layer = <CALayer: 0xbba3940>>
| <UIScrollView: 0xbba4390; frame = (0 0; 320 480); clipsToBounds = YES; gestureRecognizers = <NSArray: 0xbba4680>; layer = <CALayer: 0xbba4560>; contentOffset: {0, 0}>
| | <UIWebView: 0xbba4840; frame = (0 0; 320 480); layer = <CALayer: 0xbba48a0>>
| | | <_UIWebViewScrollView: 0xbba6b70; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = H; gestureRecognizers = <NSArray: 0xbba6f40>; layer = <CALayer: 0xbba6da0>; contentOffset: {0, 0}>
| | | | <UIImageView: 0xbba7860; frame = (0 0; 54 54); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba78c0>>
| | | | <UIImageView: 0xbba77d0; frame = (0 0; 54 54); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba7830>>
| | | | <UIImageView: 0xbba7740; frame = (0 0; 54 54); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba77a0>>
| | | | <UIImageView: 0xbba76b0; frame = (0 0; 54 54); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba7710>>
| | | | <UIImageView: 0xbba7620; frame = (-14.5 14.5; 30 1); transform = [0, 1, -1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba7680>>
| | | | <UIImageView: 0xbba7590; frame = (-14.5 14.5; 30 1); transform = [0, -1, 1, 0, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba75f0>>
| | | | <UIImageView: 0xbba7500; frame = (0 0; 1 30); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba7560>>
| | | | <UIImageView: 0xbba7470; frame = (0 0; 1 30); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba74d0>>
| | | | <UIImageView: 0xbba73e0; frame = (0 450; 320 30); alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba7440>>
| | | | <UIImageView: 0xbba7380; frame = (0 0; 320 30); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xbba72e0>>
| | | | <UIWebBrowserView: 0x13baa200; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0xbba5d50>; layer = <UIWebLayer: 0xbba4930>>
| | | | | <TileHostLayer: 0xbba4a00> (layer)
| | | | | | <TileLayer: 0xbba7ef0> (layer)
因此,我要显示的 UIWebView 前面似乎没有任何内容。
这可能是什么原因造成的,我应该采取哪些进一步的步骤来调试?
【问题讨论】:
-
你为什么要手动拨打
[testView viewWillAppear:YES]?当testView出现时应该会自动调用它。问起来可能很傻,但是有没有可能m_scrollView没有启动(nil)? -
这对我来说似乎也有点奇怪,但显然 viewWillAppear 在某些上下文中以编程方式创建视图时不会被调用(请参阅stackoverflow.com/questions/895713/… 上的答案)。再次查看此日志输出,我发现我从错误的运行中提取了输出 - 啊!我会编辑它,但简短的版本是,是的,我已经确认 m_scrollView 已显示。
-
你有这个日志语句:
NSLog(@"Loading URL: %@ in view: %@; delegate set as %@", @"http://www.google.com", m_webView, m_webView.delegate);。当您将硬编码的 google.com 替换为[request URL]时会发生什么?另外,requestFromUrl是在哪里定义的?你能分享一下它的实现吗? -
我觉得连
viewDidLoad都没有被调用。看到日志中框架的大小与其中指定的大小不同。这实际上解释了未调用委托方法,因为未设置委托。
标签: ios ios5 uiwebview uiwebviewdelegate