【问题标题】:What is the proper way to access navbar buttons of a modal view?访问模式视图的导航栏按钮的正确方法是什么?
【发布时间】:2011-02-26 09:06:49
【问题描述】:

我在 IB 中创建了一个带有导航栏和表格的视图。在导航栏上,我放了两个按钮,取消和完成。我将此视图用作模态视图

[self presentModalViewController:controller animated:YES];

我的问题是当我使用时:

[self.navigationItem.rightBarButtonItem setEnabled:YES];

启用右键。它不起作用。

我必须设置一个代表吗?我必须做哪些代码段落?如果我为右键创建一个 IBOutlet 并使用 [doneButton setEnabled:YES],它会起作用,但我认为这不是正确的方法。

【问题讨论】:

    标签: iphone uinavigationbar modal-view


    【解决方案1】:

    为了在界面构建器中的模态视图控制器上放置导航栏(并在详细视图控制器中设置调用操作的栏按钮项),您需要经过一个间接级别(您的导航栏将是在一个 .xib 中,您的详细视图的详细信息将在不同的 xib 中):

    • 创建一个包含导航控制器对象的 xib 文件,并将其根视图控制器设置为您希望使用导航栏以模态方式显示的详细视图控制器。

    • 将条形按钮项添加到细节控制器的导航栏,并将它们连接到细节视图控制器对象中的 IBActions。

    • 您的详细视图控制器需要位于单独的 .xib 文件中

    • 创建一个“加载器”对象,该对象仅用于保存导航控制器 iboutlet,并将其设置为该 xib 的 File's Owner 对象:

    @interface Loader : NSObject
    @property (nonatomic, retain) IBOutlet UINavigationController *navVC;
    @end
    
    @implementation Loader
    @synthesize navVC;
    - (void) dealloc
    {
        [navVC release];
        [super dealloc];
    }
    @end
    

    包含导航控制器的 xib 文件将如下所示:

    确保导航控制器对象连接到“Loader”对象的 navVC 出口,并确保条形按钮项连接到详细视图控制器所需的 IBAction。

    然后你用这段代码展示整个事情:

    Loader *loader = [[[Loader alloc] init] autorelease];
    [[NSBundle mainBundle] loadNibNamed:@"ModalVC" owner:loader options:nil];
    [self presentModalViewController:loader.navVC animated:YES];
    

    【讨论】:

      【解决方案2】:

      委托与您的问题无关。

      您可能确实将导航栏直接放入您的视图中。因此,像 self.navigationItem 这样的东西不起作用。你有两个选择...

      将您的按钮连接到代码中的插座并直接访问它们。

      或者从您的视图中移除导航栏并以这种方式呈现您的视图控制器...

      MyViewController *vc = [[MyViewController alloc] initWith...];
      UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:vc];
      [vc release];
      [self presentModalViewController:navCon animated:YES];
      [navCon release];
      

      ...现在您可以通过 navigationItem 访问左/右按钮。

      【讨论】:

      • 两者之间“更好”的解决方案是什么?我已将导航栏直接放入视图并将完成的按钮连接到一个插座,我会知道这是否是一种不好的编码方式。
      • 视情况而定。一切皆有可能,一切都取决于你的感受。没有一种正确的方法。如果您只有一个视图控制器,请按照自己的方式进行操作。如果您有更多视图控制器、更“复杂”的层次结构等,最好使用 navigationItem。它更清洁、可扩展、可重复使用……
      猜你喜欢
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多