Iphone 通用iOS应用程序:detailViewController中的UIWebView不显示iPad部件的内容

Iphone 通用iOS应用程序:detailViewController中的UIWebView不显示iPad部件的内容,iphone,ios,ipad,uiwebview,Iphone,Ios,Ipad,Uiwebview,我正在Xcode 4上开发一个通用iOS应用程序。这是我第一次尝试创建iPhone/iPad应用程序。我正在使用主详细信息应用程序模板。 这个应用程序大体上是一个RSS提要阅读器。 我遵循本教程获得了一个重要的想法: 我成功地使iPhone部分正常工作,但我对iPad部分的UIWebView有一个问题 这是可能不正确的代码 从MasterViewController…: - (void)tableView:(UITableView *)tableView didSelectRowAtIndexP

我正在Xcode 4上开发一个通用iOS应用程序。这是我第一次尝试创建iPhone/iPad应用程序。我正在使用主详细信息应用程序模板。 这个应用程序大体上是一个RSS提要阅读器。 我遵循本教程获得了一个重要的想法:

我成功地使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,我也无法让它回答我。当然,加载谷歌主页的评论也不起作用

2011年10月25日更新:

我创建了一个新的通用应用程序,一个简单的应用程序,在其中我添加了一个UIWebView,并尝试加载Google网页。 我可以从ViewDiLoad/ViewDidDisplay(detailViewController)加载页面,但不能从configureView(detailViewController)加载页面,当我选择一行(在detailViewController中触发setDetailItem)时,会调用configureView(detailViewController)。 这就像我加载面板后无法修改它一样。有件事我不明白。 (我用于启动网页的代码与上面在configureView中的注释的代码行相同)

2011年10月26日更新

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>>
}}
-(无效)配置视图{
如果(_detailItem){
UIWebView*tempWebView=[[UIWebView alloc]init];
self.webView=tempWebView;
NSLog(@“网页创建”);
NSString*html=[\u detailItem objectForKey:@“title”];
[…添加到html字符串中的html内容…]
//[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@]http://www.google.com"]]];
[self.webView loadHTMLString:html baseURL:nil];
self.webView.delegate=self;//最好添加“self”使其工作
NSLog(@“已加载webView”);
NSLog(@“%@”,self.webView);//我得到了这个:
}}
通过写“self.webView.delegate=self”,我得到了代表的回答。但是,这一个会产生两个答案(??),就像有两个webView在运行一样:

2011-10-26 10:49:57.089 APPName[18334:f803]开始加载网页

2011-10-26 10:49:59.416应用程序名[18334:f803]开始加载web 页面

2011-10-26 10:49:59.523 APPName[18334:f803]已完成web加载 页面

2011-10-26 10:49:59.806 APPName[18334:f803]已完成加载 网页


我不知道这是否能完全解决您的问题,但至少这一行是可疑的:

    webView = nil;
在我看来,您是在设置委托之前将webView设置为零?如果此时为nil,则无法设置委托。事实上,当你试图向它发送任何消息时,它都会忽略它们


(也可能是内存泄漏。)

我终于让它工作了

然而,我发现的唯一解决方案是创建另一个带有故事板而不是xib文件的项目,我想这就是问题所在

所以我并没有找到我的问题的答案,但我想这肯定是xib文件中的链接问题。但是我没有找到它

有了故事板,我很容易就设计出了iPad版,但不是iPhone版。。。直到我找到了好的教程:

因此,对于故事板,我删除了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];
}
- (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];
}
}

详细视图控制器

- (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];
}
- (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(在Universal iOS项目上),我想听听。

  • 拆分视图控制器必须始终是您创建的任何接口的根
  • 拆分视图界面的窗格可能包含导航控制器, 选项卡栏控制器
  • “拆分视图”控制器会自动处理大多数旋转行为

我们不能在选项卡栏中使用UISplitViewController

是的,这对我来说很愚蠢。但是,它并没有给我带来更多的东西(无论是webview工作还是UIWebViewDelegate错误/输出)?它是用代码初始化的还是使用.xib文件,如果它在.xib文件中,您确定它已连接?如果您将NSLog(@“%@”,webView);比如说,在NSLog之后(@“webView加载”);webView本身有价值吗?atch。。。webView没有值(空)。当我将这个通用应用程序与我上周做的iPad应用程序进行比较时,我觉得有些奇怪。在iPad应用程序(基于splitViewbased)的IB中,有一个与my detailView链接的RootViewController插座。但在这里,即使是splitView,也没有。实际上,这就是为什么我要为每一行创建一个新的detailViewController。至于universal的配置,我不知道如何通过IB(没有mainWindow.xib)进行连接。我创建了一个临时webview,并将webview设置为这个临时webview,即alloc和init,但如果我得到了webview的值,我就不会显示它