代码之家  ›  专栏  ›  技术社区  ›  codemonkey

多个视图共享的iPhone工具栏

  •  1
  • codemonkey  · 技术社区  · 14 年前

    我正在构建的应用程序需要在一个UITabbarController框架内为多个视图(及其子视图)显示一个共享的自定义UItoolbar。自定义工具栏的内容在所有视图中都相同。我希望能够将自定义工具栏设计为一个XIB,并处理来自其自己的控制器类的UI事件(我假设我可以子类ui toolbar这样做?)。这样,我就可以定义iboutlet&ibaction项等。然后,我可以将此自定义工具栏与每个uitabbarController视图(及其子视图)相关联。但我很难弄清楚这是否可能——如果可能的话,怎么做。

    特别是,我希望能够将新视图推送到uinavigationcontroller视图堆栈上,每个视图堆栈都与父uitabarcontroller选项卡关联。总之,我想要一个:

    • 自定义工具栏
    • 由多个视图共享
    • 由多个导航控制器管理
    • 导航控制器与父选项卡栏控制器的不同选项卡相关联。

    选项卡栏控制器本身是通过模式启动的,尽管我不认为这是相关的。

    不管怎样,选项卡栏控制器和它的子导航控制器都在工作。我只是想知道如何将共享工具栏持久化到各种子视图上有点困难。我会选择一种干净的好方法来实现程序化…尽管我更希望工具栏的视觉设计保持在XIB中的灵活性。

    有人有什么建议吗

    2 回复  |  直到 14 年前
        1
  •  4
  •   codemonkey    14 年前

    相信 我有“答案”…这很简单,我很尴尬,以前没有发生过。创建uiviewController的自定义子类,在其中设置uinavigationController工具栏的属性(从ib的xib中设置为启用)。然后,从您希望该工具栏包含的其他视图中,您只需对该类进行子类化。在我的例子中,我命名了uiviewcontroller的challengetoolbar子类,然后我这样做:

    UIImage *vaultImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"goldbar" ofType:@"png"]];
    UISegmentedControl *vaultButtonControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:vaultImage, nil]];
    vaultButtonControl.segmentedControlStyle = UISegmentedControlStylePlain;
    vaultButtonControl.momentary = YES;
    [vaultButtonControl addTarget:self action:@selector(goNavVault:) forControlEvents:UIControlEventAllEvents];
    UIBarButtonItem *vaultButton = [[UIBarButtonItem alloc] initWithCustomView:vaultButtonControl];
    vaultButton.customView.frame = CGRectMake(0,0,40,20);
    
    UIBarButtonItem *invite = [[UIBarButtonItem alloc] initWithTitle:@"Invite" style:UIBarButtonItemStyleBordered target:self action:@selector(goNavVault:)];
    
    UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    NSArray *items = [NSArray arrayWithObjects: invite, flexItem, flexItem, flexItem, vaultButton, nil];
    [self setToolbarItems:items animated:NO];
    [vaultButtonControl release];
    [vaultButton release];
    [invite release];
    [flexItem release];
    

    …在ViewDidLoad方法中。然后,在我希望工具栏出现的任何视图中,我只需设置视图的Controller类,将ChallengeToolbar类(而不是uiviewController)划分为子类。啊!

        2
  •  1
  •   David McGraw    14 年前

    一些初步的想法。

    您可能希望将此工具栏保持在选项卡的范围之外,并将发生的事件从工具栏传播到屏幕上的视图。

    现在,工具栏正在管理多个视图,我认为您不能在控制器内的特定视图上浮动组件。

    我通常对我的UI编程进行编码,这样我就可以有精确的控制,所以我不能说从接口生成器管理它有多容易。