我有一个包含多个视图的应用程序。我可以单击不同的按钮来选择不同的视图,其中一个显示一个表。当我在该行上选择一个单元格时,我想显示一个新视图。我看到一条日志行,表明该视图已加载,但屏幕不会更改。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *targetCustomCell = (UITableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
NSLog(@"in didSelectRowAtIndexPath");
ItemDetailsViewController *detailsController = [[ItemDetailsViewController alloc] initWithNibName:@"ItemDetailsView" bundle:nil];
[self.navigationController pushViewController:detailsController animated:YES];
[self.window addSubview:[detailsController view]];
[detailsController release];
detailsController = nil;
}
在ItemDetailsViewController中,我有
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"in ItemDetailsViewController.viewDidLoad ");
}
我看到两个日志行,但屏幕没有变化。为什么观点不变?还有其他方法可以改变观点吗?
答案 0 :(得分:4)
如果您尝试使用[self presentModalViewController:detailsController animated:YES]而不是导航控制器的pushViewController来呈现您的详细信息控制器,会发生什么?此外,不必将视图添加到窗口。推动视图控制器就足够了。
尝试添加NSLog([self.navigationController description])并查看self.navigationController是否为nil。 (如果您当前的控制器不是UINavigationController的子控制器,可能会发生)。将消息传递给nil对象只是默默地失败,所以很有可能是问题所在。
希望有所帮助!
编辑:通常没有必要继承UINavigationController。在Apple的文档中查看此页面:Apple Docs: Using Navigation Controllers它很好地解释了设置。如果您在应用程序委托中以编程方式创建“根”视图控制器,则需要执行以下操作:
// set up main view controller
DrawingBrowserController *controller = [[DrawingBrowserController alloc] init];
// create a navigation controller that "wraps" the controller
navigationController = [[UINavigationController alloc] initWithRootViewController: controller];
[controller release];
// Add the navigation controller's view to the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
基本上,您将根视图控制器“包装”在导航控制器中。如果你正在使用Interface Builder,你也可以在那里进行设置。
答案 1 :(得分:0)
您确定导航控制器是窗口的根视图吗?
您通常应该在applicationDidFinishLaunching
方法中执行此操作:
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
此外,您应该删除[self.window addSubview:[detailsController view]];
,因为没有必要。