博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS UIViewController基类的实现
阅读量:2221 次
发布时间:2019-05-08

本文共 5259 字,大约阅读时间需要 17 分钟。

继承是面向对象编程语言的三大特性之一,写好基类会给App的开发带来极大的方便。在iOS开发中,一般一个页面就对应一个ViewController,ViewController在开发中用的也很多,写一个好的ViewController的基类,会让开发变得轻松很多。

可以写一个BaseViewController,继承自UIViewController,在这里可以实现一些整个项目里ViewController的公共方法,最常用的就是导航栏相关的。一般App在设计的时候,导航栏的风格都比较同意,导航栏相关的方法可以放在基类里面实现,然后让其他的功能ViewController继承BaseViewController,这样导航栏部分就不用每个界面都处理了。
下面是我自己写的一个BaseViewController,具体的实现也要看App的主要功能,基类一般实现共性的功能,代码仅供参考,有更好建议的也欢迎评论留言交流。
BaseViewController.h代码:

#import 
@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{}@end

写好基类之后,让其他页面继承于该基类,导航栏相关的设置直接调用这里面的方法即可,子类主要用来写自己的功能性代码就好,用起来也是很方便的。

当然如果要开发的App每个页面的导航栏差异比较大,UI风格也相差比较大的话可能就不太实用了,合适的才是最好的,需不需要基类、需要什么样的基类还是看具体项目。希望能给开发的小伙伴们带来帮助。

转载地址:http://gdifb.baihongyu.com/

你可能感兴趣的文章
探索Redis设计与实现2:Redis内部数据结构详解——dict
查看>>
探索Redis设计与实现3:Redis内部数据结构详解——sds
查看>>
探索Redis设计与实现4:Redis内部数据结构详解——ziplist
查看>>
探索Redis设计与实现6:Redis内部数据结构详解——skiplist
查看>>
探索Redis设计与实现5:Redis内部数据结构详解——quicklist
查看>>
探索Redis设计与实现8:连接底层与表面的数据结构robj
查看>>
探索Redis设计与实现7:Redis内部数据结构详解——intset
查看>>
探索Redis设计与实现9:数据库redisDb与键过期删除策略
查看>>
探索Redis设计与实现10:Redis的事件驱动模型与命令执行过程
查看>>
分布式系统理论基础1: 一致性、2PC和3PC
查看>>
分布式系统理论基础2 :CAP
查看>>
分布式系统理论基础3: 时间、时钟和事件顺序
查看>>
分布式系统理论基础4:Paxos
查看>>
分布式系统理论基础5:选举、多数派和租约
查看>>
分布式系统理论基础6:Raft、Zab
查看>>
分布式系统理论进阶7:Paxos变种和优化
查看>>
分布式系统理论基础8:zookeeper分布式协调服务
查看>>
搞懂分布式技术1:分布式系统的一些基本概念
查看>>
搞懂分布式技术2:分布式一致性协议与Paxos,Raft算法
查看>>
搞懂分布式技术3:初探分布式协调服务zookeeper
查看>>