自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)

Posted

技术标签:

【中文标题】自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)【英文标题】:iOS navigation back button inside custom UIView XIB (without navigation controller) 【发布时间】:2013-12-12 14:44:34 【问题描述】:

我有一个应用程序的每个视图控制器中都包含一个视图的可重用 XIB。

这个 XIB 负责渲染当前不是导航栏的顶部视图。 现在不需要导航项。

但是,基于上下文导航,用户可能需要能够返回到上一个视图,并且在这种情况下需要返回按钮。

我想让这个后退按钮成为这个可重复使用的 XIB 的一部分,它在每个场景中形成顶视图 - 但只是有条件的,而不是无处不在。

我阅读了有关 SO 的文档和其他问题,这些问题告诉我 UIBarButtonItem 仅与导航控制器一起存在。

我认为这对我来说太过分了,因为:

1) 我不需要到处都有返回按钮

2) 我不需要导航栏的外观作为顶栏。我的顶栏已经在我的 XIB 中设计好了。

我应该改变什么?

我的 XIB?如果我可以在这里为后退按钮创建插座并根据我所在的视图控制器隐藏它们,那将是一个非常受欢迎的解决方案。 我的 XIB 视图 .m 文件? 我想要返回按钮的视图控制器代码?

非常感谢有代码的示例。

【问题讨论】:

【参考方案1】:

您可以简单地将按钮添加到 xib。并在视图控制器类中实现按钮动作如下:

- (IBAction) backButtonAction

    [self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案2】:

创建一个基本的 UIViewController 并不是一个很好的选择,因为我只是想在几个屏幕中使用这个后退按钮,没有必要为它创建一个完整的基类。

最后,我所做的是不可避免的:将第一个视图控制器嵌入到导航控制器中。 然后从第一个 VC 向所有其他 VC 推送 Segue。

因为我不想要标准导航栏,所以我做了以下操作:

[self.navigationcontroller setnavigationbarhidden:YES];

对于后退按钮,我在自己的自定义 XIB 视图中添加了一个自定义 UIButton,并在给定的视图控制器中有条件地隐藏/显示它。

在显示它的后退按钮上,我添加了一个可以执行以下操作的目标:

[self.navigationController popViewControllerAnimated:YES];

【讨论】:

【参考方案3】:

为您要添加导航栏的所有视图控制器创建一个通用的基本视图控制器。在基类中添加您的 XIB 并在基类中创建一个函数来启用和禁用后退按钮。

MyBaseClassVC.h

@interface MyBaseClassVC : UIViewController

@property (nonatomic, strong) UIView *titleBarView;

- (void) enableBackButtonInTitleBar;

//you can customize your back button with diff image and selector
- (void) enableBackButtonInTitleBarWithImageName:(NSString*)imageName andSelectorName:(NSString*)selectorName;

@end

MyBaseClassVC.m

......

/**
 * Enable the Left or Back Button
 */
- (void) enableBackButtonInTitleBar


UIImage *leftBarButtonImage = [UIImage imageNamed:@"Back_btn"];
UIButton *rightBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
rightBarButton.bounds = CGRectMake( 0, 20, leftBarButtonImage.size.width, leftBarButtonImage.size.height);
[rightBarButton setImage:leftBarButtonImage forState:UIControlStateNormal];
[rightBarButton addTarget:self action:@selector(backToPreviousPage) forControlEvents:UIControlEventTouchUpInside];

[topbarview addsubview rightBarButton];

.....

在其他 viewcontroller 中子类化这个 viewcontroller。

【讨论】:

【参考方案4】:

对于这种情况,您需要考虑应用程序类的设计。我给你一个非常简单的例子,它会让你想到一个称为“继承”的 OOP 概念。

您可以调整代码以使用您的标头(即 XIB)

我将创建一个基类btBaseViewController.hbtBaseViewController.m。这个类将具有我希望我的所有视图控制器都拥有的最常见的功能

    带有按钮的自定义标题视图。 内容视图。 一种渲染UI的方法。 另一种启用/禁用后退按钮的方法。

在文件btBaseViewController.h 中将其设为这样。

#import <UIKit/UIKit.h>

@interface btBaseViewController : UIViewController

@property(nonatomic, retain) btHeader *headerView;

-(void)showHeaderViewWithBackButton:(BOOL)backButton;

@end

btBaseViewController.m中实现方法为

-(void)showHeaderViewWithBackButton:(BOOL)backButton 
    // Now implement this method in a way to show the backbutton or not depending on 
    [headerView.backButton setAlpha:backButton];

现在假设你有btHomeViewController,它从btBaseViewController派生而来

#import "btBaseViewController.h"

@interface btHomeViewController : btBaseViewController

@end

btHomeViewController.mviewdidload中写代码为

-(void)viewDidLoad 
    if(self.navigationController.viewControllers.count >=2 ) 
     // it means you have some thing on viewcontroller & you can go back
      [self showHeaderViewWithBackButton:YES];
    

我已尽力提出解决方案。您需要对其进行更多调整。

【讨论】:

以上是关于自定义 UIView XIB 内的 iOS 导航返回按钮(无导航控制器)的主要内容,如果未能解决你的问题,请参考以下文章

iOS:使用 xib 的自定义视图

为啥自定义 xib 需要 UIView 属性

Xib 自定义 UIView 的实例化

UIView:从自定义 XIB 加载导致崩溃

使用 XIB 创建自定义 UIView

使用自定义 uiview xib