【iOS】UIViewController基类的实现
继承是面向对象编程语言的三大特性之一,写好基类会给App的开发带来极大的方便。在iOS开发中,一般一个页面就对应一个ViewController,ViewController在开发中用的也很多,写一个好的ViewController的基类,会让开发变得轻松很多。
可以写一个BaseViewController,继承自UIViewController,在这里可以实现一些整个项目里ViewController的公共方法,最常用的就是导航栏相关的。一般App在设计的时候,导航栏的风格都比较同意,导航栏相关的方法可以放在基类里面实现,然后让其他的功能ViewController继承BaseViewController,这样导航栏部分就不用每个界面都处理了。
下面是我自己写的一个BaseViewController,具体的实现也要看App的主要功能,基类一般实现共性的功能,代码仅供参考,有更好建议的也欢迎评论留言交流。
BaseViewController.h代码:
#import <UIKit/UIKit.h>
@interface BZBaseViewController : UIViewController
//返回按钮
@property(nonatomic,strong) UIButton * backButton;
//导航栏标题
@property(nonatomic,strong) UILabel * navigationTitleLabel;
//导航栏右按钮(图片)
@property(nonatomic,strong) UIButton * rightButton;
//导航栏右按钮(文字)
@property(nonatomic,strong) UIButton * rightTextButton;
//为了灵活的满足不同的ViewController,将set方法放到.h文件,供子类调用
-(void)setupNavigationItem;
-(void)setBackButton;
-(void)setRightButton;
-(void)setNavigationTitleLabel;
-(void)setRightTextButton;
//返回按钮和右按钮点击方法,如果需要实现不同的方法,子类可以重新该方法
-(void)navBackClick;
-(void)navRightClick;
-(void)navRightTextClick;
@end
BaseViewController.m代码:
#import "BZBaseViewController.h"
@interface BZBaseViewController ()
@end
@implementation BZBaseViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //ViewController的背景颜色,如果整个App页面背景颜色比较统一,建议在这里设置
    self.view.backgroundColor = COLOR_COMMON_LIGHTGRAY;
    //设置导航栏
    [self setupNavigationItem];
    self.navigationController.navigationBar.translucent = NO;
    self.navigationItem.hidesBackButton = YES;
    if (iOS11) {
    //scrollerView在导航栏透明时不下压
        [[UIScrollView appearance] setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
    }else{
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
}
-(void)setupNavigationItem{
//导航栏背景
    UIImage * image =  [[UIImage imageNamed:@"img_navigationbar_bg"]
                        resizableImageWithCapInsets:UIEdgeInsetsMake(-1, 0, 0, 0) resizingMode:UIImageResizingModeStretch];
    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
}
-(void)setBackButton{
//设置返回按钮
    UIBarButtonItem * backBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.backButton];
    self.navigationItem.leftBarButtonItem = backBarButton;
}
-(void)setRightButton{
//设置右按钮(图片)
    UIBarButtonItem * rightBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.rightButton];
    self.navigationItem.rightBarButtonItem = rightBarButton;
}
-(void)setRightTextButton{
//设置右按钮(文字)
    UIBarButtonItem * rightBarButton = [[UIBarButtonItem alloc] initWithCustomView:self.rightTextButton];
    self.navigationItem.rightBarButtonItems = @[[self getNavigationSpacerWithSpacer:0],rightBarButton];
}
-(void)setNavigationTitleLabel{
//设置标题
    self.navigationItem.titleView = self.navigationTitleLabel;
}
-(UIBarButtonItem *)getNavigationSpacerWithSpacer:(CGFloat)spacer{
//设置导航栏左右按钮的偏移距离
    UIBarButtonItem *navgationButtonSpacer = [[UIBarButtonItem alloc]
                                              initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
    navgationButtonSpacer.width = spacer;
    return navgationButtonSpacer;
}
#pragma mark - lazy 各控件的初始化方法
-(UIButton *)backButton{
    if (!_backButton) {
        _backButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _backButton.frame = CGRectMake(0, 0, 50, 40);
        [_backButton setImage:[UIImage imageNamed:@"button_nav_back"] forState:UIControlStateNormal];
        _backButton.titleLabel.font = [UIFont systemFontOfSize:17];
        [_backButton setContentEdgeInsets:UIEdgeInsetsMake(0, -40, 0, 0)];
        [_backButton addTarget:self action:@selector(navBackClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _backButton;
}
-(UIButton *)rightButton{
    if (!_rightButton) {
        _rightButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _rightButton.frame = CGRectMake(0, 0, 40, 40);
        [_rightButton addTarget:self action:@selector(navRightClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _rightButton;
}
-(UIButton *)rightTextButton{
    if (!_rightTextButton) {
        _rightTextButton = [UIButton buttonWithType:UIButtonTypeCustom];
        _rightTextButton.frame = CGRectMake(0, 0, 60, 40);
        _rightTextButton.titleLabel.font = [UIFont systemFontOfSize:17];
        [_rightTextButton addTarget:self action:@selector(navRightTextClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _rightTextButton;
}
-(UILabel *)navigationTitleLabel{
    if (!_navigationTitleLabel) {
        _navigationTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH - 150, 30)];
        _navigationTitleLabel.font = [UIFont systemFontOfSize:17];
        _navigationTitleLabel.textColor = [UIColor whiteColor];
        _navigationTitleLabel.textAlignment = NSTextAlignmentCenter;
    }
    return _navigationTitleLabel;
}
#pragma mark - click 导航栏按钮点击方法,右按钮点击方法都需要子类来实现
-(void)navBackClick{
    [self.navigationController popViewControllerAnimated:YES];
}
-(void)navRightClick{
}
-(void)navRightTextClick{
}
写好基类之后,让其他页面继承于该基类,导航栏相关的设置直接调用这里面的方法即可,子类主要用来写自己的功能性代码就好,用起来也是很方便的。
当然如果要开发的App每个页面的导航栏差异比较大,UI风格也相差比较大的话可能就不太实用了,合适的才是最好的,需不需要基类、需要什么样的基类还是看具体项目。希望能给开发的小伙伴们带来帮助。
【iOS】UIViewController基类的实现的更多相关文章
- 无线客户端框架设计(3):基类的设计(iOS篇)
		本文代码:YoungHeart-Chapter-03.zip 没有基类的App都不是好App. 因为iOS使用的是mvc模式的开发模式,所以,业务逻辑基本都在每个页面相应的ViewController ... 
- iOS Foundation 框架基类
		iOS Foundation 框架基类 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转 ... 
- iOS 基于MVC设计模式的基类设计
		iOS 基于MVC设计模式的基类设计 https://www.jianshu.com/p/3b580ffdae00 
- iOS控制器之基类设计
		题记 在进入新公司后.经过这一个月的重构项目,终于把项目做到了个人相对满意的程度(还有一种不满意的叫老板的需求,提过多次意见也没用= =!).在这次重构中按照以前的思路设计出了个人觉得比较适用的一个基 ... 
- 【iOS】 含tableView的ViewController基类的实现
		上篇博客写了ViewController的基类的实现,这篇博客主要写在BaseViewController的基础上实现一个含tableView控件的基类的实现,主要给包含tableView的页面来继承 ... 
- ios中解析json对象基类
		这个是对上面一篇写的一个解析json对象的基类 @interface BaseObjectFromJson : NSObject + (id) objectWithDict:(NSDictionary ... 
- iOS多线程常用类说明--备用参考
		iOS的多线程,涉及到如下一些类,这里集中做个介绍,免得混淆. 1.NSTimer 很显然,这是定时器类 2.NSTask iOS 不支持 NSTask 在很多并发操作的时候,多线程太耗资源,也太危险 ... 
- 基类中定义的虚函数在派生类中重新定义时,其函数原型,包括返回类型、函数名、参数个数、参数类型及参数的先后顺序,都必须与基类中的原型完全相同  but------> 可以返回派生类对象的引用或指针
		您查询的关键词是:c++primer习题15.25 以下是该网页在北京时间 2016年07月15日 02:57:08 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. ... 
- IOS上传图片方法类
		IOS上传图片方法类 iPhone开发中遇到上传图片问题,找到多资料,最终封装了一个类,请大家指点,代码如下 // // RequestPostUploadHelper.h // demodes ... 
随机推荐
- mybatis-配置文件mybatis-config.xml
			在mybatis-config.xml中有初始的配置: <!-- 对事务的管理和连接池的配置 --> <environments default="development& ... 
- IE浏览器清除缓存没用
			再想买更新JS和css文件之后, 使用 internet 里面的删除选项 发现样式和事件还是没用变 最终发现 需要 按 f12 找到这个清缓存才正常解决问题 
- DBI-1.634之selectrow_array与fetchrow_array的区别
			在DBI-1.634使用手册里有一个selectrow_array函数,该函数具体说明如下: This utility method combines "prepare", &qu ... 
- analyzing problems
			If you talking to a friend or talking to a family member ,you can say:what's the metter or What's go ... 
- New FileReader上传图片
			function readURL(input) { if (input.files && input.files[0]) { var reader = new FileReader() ... 
- getPropertyValue   获取CSS样式
			新学习一个js 的方法 getPropertyValue (实现 js框架中 css 的最终调用的函数),取得元素最终计算出的css 样式 DEMO: <!DOCTYPE html> ... 
- 【Flask】 网站的用户管理
			网站用户管理 不知道为什么很多学习Flask的人都是从搭博客开始的(大概是因为那本书的案例是博客,同时对bootstrap支持良好,bootstrap又是twitter开发的吧..)既然是搭建博客,就 ... 
- newInstance()和new()的区别
			转载:http://www.jobui.com/mianshiti/it/java/7148/ newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何pub ... 
- spring-boot-devtools
			Create a new Maven Project and we have two class under the package com.example.demo like below scr ... 
- 小程序实现非swiper组件的自定义伪3D轮播图
			效果如下: 我用了很笨的方法实现的,大致就是: 1.当前点击的div(view)如果前后都有内容,那么,当前div(view)就设置到中间,前一个就设置到左边,前一个的前面所有全部设置到最左边,后面一 ... 
