我对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;
}
不幸的是,即使这似乎工作正常,我仍然是一个空白的视图。
答案 0 :(得分:1)
这里有很多问题。
在您尝试将其推送到导航控制器之前,我没有看到您将_webViewController
设置为任何内容的位置。这就是为什么你看到“应用程序试图在目标上推送一个nil视图控制器”错误,并且可能与你看到空白视图的原因有关。
您在问题中引用的两种方法是否都在同一个类中实现?据推测,didSelectRowAtIndexPath
位于您的表视图控制器(Ray Wenderlich教程中的RootViewController)中,viewDidLoad
位于Web视图控制器中?如果是,请在提问时提供此类信息。如果没有,那可能是您问题的一部分。
最重要的是,听起来您正在尝试调整教程以使用故事板。从好的方面来说,这意味着你可以在IB中做很多事情,否则你必须在代码中做。在缺点方面,这使得视图控制器之间的程序“流动”有很大不同,所以解释教程有点困难。
使用故事板时的主要区别在于故事板负责创建和推送/呈现视图控制器。 (让根视图控制器保持并重用Web视图控制器的实例无论如何都是反模式。)以下是您在故事板世界中的工作方式:
假设您的故事板已包含嵌入在导航控制器中的根表视图控制器,请将您的Web视图控制器拖放到故事板上,方法是将UIViewController
拖出库并将其类标识设置为{ {1}}。
控制 - 从表格视图中的原型单元格拖动到Web视图控制器,并使其成为推送segue:
通过以上操作,您可以运行您的应用程序并从表格视图进入Web视图(没有代码 - yay!),但Web视图不知道要加载的URL。因此,您需要将以下内容放在表视图控制器中:
WebViewController
然后您需要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;
}
实现应该对此有所帮助。