我有一个应用程序,该应用程序具有可重用的XIB,用于包含在应用程序的每个视图控制器中的视图。
此XIB负责呈现现在不是导航栏的顶部视图。 导航项目不是现在需要的东西。
然而,基于上下文导航,可能需要用户能够返回到先前的视图,并且返回按钮是这种情况的必要条件。
我想让这个可重复使用的XIB的Back按钮成为每个场景内部的顶视图 - 但只是有条件的,而不是无处不在。
我阅读了有关SO的文档和其他问题,告诉我UIBarButtonItem只与nav-controller一起存在。
我认为这对我来说太过分了,因为:
1)我不需要任何地方的后退按钮
2)我不需要导航栏作为顶栏。我的顶栏已经在我的XIB中设计。
我应该改变什么?
我们非常感谢代码示例。
答案 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都具有的最常见功能
在档案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];
}
}
我尽力投射解决方案。你需要进一步调整它。