从表视图推送新视图控制器(子视图)

时间:2016-02-25 02:27:46

标签: ios objective-c uitableview subview pushviewcontroller

我有一个视图控制器,它有两个表视图控制器作为子视图。

当我单击表视图控制器中的一个单元格时,我希望它可以推送到新的视图控制器。但是,它说self.navigationControllerself.parentViewController.navigationController(null)

有谁知道如何从子视图中推送新视图?谢谢!

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    ProductClass *productClass = [arrProducts objectAtIndex:indexPath.row];

    ProductSingleViewController *productSingleViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ProductSingleViewController"];
    productSingleViewController.prod_title = productClass.title;
    NSLog(@"VC1: %@, VC2: %@", self.navigationController, self.parentViewController.navigationController);
    [self.parentViewController.navigationController pushViewController:productSingleViewController animated:YES];
}

2 个答案:

答案 0 :(得分:0)

处理此问题的一种方法是在UITableViewControllers中设置委托方法。将委托方法添加到父视图控制器。只要有人点击表格内的单元格,它就会被触发。通过这种委托方法,您可以将新的视图控制器推送到堆栈中。

在MyTableViewController.h中:

@protocol MyTableDelegate <NSObject>
@required
- (void)selectedCellWithInfo:(NSDictionary *)info
@end

@interface MyTableViewController : UITableViewController {
    id <MyTableDelegate> delegate;
}

@property (strong) id delegate;

在MyTableViewController.m中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [delegate selectedCellWithInfo:[myTableDataSource[indexPath.row]];
}

在MyMainViewController.h中:

#import "MyTableViewController.h"

@interface MyMainViewController : UIViewController <MyTableDelegate>

在MyMainViewController.m中:

- (void)viewDidLoad {
    [super viewDidLoad];

    myTableViewController.delegate = self;
}

- (void)selectedCellWithInfo:(NSDictionary *)info {
    // Do something
}

答案 1 :(得分:0)

仅当视图控制器位于导航控制器的导航堆栈中时,视图控制器的navigationController属性才会返回有效的导航控制器对象。

如果PRoductSingleViewController是你的rootviewcontroller 1.拖放导航控制器 2.将导航控制器设置为rootviewcontroller。 3.将导航子Viewcontroller替换为PRoductSingleViewController

或者你可以在app delegate.m class

中管理它
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    _productSingleViewController = [[PRoductSingleViewController alloc]initWithNibName:@"PRoductSingleViewController" bundle:nil];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController: _productSingleViewController];
    [self.window addSubview:navController.view];
    [navController release];
    [self.window makeKeyAndVisible];
    return YES;
}