2010-05-27 95 views
1

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

特别是,我希望能够将新视图推送到每个与父UITabBarController选项卡关联的UINavigationController视图堆栈。因此,要总结,我想:

  • 自定义工具栏
  • 通过
  • 这是由多个导航控制器
  • 和导航控制器管理与父标签的不同标签相关的多个视图共享酒吧控制器

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

无论如何,标签栏控制器正在工作,其子控件也是如此。我只是在确定如何将共享工具栏保存到各个子视图时遇到一些麻烦。我希望以编程方式实现一个很好的干净方式......但我更喜欢将工具栏的视觉设计保留在xib中的灵活性。

任何人有任何建议

+0

更新...我一直在玩,试图看看我的主要应用程序代表保留的单例中是否可以存储传递给[self setToolbarItems:items animated:NO]的数组的内容...但我遇到问题。我确信这个想法很愚蠢,有一些原因。如果我真的知道自己在做什么,我相信这对我而言可能是显而易见的。 – codemonkey 2010-05-28 01:28:45

回答

4

相信我有“答案”...它很简单,我很尴尬,它现在没有出现在我面前。创建UIViewController的自定义子类,在其中设置UINavigationController工具栏的属性(在IB中的xib中设置为启用)。然后,从您希望包含该工具栏的其他任何视图开始,您只需将该类继承下来。就我而言,我命名的UIViewController的ChallengeToolbar子类,那么我这样做:viewDidLoad方法中

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]; 

...。然后,从任何我希望我的工具栏出现的视图中,我只需设置视图的控制器类来继承我的ChallengeToolbar类而不是UIViewController。 DUH!

1

一些初步的想法。

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

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

我通常编写我的用户界面程序,所以我可以精确控制,所以我不能说从界面生成器管理它是多么容易。

+0

感谢您的回应...即使这样的一般反馈对我来说也是有价值的。即使知道更有经验的Objective-C程序员也不会立即看到解决方案,这很有帮助。如果我知道没有一些我不了解的微不足道的解决方案,我会花更多的时间找到解决方案。 – codemonkey 2010-05-28 01:32:03