前几天我问过使用UINavigationController as a child of a UIViewController。我通过答案得到了这个。现在我要做的是将控制器推到导航堆栈上。触摸表格单元格时,我会执行以下操作:
- (void) showSetup {
NSLog(@"Showing Setup");
SetupViewController *controller = [[SetupViewController alloc]initWithNibName:@"SetupViewController" bundle:nil];
self.setupViewController = controller;
self.setupViewController.title = @"Setup";
[self.navigationController pushViewController:self.setupViewController animated:YES];
[controller release];
}
我可以在控制台中看到日志语句,但视图永远不会改变。我错过了什么吗?
答案 0 :(得分:1)
嗯,如果不了解实施的细节,这有点棘手 - 我假设您已经实现了链接文章中的导航控制器。虽然你没有给出任何细节,但听起来你已经在线上的某个地方添加了一个表视图控制器,所以我让UIViewController符合UITableView协议,在一个地方处理所有事情:
@interface SOViewController : UIViewController
< UITableViewDelegate,UITableViewDataSource > {
UINavigationController* navController; } - (IBAction) pushMe:(id)sender; @end
我在IB的SOViewController视图上放了一个按钮,并将pushMe:操作连接到它。我还创建了另一个名为JunkController
的基于UIViewController的类,并在它的IB视图中删除了一个“Junk”标签 - 这就是我在IB中所做的一切。在SOViewController的viewDidLoad:
navController = [[[UINavigationController alloc] init] retain]; navController.navigationBar.barStyle = UIBarStyleBlackOpaque; navController.toolbarHidden = YES; UITableViewController* tvController = [[UITableViewController alloc] init]; UITableView* tv = [[UITableView alloc] init]; tvController.tableView = tv; tv.delegate = self; tv.dataSource = self; [navController setViewControllers:[NSArray arrayWithObject:tvController]];
在pushMe:action实现中:
[self presentModalViewController:navController animated:YES];
实现了tableView委托和数据源方法;供选择:
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"row selected"); JunkController* junk = [[JunkController alloc] initWithNibName:@"junkcontroller" bundle:nil]; [navController pushViewController:junk animated:YES]; [junk release]; }
这应该会产生一个应用程序,该应用程序使用“按下我”按钮显示屏幕。当按下该按钮时,你应该得到一个基于动态模态导航的表格视图 - 我的一行包含一个标签“选择我”。触摸此行应该将垃圾控制器设置为视图。
答案 1 :(得分:0)
无需在此视图控制器中使setupViewController成为声明的属性。此外,我可能会弄错,但我认为“控制器”是Cocoa中的保留名称,我会更改该名称。因此,请确保已使用UITableViewDelegate注册并使用- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
挂钩并按下以下方式推送新的视图控制器:
SetupViewController *detailViewController = [[SetupViewController alloc] initWithNibName:@"SetupViewController" bundle:nil];
detailViewController.title = @"Setup";
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
古德勒克!