iOS - BaseViewController 的那些事儿

OK,小姐姐又来搞事情了,最近正在重构项目,今天就来分享一下项目中baseViewController的写法吧。当然可以视具体业务逻辑进行相应的增删改好吧。
直接上代码吧,直观点咯。

#import <UIKit/UIKit.h>

@interface HQBaseViewController : UIViewController<NavViewDelegate>
@property (nonatomic,strong) NavView * navView;

@property (nonatomic,strong) UITableView *tableView;
@property (nonatomic,strong) NSMutableArray *dataArray;
@property (nonatomic,assign) NSInteger currentPage;
@property (nonatomic,assign) NSInteger preQueryPage;

// 加载数据
-(void)loadData;

//上下拉刷新之后处理
-(void)handleRefreshWithCurrentPage:(NSInteger)currentPage totalPage:(NSInteger)totalPage ;

//添加上下拉刷新
-(void)addTableViewHeaderRefresh:(BOOL)headerRefresh footerRefresh:(BOOL)footerRefresh;

- (void)initNavViewWithRightStr:(NSString *) rightStr andNavTitle:(NSString *) navTitle andType:(NavViewType) type andNavBackgroundColor:(UIColor *)bgColor andTitleColor:(UIColor *)titleColor;

@end

首先主要是一个全局的导航栏咯---NavView (自己封装的,基本适应90%项目需求) 如果导航栏过于奇葩请老老实实再写一个吧,如果很多地方也是一样的奇葩样式建议封装成组件。
接下来就是一个tableview,就小姐姐的项目,90%的页面带tableview,所以把他写在基类里也挺方便的,当然如果没有tableview也无所谓,老老实实控制器该咋写咋写,还有就是把下拉刷新和上拉加载写在基类里,那么就不需要每个有类似功能的页面都写一遍代码,虽然是copy也是挺烦的不是么?有没有和我一样copy也不愿意的小哥哥!😅
接下来看看.m文件把

#import "HQBaseViewController.h"

@interface HQBaseViewController ()
<
UITableViewDelegate,
UITableViewDataSource
>
@end
@implementation HQBaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.backgroundColor = [UIColor whiteColor];
    self.currentPage = 1;
    if (!_dataArray) {
        _dataArray = [NSMutableArray array];
    }
}

-(void)dealloc{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    [[SDImageCache sharedImageCache] clearMemory];//清内存
    [[SDImageCache sharedImageCache] clearDisk];//清内存
    [[SDImageCache sharedImageCache] cleanDisk];//清内存
    // 1.取消正在下载的操作
    [[SDWebImageManager sharedManager] cancelAll];
    // 2.清除内存缓存
    [[SDWebImageManager sharedManager].imageCache clearMemory];
}
-(void)addTableViewHeaderRefresh:(BOOL)headerRefresh footerRefresh:(BOOL)footerRefresh{
    if (headerRefresh) {
        self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction: @selector(loadNewData)];
    }
    if (footerRefresh) {
        self.tableView.mj_footer=[MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
    }
}

-(void)loadNewData{
    self.currentPage=1;
    self.preQueryPage = 0;
    [self.tableView.mj_footer resetNoMoreData];
    [self loadData];
}

-(void)loadMoreData{
    self.currentPage++;
    [self loadData];
}

-(void)loadData{

}

-(void)handleRefreshWithCurrentPage:(NSInteger)currentPage totalPage:(NSInteger)totalPage {
    if (totalPage>0) {
        [self.tableView reloadData];
    }
    if (currentPage>=totalPage) {
        [self.tableView.mj_footer endRefreshingWithNoMoreData];
    }else{
        if (self.preQueryPage != currentPage && currentPage > 0 && currentPage < totalPage && self.tableView.contentSize.height < CGRectGetHeight(self.tableView.frame)) {
            [self loadMoreData];
        }else{
            [self.tableView.mj_footer endRefreshing];
        }
    }
    self.preQueryPage = currentPage;
    
    if ([self.tableView.mj_header isRefreshing]) {
        [self.tableView.mj_header endRefreshing];
    }
}
#pragma mark - 导航栏处理
- (void)initNavViewWithRightStr:(NSString *) rightStr andNavTitle:(NSString *) navTitle andType:(NavViewType) type andNavBackgroundColor:(UIColor *)bgColor andTitleColor:(UIColor *)titleColor
{
    self.navView = [NavView navViewWithBackIcon:nil andRightStr:rightStr andNavTitle:navTitle andType:type andNavBackgroundColor:bgColor andTitleColor:titleColor];
    self.navView.delegate=self;
    [self.view addSubview:self.navView];
}

/**
 * 导航栏左边按钮点击事件
 */
- (void)navViewClickLeftBtn:(NavView *)navView
{
    [self.navigationController popViewControllerAnimated:YES];
}


/**
 * 导航栏右边按钮点击事件 
 */
- (void)navViewClickRightBtn:(NavView *)navView
{
    [self.navigationController popViewControllerAnimated:YES];
}

@end

内容应该都能看懂哦,我挺相信你们的。那看看如何在页面中使用吧。
首先,创建的时候当然是要继承基类啦,要不你写基类干啥对吧😒

#import <UIKit/UIKit.h>

@interface HQMyOrderMainVC : YVBaseViewController

@end

添加导航条只需要

    // 添加导航条
    [self initNavViewWithRightStr:nil andNavTitle:@"我的订单" andType: NavViewTypeLeftIcon andNavBackgroundColor:nil andTitleColor:nil];

视业务需求决定是否需要上拉下拉功能

    // 添加下拉刷新和上拉加载
    [self addTableViewHeaderRefresh:YES footerRefresh:YES];

重写一下load()方法

// 下拉刷新
- (void)loadData {
    HQOrderBaseService *orderBaseService = [HQOrderBaseService defaultOrderBaseService];
    [orderBaseService getOrderList:[NSString stringWithFormat:@"%ld",(long)page] OrderType:status Success:^(NSDictionary *params) {
        [self.contentTbv.mj_header endRefreshing];
        [self.contentTbv.mj_footer endRefreshing];
        if (page==1) {
            if (self.orderCountArr.count!=0) {
                [self.orderCountArr removeAllObjects];
            }
        }
        if (self.orderCountArr.count!=0) {
            totalPage=[params[@"data"][@"pagination"][@"totalPage"] integerValue];
            [self handleRefreshWithCurrentPage:self.currentPage totalPage:totalPage];
        }
    } Error:^(NSString *errorMsg) {
        [MBProgressHUD Message:errorMsg For:self.view yOffset:0];
    } Fail:^(NSError *error) {
        [MBProgressHUD Message:@"请求数据失败!" For:self.view yOffset:0];
    }];
}   

对了如果一进页面没有数据记得调用一下
[self.tableView.mj_header beginRefreshing];
其它就不说了,有什么想法再来和小姐姐交流。吃饭去了,饿死。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,392评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 夏天智等理发人一走,就喊在厨房做饭的四婶出来,看他发型行不行?四婶说:“你嘟嘟囔囔训人家理得不好,我在厨房里听着了...
    姜辣素阅读 73评论 0 0
  • 我真的想不通 有些人怎么会穷到向前女友推销东西了
    once5阅读 164评论 0 0
  • 初次读《围城》的时候,发现它是一部充满了喜剧性讽刺的小说。然而当真正深入围城,去感受城里城外不一般的感觉,就不然发...
    张恒源阅读 234评论 0 0