在许多视图上显示相同的 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 的任何子类和我丑陋的支持类。

注意事项:

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

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

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

【问题讨论】:

【参考方案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`

在两个视图上显示相同的弹出窗口

用于在许多 ViewControllers 上显示标签的自定义 UIView?