1

我正在构建的应用程序需要在 UITabBarController 框架内为多个视图(及其子视图)显示一个共享的自定义 UIToolbar。自定义工具栏的内容在所有视图中都是相同的。我希望能够将自定义工具栏设计为 xib 并从其自己的控制器类处理 UI 事件(我假设我可以继承 UIToolbar 来这样做?)。这样我可以定义 IBOutlet 和 IBAction 项目等。然后我可以将此自定义工具栏与每个 UITabBarController 视图(及其子视图)相关联。但我很难确定这是否可能——如果是的话,该怎么做。

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

  • 自定义工具栏
  • 由多个视图共享
  • 由多个导航控制器管理
  • 并且导航控制器与父标签栏控制器的不同标签相关联

标签栏控制器本身以模态方式启动,但我不认为这是相关的。

无论如何,标签栏控制器正在工作,它的子导航控制器也是如此。我只是在弄清楚如何将共享工具栏持久保存到各种子视图时遇到了一些麻烦。我会满足于以编程方式实现的一种很好的干净方式......虽然我更喜欢将工具栏的视觉设计保留在 xib 中的灵活性。

大家有什么建议

4

2 回答 2

4

相信我有“答案”......而且它是如此简单,我很尴尬,我以前没有想到它。创建 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 方法中。然后,从我希望我的工具栏出现的任何视图中,我只需将视图的控制器类设置为我的 ChallengeToolbar 类而不是 UIViewController 的子类。呃!

于 2010-05-29T00:53:09.240 回答
1

一些初步的想法。

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

就目前而言,工具栏管理着多个视图,我不相信您可以让组件浮动在控制器内部的特定视图之上。

我通常对我的 UI 编程进行编码,以便我可以进行精确控制,所以我不能说从 Interface Builder 管理它是多么容易。

于 2010-05-28T00:51:44.247 回答