我正在开发一个 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也无法让我回答。当然,加载Google主页的评论也不起作用。
更新25/10/11:
我创建了一个新的通用应用程序,一个简单的应用程序,我在其中添加了UIWebView,并尝试加载Google webPage。 我可以从viewDidLoad / viewDidAppear(detailViewController)加载页面,但不能从我选择行(在detailViewController中触发setDetailItem)时调用的configureView(detailViewController)加载。 这就像加载面板后我无法修改它。有一些我没有得到的东西。 (我用来启动网页的代码与上面的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 Loading web 页
2011-10-26 10:49:59.523 APPName [18334:f803]完成加载网页 页面
2011-10-26 10:49:59.806 APPName [18334:f803]完成加载 网页
答案 0 :(得分:2)
我终于明白了。
但是,我发现的唯一解决方案是使用STORYBOARD而不是xib文件创建另一个项目,这就是我猜的问题。
所以我真的没有我的问题的答案,但我想这肯定是xib文件中的链接问题。但我没找到它。
使用Storyboard,我轻松地制作了iPad版本,但不是iPhone版本...直到我找到了很好的教程:http://www.youtube.com/watch?v=NHIOx_1mz-Q
因此,对于Storyboard,我删除了tableview部分(默认插入)并输入以下代码:
MasterViewController
- (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项目上),我想听听它。
答案 1 :(得分:0)
我不知道这是否能完全解决您的问题,但至少这一行是可疑的:
webView = nil;
在我看来,就像你在设置委托之前将webView设置为nil一样?如果此时为零,则无法设置委托。事实上,当你尝试发送任何消息时,它只会忽略它们。
(也可能是泄漏记忆。)
答案 2 :(得分:0)
我们不能在TabBars中使用UISplitViewController !!