通用 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 元素?

iOS 8:将视图作为应用程序中所有视图控制器的页脚通用

IOS/Swift:将表视图中的对象传递给详细视图控制器

在情节提要中使用 iOS 静态库公共视图控制器?

当另一个应用程序打开 Safari 视图控制器时,如何让 branch.io 通用链接工作?

在对象库中找不到主视图控制器和详细视图控制器