在 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
中用Navigation
controller的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
是的,我同意,但不应该是 View
的 subView
,这也是主视图的 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 单元点击上推送一个新的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
来自 Prototype Cell 的 pushViewController