iOS导航后退按钮内置自定义UIView XIB(无导航控制器)

时间:2013-12-12 14:44:35

标签: ios iphone uibarbuttonitem back-button uinavigationitem

我有一个应用程序,该应用程序具有可重用的XIB,用于包含在应用程序的每个视图控制器中的视图。

此XIB负责呈现现在不是导航栏的顶部视图。 导航项目不是现在需要的东西。

然而,基于上下文导航,可能需要用户能够返回到先前的视图,并且返回按钮是这种情况的必要条件。

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

我阅读了有关SO的文档和其他问题,告诉我UIBarButtonItem只与nav-controller一起存在。

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

1)我不需要任何地方的后退按钮

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

我应该改变什么?

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

我们非常感谢代码示例。

4 个答案:

答案 0 :(得分:1)

您只需向xib添加按钮即可。并在视图控制器类中实现按钮操作,如下所示:

- (IBAction) backButtonAction
{
    [self.navigationController popViewControllerAnimated:YES];
}

答案 1 :(得分:1)

为要添加导航栏的所有viewcontrollers创建一个公共基本视图控制器。在基类中添加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。

答案 2 :(得分:1)

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

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

由于我不想要标准导航栏,我做了以下内容:

[self.navigationcontroller setnavigationbarhidden:YES];

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

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

[self.navigationController popViewControllerAnimated:YES];

答案 3 :(得分:0)

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

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

我将创建一个基类btBaseViewController.h& btBaseViewController.m。这个类将具有我希望我的所有viewcontrollers都具有的最常见功能

  1. 带按钮的自定义标题视图。
  2. 内容视图。
  3. renderUI的方法。
  4. 启用/禁用backButton的另一种方法。
  5. 在档案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.m viewdidload中将代码编写为

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

    我尽力投射解决方案。你需要进一步调整它。