4

我有一个 UINavigationController,我有单独的 UIView,我在使用 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];

我做错了什么 - 或者只是不可能用子视图来做到这一点?

4

6 回答 6

6

当你调用 -pushViewController 时,哪个视图控制器是 self?如果您在其中一个选项卡子视图中调用它,则 self 可能没有从您添加到的顶级视图中对导航控制器的引用。您可以通过从顶级视图中获取导航控制器的内存地址并将其与子视图中的内容进行比较来验证这一点。显然,如果它是 nil 或不匹配,那么这就是你的问题。

当您使用 -pushViewController 将其添加到导航堆栈本身时,您只能“免费”获得一个导航控制器,而您的子视图尚未以这种方式添加。

于 2009-11-06T17:35:46.657 回答
2

在为所有视图实现通用标题时,我遇到了类似的问题经过多次尝试后,我已经修复了它 -

在所有的 viewController

- (void)viewWillAppear:(BOOL)animated {

    [self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];
    [[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES];

}

我已经参考以下帖子 在 iPhone 的多个视图控制器中实现标题视图 Common XIB

[self.view addSubview:[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] view]];     // line will load the header subview 

[[(NavAppAppDelegate *)[[UIApplication sharedApplication] delegate] headerview] viewWillAppear:YES]; // 这是调用 HeaderController 的 viewWillAppear 方法,我们可以在其中编写代码来检查用户是否已登录,并将登录按钮更改为注销按钮等。

于 2012-11-03T17:13:08.480 回答
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];工作。

于 2009-11-06T17:59:41.757 回答
0

我并不完全清楚您的视图层次结构是什么,但一般来说,如果您的导航控制器视图不是窗口的第一个子视图或 Apple 集合视图之一的元素(另一个导航视图控制器的内容视图或选项卡控制器的内容视图)它将无法正常工作。

于 2009-11-06T17:45:28.163 回答
0

如果您不反对单例,一种可能性是使您的产品的 UINavigationController 对象成为单例,可以从(例如)您的应用程序委托访问。

你会这样调用它:

[[((MyApplicationDelegate*)[UIApplication delegate]) navController] 
                pushViewController: viewControllerToPush animated: YES];

在 MyApplicationDelegate 中,navController 返回单例对象。

于 2009-11-06T18:31:32.203 回答
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;
于 2010-11-25T02:17:06.097 回答