在 tableview 单元点击上推送一个新的视图控制器

Posted

技术标签:

【中文标题】在 tableview 单元点击上推送一个新的视图控制器【英文标题】:Push a new view controller on tableview cell tap 【发布时间】:2013-01-05 09:44:54 【问题描述】:

我有一个头文件

@interface DemoFirstViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

在这个头文件的源文件中我已经声明了这个方法

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    AnotherViewController *anotherViewController=[[AnotherViewController alloc]   initWithNibName:@"AnotherViewController" bundle:nil];
    [self.navigationController pushViewController:anotherViewController animated:YES];

    NSLog(@"didSelectRowAtIndexPath: row=%d", indexPath.row);


另一个ViewController文件是

@interface AnotherViewController : UIViewController

    IBOutlet UILabel *message;


@property (nonatomic , retain) UILabel *message;

@end

我正在使用 Xib 文件来完成这一切。不是故事板。

这是tabbased Application。并且 Appdelegate 中已经声明了两个 viewcontroller

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *viewController1 = [[DemoFirstViewController alloc] initWithNibName:@"DemoFirstViewController" bundle:nil];
    UIViewController *viewController2 = [[DemoSecondViewController alloc] initWithNibName:@"DemoSecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[viewController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;


在点击表格单元格时,另一个Viewcontroller 没有出现。请尽快回复。

【问题讨论】:

didSelectRowAtIndexPath 的 NSLog 是否正常工作? 你在AppDelegate中用Navigationcontroller的initWithRootViewController方法正确设置了DemoFirstViewController吗?或者您是否在您的AnotherView 中实现了initWithNibName 方法?? @Zeel - 现在查看我编辑的答案 ~~ 【参考方案1】:

这背后可能有几个原因:

    UINavigationController 应该在 Appdelegate 类中正确实现。 UITableView 不应添加到 self.view 的任何 subView 上。

    如果didSelectRowAtIndexPath: 被调用,否则没关系您忘记设置tableView 代表。

    tableView.delegate = self;
    

编辑:我阅读了Zeel 的评论,他说他正在使用TabBar,但他之前没有提及所以我正在编辑我的答案:-

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    DemoFirstViewController *viewController1 = [[DemoFirstViewController alloc] initWithNibName:@"DemoFirstViewController" bundle:nil];
    UINavigationController *nav1 =[[UINavigationController alloc] initWithRootViewController:viewController1];
    DemoSecondViewController *viewController2 = [[DemoSecondViewController alloc] initWithNibName:@"DemoSecondViewController" bundle:nil];
    UINavigationController *nav2 =[[UINavigationController alloc] initWithRootViewController:viewController2];

    self.tabBarController = [[UITabBarController alloc] init];
    self.tabBarController.viewControllers = @[nav1, nav2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;

【讨论】:

+1。这几乎总结了从 tableview 推送视图控制器时的所有新手错误。 我不明白第二点。如果您使用 UIViewController 而不是 UITableViewController AFAIK UITableView 可以是主视图的子视图,没有任何风险(就像在这种情况下) @LombaX - UITableView can be a subview of the main view 是的,我同意,但不应该是 ViewsubView,这也是主视图的 subView ..... 我的意思是 tableView应该添加到self.View 嗯...好吧,我不知道 :-) 我会搜索,因为它看起来很“有趣” :-) 如果您有一些指示/链接来解释为什么我会很感激! 我有这个只是因为经验,当我试图通过 didSelectRow 推送视图时:然后我得到了这个原因,我希望其他人不要在同样的原因上浪费时间:)【参考方案2】:

以上所有答案都指向正确的方向。以防万一您还没有掌握它,请检查您是否在appdelegate 中添加了以下代码,

UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];  
self.window.rootViewController = navigationController;

然后再次检查。

【讨论】:

我已经制作了选项卡式应用程序,所以已经声明了 2 个视图控制器。 @Zeel - 你为什么没有在你的问题中提到这一点......这是非常重要的原因?请编辑您的问题并使其尽可能清晰,以便获得合适的答案。【参考方案3】:
NSLog(@"Navigation Controller: %@", self.navigationController);

检查此行打印的内容。 我怀疑你忘记在你的层次结构中添加 navigationController

更新: 根据您的 AppDelegate 代码,像这样更新它以解决您的问题:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    UIViewController *viewController1 = [[DemoFirstViewController alloc] initWithNibName:@"DemoFirstViewController" bundle:nil];

    // here I create a Navigation Controller and set its root view controller to viewController1
    UINavigationController *navController1 = [[UINavigationController alloc] initWithRootViewController:viewController1];

    UIViewController *viewController2 = [[DemoSecondViewController alloc] initWithNibName:@"DemoSecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];

    // updated this line to show the navController1 (which contains viewController1)
    self.tabBarController.viewControllers = @[navController1, viewController2];
    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;


如果甚至 viewController2 是一个 UITableViewController 需要推送一些东西,在它上面做同样的事情(添加另一个 UINavigationController,设置根视图控制器,并设置一个 TabBarController 的视图控制器)

【讨论】:

意味着 AnotherViewController 应该是 UINavigationController 的子类?在这个文件的 xib 中,我必须从对象中拖放导航控制器? 不,您只需将导航控制器添加到您的控制器层次结构中。我看到您添加了 AppDelegate 代码,我更新了我的答案并向您展示了要更改的内容 感谢大家的回复。但是当我在 appDelegate 上添加上述代码后按下表格单元格时,我的应用程序因以下异常而终止.... >>>>>>> TabBarNavBarDemo[799:c07] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:'-[UIViewController _loadViewFromNibNamed:bundle:] 加载了“AnotherViewController”笔尖,但视图出口没有放。' ***第一掷调用堆栈:(0x1c92012 0x10cfe7e 0x1c91deb 0xf7f18 0xf8418 0xf8648 0xf8882 0xf8b2a 0x10fef5 0x10ffdb 0x110286 0x110381 0x110eab 0x1114a3 0x111098 0x3004 0xc68d5 0xc6b3d 0xacde83 0x1c51376 0x1c50e06 0x1c38a82 0x1c37f44 0x1c37e1b 0x1bec7e3 0x1bec668 0x1765c 0x1f4d 0x1e75)的libc ++ abi.dylib:终止叫做抛出异常(lldb) 您是否更改了您的 AnotherViewController 笔尖中的任何内容?检查从文件所有者到主视图的“视图”出口是否已连接。点击 nib -> 右键单击​​“文件所有者” -> 将“视图”插座拖到 nib 文件的根视图上。

以上是关于在 tableview 单元点击上推送一个新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

显示键盘时推送另一个视图时的tableView调整大小问题

打开 TableView 到最后点击的单元格

来自 Prototype Cell 的 pushViewController

在单击表格单元格时推送新视图,这怎么可能? [关闭]

TableView didSelectRowAt IndexPath 没有被调用

单击tableview单元格行时如何推送新的viewcontroller?