从子视图推送新视图控制器

时间:2014-05-05 18:26:11

标签: ios objective-c uitableview didselectrowatindexpath

我有一个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

2 个答案:

答案 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>