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

Posted

技术标签:

【中文标题】从表视图(子视图)推送新的视图控制器【英文标题】:Push new view controller from table view (subview) 【发布时间】:2016-02-25 02:27:45 【问题描述】:

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

当我单击表格视图控制器中的一个单元格时,我希望它推送到新的视图控制器。但是,它说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];

【问题讨论】:

你的 self.parentViewController 也是 null 吗? 【参考方案1】:

处理这个问题的一种方法是在 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

【讨论】:

【参考方案2】:

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

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

或者你可以在 app delegate.m 类中管理它

- (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;

【讨论】:

以上是关于从表视图(子视图)推送新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

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

如何从嵌入在视图控制器中的表视图中的集合视图中传递数据并推送新的视图控制器?

如何从表视图中添加/删除子视图

如何将数据从表视图传递到另一个视图控制器

将值从表视图控制器传递到视图控制器

从父视图控制器再次推送时,子视图框架发生变化