2011-11-11 52 views
0

与此混淆的一点,所以忍受着我...iOS4 - 自定义uiview访问UINavigation堆栈

我有一个基于导航的项目工作正常。我试图创建我的第一个自定义的UIView来制作几个按钮,我将在多个地方使用它们。点击时,其中一个按钮需要将视图控制器放入导航中,但我不知道如何执行此操作。

当我有按钮可以设置我使用的是视图控制器内:

LocationViewController *controller = [[LocationViewController alloc] initWithNibName:@"LocationViewController" bundle:nil]; 
     [self.navigationController pushViewController:controller animated:YES]; 
     [controller release]; 

但self.navigation控制器不会现在的工作,会吗?如何访问将此uiview添加到视图控制器的导航控制器?

希望至少有一些是有道理的,因为我说这是我第一次对uiview进行子类化并将其添加到多个页面,所以我有点失落。

编辑添加 - 我有按钮单击自定义UIView内的事件,所以这就是我试图改变viewcontroller。我是否应该将事件添加到视图添加视图的任何视图控制器中?

+0

你的应用程序只有一个导航控制器或多个。 – iOSPawan

+0

应用程序在开始时只有一个导航控制器设置在代理右侧 – Dave

回答

0

通常你的appDelegate有一个UINavigationController属性。您可以访问它在你的自定义视图这样的:

UINavigationController *navController = (MyAppDelegate *)[[[UIApplication sharedApplication] 
     delegate] navigationController]; 

但更有效的办法是让委托方法为您的自定义视图,并在您的viewController处理按钮操作。

MyCustomView.h 

    @protocol MyCustomViewDelegate 
    @interface MyCustomView : UIView { 
     id<MyCustomViewDelegate> cvDelegate; } 
    @property(nonatomic, assign) id<MyCustomViewDelegate> cvDelegate; 

    @protocol MyCustomViewDelegate @optional 
    -(void)didClickInCustomView:(MyCustomViewDelegate*)view withData:(NSObject*)data; 
    @end 

MyCustomView.m

- (void)myButtonClick:(id)sender 
    { 
     [self.cvDelegate didClickInCustomView:self withData:someData]; 
    } 

所以现在你可以在你的自定义视图 任何地方处理此事件。

+0

这看起来像我所需要的,谢谢,我会给它一个去。 – Dave

+0

这个工作,伴随着一个小的编码改变,似乎需要在(MyAppDelegate *)之前加一个方括号,并在结尾处关闭一个。 – Dave

0

从界面生成器或从视图控制器的viewDidLoad使用的代码添加按钮:

CGRect frame = CGRectMake(0, 0, 24, 24); 
UIButton *button = [[UIButton alloc] initWithFrame:frame]; 
[button addTarget:self action:@selector(handleMyButton:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:button]; 

然后实现在您的视图控制器-(void)handleMyButton:(id)sender {};。或者,您可以改为使用界面构建器编写-(IBAction)handleMyButton:(id)sender {};并链接方法和按钮。

然后在方法里面粘贴上面发布的代码块。如果你开始使用Xcode导航控制器模板项目,它应该工作。

我认为它更清洁hide the designated initializer initWithNibName:因为它是一个实现细节。

当你说你是继承UIView我不知道你的意思。如果你想用自定义视图添加另一个视图控制器,只需使用UIViewController模板并自定义XIB文件,除非你真的修改它的行为,否则不需要继承UIView,我猜你不会。该视图是一个视图,控制器的东西像处理按钮应该在控制器中。

+0

尽管按钮行需要进入几乎每个视图控制器,所以我不想重复相同的代码 - 我试图使一个可以重复使用的观点,我可以在每个部分都投入工作。 – Dave

+0

啊,那么有道理。 – Jano

0

实际控制器需要位于导航控制器堆栈中以便能够推动另一个控制器。

或者您可以制作一个新的导航控制器实例并推送您的LocationViewController。