通用iOS应用程序:详细信息中的UIWebViewViewController不显示iPad部件的内容

时间:2011-10-24 10:01:26

标签: iphone ios ipad uiwebview

我正在开发一个 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]完成加载   网页

3 个答案:

答案 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 !!