1

我一直在尝试按照本教程制作一个简单的 RSS 阅读器应用程序。

由于我使用的是 Xcode 4.3.2,因此必须对本教程进行一些调整。一切正常,它可以很好地加载所有 RSS 提要,但是当我单击一篇文章查看它时,会加载详细视图控制器,但它完全是空白的。我尝试向情节提要上的 DetailViewController 添加标签或按钮,但即使在加载时也不会出现。唯一可见的是顶部的导航栏。所以我的问题是我做错了什么?我确定这是一个简单的设置问题,而不是代码问题。事实上我可以将任何对象添加到视图中并且没有显示它几乎就像正在加载一个完全不同的视图控制器。任何帮助将不胜感激。这是我一直在使用的代码:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
_webViewController.entry = entry;
[self.navigationController pushViewController:_webViewController animated:YES];

}


- (void)viewDidLoad
{

NSURL *url = [NSURL URLWithString:_entry.articleUrl];    
[self.webView loadRequest:[NSURLRequest requestWithURL:url]];
NSLog(@"The URL is %@",url);


}

因为这段代码是从旧版本的 Xcode 改编而来的,它是否与故事板而不是单个 nib 文件有关?

好的 _webviewController 设置在 RootViewController.h

@interface RootViewController : UITableViewController <UITableViewDelegate> {
NSOperationQueue *_queue;
NSArray *_feeds;
NSMutableArray *_allEntries;
DetailViewController *_webViewController;

}

@property (retain) NSOperationQueue *queue;
@property (retain) NSArray *feeds;
@property (retain) NSMutableArray *allEntries;
@property (retain) DetailViewController *webViewController;

didselectRowAtIndex 在 RootViewController 中设置 & viewDidload 在 DetailViewController 中设置

我已经在故事板中设置了一个 push segue。

我现在已经用下面建议的方法替换了 tableView didSelectRowAtPath 方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// test segue.identifier if needed
DetailViewController *viewController = segue.destinationViewController;
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
// set properties of viewController based on selection indexPath
RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
viewController.entry = entry;
}

不幸的是,即使这似乎工作正常,我仍然得到一个空白的视图。

4

1 回答 1

1

这里有多个问题。

  1. _webViewController在您尝试将其推到导航控制器上之前,我没有看到您正在设置任何内容的地方。这就是您看到“应用程序试图在目标上推送一个 nil 视图控制器”错误的原因,并且可能与您看到空白视图的原因有关。

  2. 您在问题中引用的两种方法是否都在同一个类中实现?大概didSelectRowAtIndexPath是在您的表视图控制器中(Ray Wenderlich 教程中的 RootViewController),并且viewDidLoad在 Web 视图控制器中?如果是这样,请在提问时提供此类信息。如果没有,那可能是您问题的一部分。

  3. 最重要的是,听起来您正在尝试调整教程以使用故事板。从好的方面来说,这意味着你可以在 IB 中做很多你必须在代码中做的事情。不利的一面是,这使得视图控制器之间的程序“流动”有很大不同,因此解释本教程有点困难。

使用情节提要的主要区别在于情节提要负责创建和推送/呈现您的视图控制器。(无论如何,让根视图控制器保留并重用 Web 视图控制器的实例是反模式。)这是您在故事板世界中做事的方式:

  1. 假设您的故事板已经包含嵌入在导航控制器中的根表视图控制器,通过将您的 Web 视图控制器拖出UIViewController库并将其类标识设置为您的WebViewController.

  2. 按住 Control 键从表格视图中的原型单元格拖动到 Web 视图控制器,并使其成为 Push segue:

    拖动以创建 segue

  3. 使用上述内容,您可以运行您的应用程序并从表格视图转到 Web 视图(无需代码——耶!),但 Web 视图不知道要加载哪个 URL。因此,您需要将以下内容放入表视图控制器中:

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        // test segue.identifier if needed
        WebViewController *viewController = segue.destinationViewController;
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        // set properties of viewController based on selection indexPath
        RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
        viewController.entry = entry;
    }
    
  4. 然后您需要 Web 视图控制器在其 Web 视图中加载 URL——viewDidLoad您已经拥有的实现应该对此有好处。

于 2012-04-09T17:38:23.793 回答