通用 iOS 应用程序:详细视图控制器中的 UIWebView 不显示 iPad 部分的内容
Posted
技术标签:
【中文标题】通用 iOS 应用程序:详细视图控制器中的 UIWebView 不显示 iPad 部分的内容【英文标题】:Universal iOS App : UIWebView in detailViewController does not display content for iPad part 【发布时间】:2011-10-24 10:01:25 【问题描述】:我正在开发一个Xcode 4 上的通用iOS 应用程序。这是我第一次尝试创建 iPhone/iPad 应用程序。我正在使用主从应用程序模板。 这个应用程序大致是一个 RSS Feed 阅读器。 我已经按照本教程获得了大创意:http://cocoadevblog.com/iphone-tutorial-creating-a-rss-feed-reader
我成功使 iPhone 部分工作,但我在 iPad 部分的 UIWebView 有问题。
这里的代码可能不正确。
来自 MasterViewController ...:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
if (!self.detailViewController)
NSDictionary *theItem = [items objectAtIndex:indexPath.row];
DetailViewController *nextController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPhone" bundle:nil];
[nextController setDetailItem:theItem];
[self.navigationController pushViewController:nextController animated:YES];
else
if (!self.detailViewController)
NSDictionary *theItem = [items objectAtIndex:indexPath.row];
DetailViewController *nextController = [[DetailViewController alloc] initWithNibName:@"DetailViewController_iPad" bundle:nil];
[nextController setDetailItem:theItem];
self.detailViewController = nextController;
else
[self.detailViewController setDetailItem:[self.items objectAtIndex:indexPath.row]];
... 到 DetailViewController,这里是 setDetailItem: 和 configureView 的实现:
- (void)setDetailItem:(id)newDetailItem
if (_detailItem != newDetailItem)
_detailItem = newDetailItem;
// Update the view.
[self configureView];
if (self.masterPopoverController != nil)
[self.masterPopoverController dismissPopoverAnimated:YES];
- (void)configureView
// Update the user interface for the detail item.
if (_detailItem)
NSLog(@"webpage creation");
NSString *html = [_detailItem objectForKey:@"title"];
[...html stuff added to html string...]
webView = nil;
webView.delegate=self;
//[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]];
[self.webView loadHTMLString:html baseURL:nil];
NSLog(@"webView loaded");
当我在 MasterView 上选择一行时,detailView 窗格上出现空白屏幕(MasterView/detailView -> 在通用应用程序案例中,iPad 应用程序是 splitview 样式的应用程序)。
我在 InterfaceBuilder 中链接了 webView(对于 iPhone/iPad .xib 文件),我收到了每个 NSLog,但即使我实现了 UIWebViewDelegate,我也无法回答我。当然,加载谷歌主页的评论也不起作用。
25/10/11 更新:
我创建了一个新的通用应用程序,一个简单的应用程序,我在其中添加了一个 UIWebView 并尝试加载 Google 网页。 我可以从 viewDidLoad/viewDidAppear (detailViewController) 加载页面,但不能从当我选择一行时调用的 configureView (detailViewController) 加载页面(在 detailViewController 中触发 setDetailItem)。 就像我在加载面板后无法修改它一样。有些东西我不明白。 (我用来启动网页的代码与上面configureView中的注释是同一行代码)
26/10/11 更新
webView 在 configureView 中没有值(null)(当我尝试为选定的行显示它时)。我试过这个,它不起作用,但在这种情况下我(显然/至少)得到了 webView 的值:
- (void)configureView
if (_detailItem)
UIWebView *tempWebView = [[UIWebView alloc] init];
self.webView = tempWebView;
NSLog(@"webpage creation");
NSString *html = [_detailItem objectForKey:@"title"];
[...html stuff added to html string...]
//[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]];
[self.webView loadHTMLString:html baseURL:nil];
self.webView.delegate=self;//better to add "self" to get it working
NSLog(@"webView loaded");
NSLog(@"%@",self.webView); //i got this : <UIWebView: 0x6a5a550; frame = (0 0; 0 0); layer = <CALayer: 0x6a59750>>
通过编写“self.webView.delegate=self;”我让代表回答我。但是,这会产生两个答案(??),例如是否有两个 webView 正在运行?:
2011-10-26 10:49:57.089 APPName[18334:f803] didStart 加载网页
2011-10-26 10:49:59.416 APPName[18334:f803] didStart 加载网页 页面
2011-10-26 10:49:59.523 APPName[18334:f803] 完成加载网页 页面
2011-10-26 10:49:59.806 APPName[18334:f803] 加载完成 网页
【问题讨论】:
【参考方案1】:我终于搞定了。
但是,我找到的唯一解决方案是使用 STORYBOARD 而不是 xib 文件创建另一个项目,我猜这是问题所在。
所以我真的没有我的问题的答案,但我想这肯定是 xib 文件中的链接问题。但是没找到。
使用 Storyboard,我很容易就完成了 iPad 版本,但不是 iPhone 版本......直到我找到了好的教程:http://www.youtube.com/watch?v=NHIOx_1mz-Q
所以对于情节提要,我删除了 tableview 部分(默认插入)并输入以下代码:
主视图控制器
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
NSLog(@"SELECT ROW IPHONE");
if (!self.detailViewController)
NSDictionary *theItem = [items objectAtIndex:indexPath.row];
DetailViewController *nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"Detail"];
[nextController setDetailItem:theItem];
[self.navigationController pushViewController:nextController animated:YES];
else
NSLog(@"SELECT ROW IPAD");
self.detailViewController.detailItem = [self.items objectAtIndex:indexPath.row];
DetailViewController
- (void)configureView
// Update the user interface for the detail item.
if (self.detailItem)
self.detailDescriptionLabel.text = [self.detailItem description];
self.webView.delegate=self;
NSString *html = @"";
[...html stuff...]
[self.webView loadHTMLString:html baseURL:nil];
我没有提到它,但我当然也创建并链接了 webview。
如果有人找到一个简单项目的 xib 版本的答案,其中 TableView 链接到 iPad 的 detailView(在通用 ios 项目上),我想听听。
【讨论】:
【参考方案2】:我不知道这是否会完全解决您的问题,但至少这条线是可疑的:
webView = nil;
在我看来,您在设置委托之前将 webView 设置为 nil?如果此时它为 nil,则无法设置委托。事实上,当你尝试向它发送任何消息时,它都会忽略它们。
(也可能是内存泄漏。)
【讨论】:
是的,这对我来说是愚蠢的。然而,它并没有让我得到任何东西(webview 工作也不 UIWebViewDelegate 错误/输出)。 好的,所以我想下一个问题是:webView 分配在哪里?它是在代码中初始化还是使用 .xib 文件,如果它在 .xib 文件中,你确定它是连接的吗?如果你把 NSLog(@"%@", webView);之后,比如说 NSLog(@"webView loaded"); webView 本身有没有价值? atch... webView 没有值(null)。 当我将这个通用应用程序与我上周做的 iPad 应用程序进行比较时,我觉得有些奇怪。就是在 iPad 应用程序 (splitViewbased) 的 IB 中,有一个来自 RootViewController 的出口链接到我的 detailView。但是这里,即使是splitView,也没有。实际上,这就是为什么我为每一行创建一个新的 detailViewController。有了通用的配置,我不知道如何通过 IB 连接(没有 mainWindow.xib)。 我创建了一个临时 webview 并将 webview 设置为我分配和初始化的这个临时 webview,但是如果我得到我的 webView 的值,我不会显示它【参考方案3】: 拆分视图控制器必须始终是您创建的任何界面的根。 拆分视图界面的窗格可能包含导航控制器, 标签栏控制器,... 拆分视图控制器自动处理大部分旋转行为而且我们不能在 TabBars 中使用 UISplitViewController !!
【讨论】:
以上是关于通用 iOS 应用程序:详细视图控制器中的 UIWebView 不显示 iPad 部分的内容的主要内容,如果未能解决你的问题,请参考以下文章
UI 模板视图 - iOs 应用程序上所有场景中的通用 UI 元素?