如何构建导航控制器和关联的视图控制器以进行事件处理?

时间:2011-04-08 17:19:20

标签: xcode ios uinavigationcontroller

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

注意:我已从示例源中删除不相关的方法。

任何参考,样品,建议,赞赏。

这个类是在那里实现UINavigationController和顶级视图控制器。

Take.m Source

@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

1 个答案:

答案 0 :(得分:0)

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

您在视图控制器中构建的屏幕顶部显示导航栏的事实可能会使您的视图控制器看起来包含导航控制器 - 但事实并非如此。 UINavigationController为您在视图控制器上方插入导航栏(或者您可以关闭它,然后UINavigationController只是通过调用push和pop来提供处理屏幕切换的好方法)。

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

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

self.navigationController
来自视图控制器的

(将为您设置navigationController属性),您可以使用setViewControllers推送新的VC,弹出自我或设置新的VC配置。