Xcode 如何构造UINavigation控制器和关联的视图控制器以进行事件处理?

Xcode 如何构造UINavigation控制器和关联的视图控制器以进行事件处理?,xcode,ios,uinavigationcontroller,Xcode,Ios,Uinavigationcontroller,我有一个UINavigationController,它需要管理多个视图控制器。导航控制器位于下面的Take.m中,每个视图控制器都位于其自己的文件中,请参见下面的CamverViewController.m。作为一名新的XCode开发人员,我正试图弄清楚如何构造应用程序,以便诸如点击导航栏中的按钮之类的事件可以访问导航控制器的实例,从而更改活动视图控制器。我了解如何操作视图控制器,但需要一些关于设置事件处理的建议 注意:我已经从样本源中删除了不相关的方法 任何参考资料、样品、建议,不胜感激 该

我有一个UINavigationController,它需要管理多个视图控制器。导航控制器位于下面的Take.m中,每个视图控制器都位于其自己的文件中,请参见下面的CamverViewController.m。作为一名新的XCode开发人员,我正试图弄清楚如何构造应用程序,以便诸如点击导航栏中的按钮之类的事件可以访问导航控制器的实例,从而更改活动视图控制器。我了解如何操作视图控制器,但需要一些关于设置事件处理的建议

注意:我已经从样本源中删除了不相关的方法

任何参考资料、样品、建议,不胜感激

该类在那里,UINavigationController和顶级视图控制器被实例化

以.m源为例

@implementation Take

+ (UINavigationController*) createController {

//Controllers for navigation interface
CameraViewController *cameraViewController=[[CameraViewController alloc]init];

UINavigationController *navigationController=[[UINavigationController alloc]initWithRootViewController:cameraViewController];
navigationController.toolbarHidden=NO;

//Create tab bar item
navigationController.title=@"Take";
UITabBarItem *tabBarItem=[[UITabBarItem alloc]initWithTitle:@"Take" image:NULL tag:0];
navigationController.tabBarItem=tabBarItem;

[navigationController.view.window addSubview:navigationController.view];

return navigationController;
}

@end
这是顶层视图控制器,其中包含导航栏和右侧按钮,单击/点击该按钮时,需要更改导航控制器中的视图。当此事件被捕获时,主要问题是如何访问Take.m中的导航控制器以操作活动视图控制器? CameraViewController.m

@implementation CameraViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization

    //Navigation bar items
    [self configureNavigationBarItems];

    //Toolbar for navigation interface
    [self configureToolbarItems];

}
return self;
}

-(void) configureNavigationBarItems{

//Add navigation bar items
//    [navigationController setNavigationBarHidden:YES];
UIBarButtonItem *categorizeButton=[[UIBarButtonItem alloc]initWithTitle:@"Categorize" style:UIBarButtonItemStylePlain target:self action:@selector(categorizeButtonHandler:)];
self.navigationItem.rightBarButtonItem=categorizeButton;

}

-(void) configureToolbarItems{

UISegmentedControl *options=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"Photo",@"Video", nil]];
options.segmentedControlStyle=UISegmentedControlStyleBar;
options.selectedSegmentIndex=0;
[options addTarget:self action:@selector(toggleSorting:) forControlEvents:UIControlEventValueChanged];

UIBarButtonItem *optionButton=[[UIBarButtonItem alloc]initWithCustomView:options];
UIBarButtonItem *spacer=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];

self.toolbarItems=[NSArray arrayWithObjects:spacer,optionButton,spacer, nil];

}


#pragma mark - Event Handlers

- (void)categorizeButtonHandler:(id)sender
{
UIBarButtonItem *barButton=(UIBarButtonItem*)sender;

//How to access the navigation controller here???

}

@end

它可能看起来有点颠倒,但UINavigationController被设计为位于视图控制器层次结构的顶部。所以,您不应该在UIViewController中实例化导航控制器,我假设Take.m是

您在视图控制器中构建的屏幕顶部显示了导航栏,这一事实可能会使视图控制器似乎包含导航控制器,但实际上并没有。UINavigationController为您在视图控制器上方插入导航栏,或者您可以将其关闭,然后UINavigationController通过调用push和pop提供了一种处理屏幕切换的好方法

尝试将UINavigationController作为rootViewController直接添加到窗口中,然后将UIViewController推到堆栈上以显示第一个屏幕

然后使用以下方法访问UINavigationController:

self.navigationController
从视图控制器中,将为您设置navigationController属性,您可以推送新的VC、pop self或使用SetViewController设置新的VC配置