将UIViewController推送到UINavigationController

时间:2011-01-03 20:13:33

标签: iphone ios4 uinavigationcontroller

前几天我问过使用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];
}

我可以在控制台中看到日志语句,但视图永远不会改变。我错过了什么吗?

2 个答案:

答案 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];

古德勒克!