我有一个UITableViewController作为我的UIViewController的子视图。表视图是从RSS源填充的,并且工作正常。我正在尝试将webviewcontroller推到我的主导航堆栈上,当选择子视图中的一行但我不确定如何让它工作。我知道如果我自己使用UITableViewController而不是子视图,我当前的代码将正常工作。
这是我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.title = @"Home";
GRSNewsViewController *newsView = [[GRSNewsViewController alloc]init];
[self addChildViewController:newsView];
[self.view addSubview:newsView.view];
}
UITableViewController .h:
#import <Foundation/Foundation.h>
@class RSSChannel;
@class WebViewController;
@interface GRSNewsViewController : UITableViewController <NSXMLParserDelegate>
{
NSURLConnection *connection;
NSMutableData *xmlData;
RSSChannel *channel;
}
@property (nonatomic, strong)WebViewController *webViewController;
- (void)fetchEntries;
@end
我的UITableViewController .m:
#import "GRSNewsViewController.h"
#import "RSSChannel.h"
#import "RSSItem.h"
#import "WebViewController.h"
#import "GRSHomeViewController.h"
@interface GRSNewsViewController ()
@end
@implementation GRSNewsViewController
@synthesize webViewController;
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 69, 320, 173) style:UITableViewStylePlain];
self.tableView.backgroundColor = [UIColor clearColor];
[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[self.tableView setSeparatorColor:[UIColor whiteColor]];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
NSLog(@"%@ found a %@ element", self, elementName);
if ([elementName isEqual:@"channel"])
{
channel = [[RSSChannel alloc]init];
[channel setParentParserDelegate:self];
[parser setDelegate:channel];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[channel items]count];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 50;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];
if (cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"UITableViewCell"];
cell.textLabel.font = [UIFont systemFontOfSize:16.0];
}
RSSItem *item = [[channel items]objectAtIndex:[indexPath row]];
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ssZ"];
NSDate *pubDate = [formatter dateFromString:[item date]];
[formatter setDateStyle:NSDateFormatterMediumStyle];
NSString *dateString = [formatter stringFromDate:pubDate];
[[cell textLabel]setText:[item title]];
[[cell detailTextLabel]setText:dateString];
cell.backgroundColor = [UIColor clearColor];
cell.textLabel.backgroundColor = [UIColor clearColor];
cell.textLabel.textColor = [UIColor whiteColor];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.detailTextLabel.textColor = [UIColor whiteColor];
return cell;
}
- (void)fetchEntries
{
xmlData = [[NSMutableData alloc]init];
NSURL *url = [NSURL URLWithString:@"http://onmyhonorband.com/rss"];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
connection = [[NSURLConnection alloc]initWithRequest:req delegate:self startImmediately:YES];
}
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self)
{
[self fetchEntries];
}
return self;
}
- (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)data
{
[xmlData appendData:data];
}
- (void)connectionDidFinishLoading:(NSURLConnection *)conn
{
NSXMLParser *parser = [[NSXMLParser alloc]initWithData:xmlData];
[parser setDelegate:self];
[parser parse];
xmlData = nil;
[[self tableView] reloadData];
NSLog(@"%@\n %@\n %@\n", channel, [channel title], [channel infoString]);
}
- (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error
{
connection = nil;
xmlData = nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[[webViewController webView]loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];
[self.navigationController pushViewController:webViewController animated:YES];
RSSItem *entry = [[channel items]objectAtIndex:[indexPath row]];
NSURL *url = [NSURL URLWithString:[entry link]];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
[[webViewController webView]loadRequest:req];
webViewController.hackyURL = url;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
答案 0 :(得分:2)
正如其他人在评论中指出的那样,并且如您获得的控制台消息所示,您的主要问题是您永远不会初始化webViewController
。在表视图控制器的initWithStyle:
初始化程序中添加一行看起来像这样的行。
self.webViewController = [[WebViewController alloc] init];
我发现的其他事情:
在viewDidLoad
中,您分配/初始化新UITableView
。您不应该这样做,因为您正在覆盖UITableView
已由UITableViewController
基类创建的loadView
实例。查看my other answer以获取有关视图和视图控制器生命周期的更多信息。
在父视图控制器中,您忘记调用didMoveToParentViewController
。致电addChildViewController
后,您需要这样做。阅读&#34;实现容器视图控制器&#34;在UIViewController class reference了解详情。
答案 1 :(得分:0)
如果UIViewController addSubView是UITableViewController的视图,你想要推入tableView:didSelectRowAtIndexPath的方法,你应该检查self.navigationController是否为nil。如果它没有,你可能应该使用
[self.parentViewController.navigationController pushViewController:controller animated:YES];
如果self.parentViewController也是nil,有时候,你必须设置一个@property指出在UITableViewController中的parentViewController,如:
@property (nonatomic, weak) UIViewController *parentVC;
并在UIViewController中:
UITableViewController *tableViewVC = [[UITableViewController alloc] init];
tableViewVC.parentVC = self;
在UITableViewController中,-tableView:didSelectRowAtIndexPath:
[self.parentVC.navigationController pushViewController:controller animated:YES];
执行时:
NSLog(@"‼️‼️‼️‼️‼️self.navigationController is%@,\n
self.parentViewController.navigationController is %@,\n
self.parentVC.navigationController is %@",self.navigationController,self.parentViewController.navigationController,self.parentVC.navigationController);
它可以打印为:
‼️‼️‼️‼️‼️self.navigationController is(null),
self.parentViewController.navigationController is (null),
self.parentVC.navigationController is <UINavigationController: 0x7af32ae0>