【问题标题】:iOS4 - custom uiview accessing UINavigation stackiOS4 - 自定义 uiview 访问 UINavigation 堆栈
【发布时间】:2011-11-11 11:36:38
【问题描述】:

对这个有点困惑,所以请耐心等待......

我有一个运行良好的基于​​导航的项目。我正在尝试创建我的第一个自定义 UIView 来制作几个我将在多个地方使用的按钮。其中一个按钮需要在单击时将视图控制器推入导航,但我不知道该怎么做。

当我在我正在使用的视图控制器中设置按钮时:

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

但是 self.navigation 控制器现在不能工作了,是吗?如何访问将要添加此 uiview 的 viewcontroller 的导航控制器?

希望至少其中一些有意义,正如我所说,这是我第一次尝试子类化 uiview 并将其添加到多个页面,所以我有点迷路了。

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

【问题讨论】:

  • 你的App是只有一个导航控制器还是多个。
  • app 一开始只在代理中设置了一个导航控制器

标签: iphone ios4 uiviewcontroller navigation


【解决方案1】:

通常你的 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];  
    }

所以现在您可以在您自定义的任何地方处理此事件 查看。

【讨论】:

  • 这行得通,只需要对编码进行少量更改,似乎需要在 (MyAppDelegate *) 之前添加额外的方括号并在最后关闭一个方括号。
【解决方案2】:

使用代码从界面构建器或视图控制器的 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 initializerinitWithNibName: 更简洁,因为它是一个实现细节。

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

【讨论】:

  • 按钮行需要进入几乎每个视图控制器,所以我不想重复相同的代码 - 我正在尝试制作一个可重用的视图,我可以加入并在每个部分都有工作。
【解决方案3】:

实际的控制器需要在导航控制器堆栈中才能推送另一个控制器。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    相关资源
    最近更新 更多