我有一个UINavigationController,我有一个单独的UIViews,我在使用UISegmentControl之间切换。在切换视图时,我将视图作为子视图添加到导航控制器的视图中:
[self.view addSubview:segmentTab1.view];
和
[self.view addSubview:segmentTab2.view];
然后,在subViews中,每个都有一个UITableView,但我的问题是,我无法在didSelectRowAtIndexPath
方法中将新的viewController推送到视图中。
正确调用该方法并通过设置断点,我可以看到推送视图的方法也被调用,但没有任何反应。这是我推送它的代码:
[self.navigationController pushViewController:detailsViewController animated:YES];
我也试过
[super.navigationController pushViewController:detailsViewController animated:YES];
我做错了什么 - 或者只是不可能用子视图来做?
答案 0 :(得分:6)
当你调用-pushViewController时,哪个视图控制器是自己的?如果您从其中一个选项卡子视图中调用该选项卡,则自己可能没有从您添加到其中的顶级视图引用导航控制器。您可以通过从顶级视图中获取导航控制器的内存地址并将其与子视图中的内容进行比较来验证这一点。显然,如果它是零或不匹配,那那就是你的问题。
当你使用-pushViewController将导航控制器添加到导航堆栈本身时,你只能“免费”获得导航控制器,你的子视图没有以这种方式添加。
答案 1 :(得分:2)
在为所有视图实现公共标头时,我遇到了类似的问题 经过多次尝试,我已经修复了它 -
在所有viewController中
- (void)viewWillAppear:(BOOL)animated {
[self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];
[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES];
}
我已经提到了以下帖子来实现标题视图 Common XIB in multiple View Controller in iPhone
[self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]]; // line will load the header subview
[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES]; //这是调用HeaderController的viewWillAppear方法,我们可以编写代码来检查用户是否记录,并将登录按钮更改为注销按钮等。
答案 2 :(得分:1)
而不是
[self.view addSubview:segmentTab1.view];
和
[self.view addSubview:segmentTab2.view];
你可以使用
[self pushViewController: segmentTab1 animated: NO];
和
[self pushViewController: segmentTab2 animated: NO];
将viewControllers添加到导航层次结构,并使[super.navigationController pushViewController:detailsViewController animated:YES];
正常工作。
答案 3 :(得分:0)
我不完全清楚您的视图层次结构是什么,但一般来说,如果您的导航控制器视图不是窗口的第一个子视图或Apple的一个集合视图的元素(另一个导航视图控制器的内容视图或选项卡控制器的内容视图)它将无法正常工作。
答案 4 :(得分:0)
如果您不反对单身人士,一种可能性就是让您的产品的UINavigationController对象成为一个单例,可以从(例如)您的应用程序委托中访问。
你会这样调用它:
[[((MyApplicationDelegate*)[UIApplication delegate]) navController]
pushViewController: viewControllerToPush animated: YES];
在MyApplicationDelegate中,navController返回单例对象。
答案 5 :(得分:0)
LogEntryDetailViewController *leController = [[LogEntryDetailViewController alloc] initWithNibName:@"LogEntryDetailView" bundle:[NSBundle mainBundle]];
[leController setTitle:[NSString stringWithFormat:@"%@", [logEntriesArray objectAtIndex:row]]];
[[self navigationController] pushViewController:leController animated:NO];
[leController release], leController = nil;