美文网首页iOS 开发技巧小知识点好东西
iOS - BaseViewController 的那些事儿

iOS - BaseViewController 的那些事儿

作者: 灵儿菇凉 | 来源:发表于2017-07-21 11:25 被阅读538次

    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];
    其它就不说了,有什么想法再来和小姐姐交流。吃饭去了,饿死。

    相关文章

      网友评论

      • xiAo__Ju:你把tableview放在base里面,怎么兼容collectionlist和grouptableviewdetail?
      • iCode_:要时刻想着解耦
      • PGOne爱吃饺子:大姐姐 help
        PGOne爱吃饺子:@灵儿菇凉 嗯嗯 是啊 我是95的啊
        灵儿菇凉:@4140d18ee6fc 呃呃呃。我很大吗?94的小姐姐:stuck_out_tongue_winking_eye:
      • Link913:完全可以通过代码块。。。
        灵儿菇凉:@SkyHarute 其实我的baseviewcontroller并没有做过多的事情。任何一个controller都可以继承自我的basevc。如果你需要tbv你就去实例化下。不需要的话完全可以按自己想法写。要导航栏就实例化不需要也可以不写,或者自定义导航栏。就算有tbv加不加上拉下拉也是可以选择的。耦合度倒也还好。我只是偷懒在哪里呢?就是如果有tbv我不需要每个controller都去写一遍定义属性。直接self.tableview就可以了。当然还有其它的。当然这也只是一个小尝试,后面如果遇到了坑,我也会继续和大家分享的:relaxed::relaxed::relaxed:
        Link913:@灵儿菇凉 首先作为Base他不宜做过多的事情,他要做的是全部能用上的,你如果想加tableview的上拉下拉的话完全可以在base的基础上再继承一层,总的来说我并不是很推荐继承,设计模式也是推荐我们多使用组合,在iOS这里值得商榷.另外你可以百度下Xcode代码块,也许你可以为偷懒找到一个新方向
        灵儿菇凉:@SkyHarute 大神也可以分享一波。我正好也学习学习
      • 可可_running:如果一个控制器没有使用tableview你该如何继承 uiviewcontroller吗
        灵儿菇凉:@可可_running 还是可以继承这个的,你不实例化就好了。
        灵儿菇凉:@可可_running :smile:
      • 十一岁的加重:觉得博主是男的举手
        十一岁的加重:@灵儿菇凉 大哥别开玩笑了,差点让我笑哭了
        灵儿菇凉:@十一岁的加重 :sweat:为什么?我今天刚好来姨妈都没去上班。
        泰好笑勒:本来就是男的
      • 雨影:其实baseviewcontroller尽量少放东西,尤其是tableview之类的,可能会出现一些奇奇怪怪的bug,以前就被坑过,尽量只放一些全局属性的东西,比如背景颜色,导航栏设置等等的.

      本文标题:iOS - BaseViewController 的那些事儿

      本文链接:https://www.haomeiwen.com/subject/yjgskxtx.html