在许多视图上显示相同的 UIBarButtonItem
Posted
技术标签:
【中文标题】在许多视图上显示相同的 UIBarButtonItem【英文标题】:Showing the same UIBarButtonItem on many views 【发布时间】:2015-05-12 07:50:32 【问题描述】:我的 ios 应用程序出现问题,我正在寻求帮助。我对 iOS 编程比较陌生,我确信有一些相对简单的解决方案可以解决我的问题。
首先,我要解释一下应用程序的层次结构:
它使用UITabBarController
来显示几个不同的屏幕。
它使用SWRevealViewController
来显示侧边栏
从应用程序导航栏中的条形按钮项访问侧边栏。
应用程序使用SWRevealViewController
https://github.com/John-Lluch/SWRevealViewController 不会直接影响我遇到的问题。如果您不熟悉此代码库,请考虑始终显示的简单条形按钮。
现在问题来了:
我要显示的栏按钮与几行代码相关联。 (property
声明和一些方法)。
此代码应用于应用程序中不同视图控制器的主要部分。
现在,在正常情况下,我只是将UIViewController
子类化并使其成为我所有应该显示此按钮的视图的超类。但是,我的应用程序还应该显示其他类型的视图,例如 UITableViewController
,因此子类化并不能解决整个问题。
如果Objective-C
支持多重继承,我会创建一个包含此代码的类,并让我的其他类同时扩展UIViewController
的任何子类和我丑陋的支持类。
注意事项:
目前,我的应用基于 StoryboardsTabBarController
指向多个UINavigationController
s,而不是任何没有导航栏的视图。
我已经尝试使用Objective-c
Category
来实现这一点,我在其中向 UIViewController 添加了一个类别,用于设置我的 UIViewController。但是当我需要为按钮添加@Property
并将其链接到 XIB/Storyboard 时,我陷入了这个解决方案。从这篇帖子Add the same UIBarButtonItem to several UIViewControllers 中得到了这个想法,但它不包含任何细节。
tl;dr:我想在我的许多应用程序视图中显示相同的 UIBarButtonItem
。 UIBarButtonItem
与一些代码相关联,这对于所有这些视图也是相同的。
什么是实现这一目标的好方法?
【问题讨论】:
【参考方案1】:如果我理解正确的话。
您想为所有UIViewControllers
显示按钮。
有很多方法可以实现这一点。请试试这个。
1. 创建 UIView 的子类及其 XIB。它包含您的按钮。创建属性和IBAction
。
2. 对这个子类实施您的操作。
3. 在 .m 文件上写入以下代码
- (id)awakeAfterUsingCoder:(NSCoder *)aDecoder
if (![self.subviews count])
NSBundle *mainBundle = [NSBundle mainBundle];
NSArray *loadedViews = [mainBundle loadNibNamed:@"MyView" owner:nil options:nil];
return [loadedViews firstObject];
return self;
其中,MyView 是您的视图的名称。
4. 拖放 UIView
并将其放置在每个 `UIViewController XIB(或您的案例中的情节提要)上,并将其自定义类设置为“MyView”(或您新创建的类的名称)。
5. 运行您的项目。
供参考:May i help you?
【讨论】:
我不确定这是否能解决我的问题...“将其自定义类设置为 MyView”是指仅通用视图,还是指我项目中的所有视图? 为每个视图控制器添加一个占位符视图,并为每个视图控制器将自定义类设置为 MyView。【参考方案2】:我现在已经解决了这个问题,我会在这里发布以供参考:
这解决了向项目中的多个视图添加侧边栏按钮的问题,但代码应该可用于任何UIBarButton
。解决方案是为UIViewController
创建一个Category
,以指定设置方法。这个设置方法是从不同的视图中调用的。
类别 .h 文件:
#import <UIKit/UIKit.h>
@interface UIViewController (SidebarCompliance)
- (void)setupSidebar;
@end
类别 .m 文件:
#import "UIViewController+SidebarCompliance.h"
#import "SWRevealViewController.h"
@implementation UIViewController (SidebarCompliance)
- (void)setupSidebar
SWRevealViewController *revealViewController = self.revealViewController;
if (revealViewController)
UIBarButtonItem *sidebarButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu.png"] landscapeImagePhone:[UIImage imageNamed:@"menu.png"] style:UIBarButtonItemStylePlain target:self.revealViewController action:@selector(revealToggle:)];
self.navigationItem.rightBarButtonItem = sidebarButton;
[self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
@end
然后是我的观点之一:
查看.h文件:
#import <UIKit/UIKit.h>
#import "UIViewController+SidebarCompliance.h"
@interface NumeroUno : UIViewController
@end
查看.m文件:
#import "NumeroUno.h"
@implementation NumeroUno
- (void)viewDidLoad
[super viewDidLoad];
[self setupSidebar];
@end
【讨论】:
以上是关于在许多视图上显示相同的 UIBarButtonItem的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 和许多 NSArrayController
UITableViewCell 中的 UITextField 和模态视图中的验证
如何在 iPad 上显示与 iPhone 相同的视图而不是拆分视图?
在根据条件显示的两个视图上使用相同的 `navigationBarTitle` 和 `navigationBarItems`