在许多视图上显示相同的UIBarButtonItem

时间:2015-05-12 07:50:33

标签: ios uibarbuttonitem objective-c-category swrevealviewcontroller

我在iOS应用程序中遇到问题,我正在寻求帮助。我对iOS编程比较陌生,我确信我的问题有一些相对简单的解决方案。

首先,我将解释应用程序的层次结构:

  • 它使用UITabBarController来显示几个不同的屏幕。
  • 它使用SWRevealViewController来显示侧边栏
  • 可从应用程序导航栏中的Bar按钮项访问侧栏。

应用程序使用SWRevealViewController https://github.com/John-Lluch/SWRevealViewController并不直接影响我所遇到的问题。如果您不熟悉此代码库,只需考虑始终显示的简单栏按钮。

现在问题:

  • 我要显示的栏按钮与几行代码相关联。 (A property声明和一些方法)。
  • 此代码应该用于应用程序中不同视图控制器的主要部分。

现在在正常情况下,我只是将UIViewController子类化,并使其成为我应该显示此按钮的所有视图的超类。但是,我的应用程序还应该显示其他类型的视图,例如UITableViewController,因此子类化不会解决整个问题。

如果Objective-C支持多重继承,我会创建一个包含此代码的类,让我的其他类同时扩展UIViewController的任何子类和我丑陋的支持类。

注意:

  • 目前,我的应用基于故事板
  • TabBarController指向多个UINavigationController s,而不指向任何没有导航栏的视图。
  • 我尝试用Objective-c Category实现这个,我在UIViewController中添加了一个类别来设置我的UIViewController。但是当我需要为按钮添加@Property并将其链接到XIB / Storyboard时,我就陷入了这个解决方案的困境。从这篇文章Add the same UIBarButtonItem to several UIViewControllers得到了这个想法,但它并没有包含任何细节。

tl; dr:我想在我的许多应用程序视图中显示相同的UIBarButtonItemUIBarButtonItem与某些代码相关联,对于所有这些视图也是如此。

实现这一目标的好方法是什么?

2 个答案:

答案 0 :(得分:0)

如果我理解正确的话。
您想要显示所有UIViewControllers的按钮。

有很多方法可以实现这一目标。请试试这个。
1.使用XIB创建UIView的子类。它包含您的按钮。创建属性和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?

答案 1 :(得分:0)

我现在已经解决了这个问题,我将在此处发布以供参考:

这解决了向项目中的多个视图添加侧边栏按钮的问题,但代码应该可用于任何UIBarButton。解决方案是为Category创建UIViewController,指定设置方法。从不同的视图调用此设置方法。

类别.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