RSS阅读器未在WebView中显示选定的单元格

时间:2012-04-09 09:33:31

标签: iphone ios xcode rss webview

我对iOS开发相当陌生,所以对我很不满意。我一直在尝试制作一个简单的RSS阅读器应用程序,我已经按照本教程进行了操作:

http://www.raywenderlich.com/2636/how-to-make-a-simple-rss-reader-iphone-app-tutorial

本教程必须进行一些调整,因为我正在使用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&amp;中设置。 viewDidload在DetailViewController中设置

我已经在故事板中设置了推送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;
}

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

1 个答案:

答案 0 :(得分:1)

这里有很多问题。

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

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

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

  4. 使用故事板时的主要区别在于故事板负责创建和推送/呈现视图控制器。 (让根视图控制器保持并重用Web视图控制器的实例无论如何都是反模式。)以下是您在故事板世界中的工作方式:

    1. 假设您的故事板已包含嵌入在导航控制器中的根表视图控制器,请将您的Web视图控制器拖放到故事板上,方法是将UIViewController拖出库并将其类标识设置为{ {1}}。

    2. 控制 - 从表格视图中的原型单元格拖动到Web视图控制器,并使其成为推送segue:

      drag to create segue

    3. 通过以上操作,您可以运行您的应用程序并从表格视图进入Web视图(没有代码 - yay!),但Web视图不知道要加载的URL。因此,您需要将以下内容放在表视图控制器中:

      WebViewController
    4. 然后您需要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; } 实现应该对此有所帮助。