iOS項目架構(gòu)搭建(2)網(wǎng)絡(luò)工具類和基類控制器

因為是結(jié)構(gòu)方面的東西淑翼,直接給Demo運(yùn)行也是看不出效果的逾雄,而這些代碼都在項目中阀溶,不好放出來,所以嘲驾,我也在整理一個能看到效果的demo供大家參考淌哟,待我整理完,就會放到github上辽故,大家如果想要徒仓,可以關(guān)注下我,我整理完誊垢,會在簡書上通知大家的掉弛。 標(biāo)題不知道應(yīng)該怎么寫症见,感覺怎么寫都不是很合適,接著上一篇繼續(xù)扯下去吧殃饿,先看一下效果吧:

test.gif

這是我剛把這部分的代碼拿出來做的小demo谋作,打開wifi,還不能刷新出數(shù)據(jù)頁面乎芳,是因為電腦連接wifi也要時間滴遵蚜。。奈惑。 說一下吭净,實(shí)現(xiàn)思路,定義一個TCNotInternetView作為無網(wǎng)絡(luò)的時候展示用肴甸,自定義協(xié)議 TCNotInternetViewDelegate寂殉,在View中button的重新加載數(shù)據(jù)方法中發(fā)送委托方法;新建一個UIViewController+TCNotNetController的分類原在,遵守TCNotInternetViewDelegate協(xié)議友扰,并實(shí)現(xiàn)協(xié)議方法,在協(xié)議方中調(diào)用基類的刷新數(shù)據(jù)的方法庶柿,這樣我們在NetUtils中判斷村怪,當(dāng)前控制器的數(shù)據(jù)源數(shù)組是否有數(shù)據(jù),是否有網(wǎng)絡(luò)澳泵,是否顯示無網(wǎng)絡(luò)View判斷实愚,就可以做顯示和移除無網(wǎng)絡(luò)View。大概實(shí)現(xiàn)流程就是這樣了兔辅,哎 我這描述,我自己都看不下去击喂,還是直接show the code吧:

  • 定義一個無網(wǎng)絡(luò)的View
@protocol TCNotInternetViewDelegate  <NSObject>
- (void)reloadNetworkRequest:(id)sender;
@end

@interface TCNotInternetView : UIView
@property (nonatomic, weak) id<TCNotInternetViewDelegate>delegate;
@end
  • 在button是點(diǎn)擊事件里發(fā)送委托方法
- (void)reloadDataAction:(UIButton *)btn {
    if (self.delegate && [self.delegate respondsToSelector:@selector(reloadNetworkRequest:)]) {
        [self.delegate performSelector:@selector(reloadNetworkRequest:) withObject:btn];
    }
} 
  • 接下來 就是定義Viewcontroller 的分類了
- (void)showNotInternetView {
    NSInteger tag = 0;
    for (UIView* view in self.view.subviews) {
        if ([view isKindOfClass:[TCNotInternetView class]]) {
            tag++;
        }
    }
    if(tag>0){
        return;
    }
    CGFloat YY = 64;
    if([self isKindOfClass:[TCBaseViewController class]]){
        YY = 0;
    }
    
    TCNotInternetView  *view = [[TCNotInternetView alloc] initWithFrame:CGRectMake(0, YY, kScreenW, kScreenH-YY)];
    view.delegate = self;
    
    [self.view insertSubview:view belowSubview:[UIApplication sharedApplication].keyWindow];
}

- (void)hiddenNotInternetView {
    for (UIView* view in self.view.subviews) {
        if ([view isKindOfClass:[TCNotInternetView class]]) {
            [view removeFromSuperview];
        }
    }
}

#pragma mark - TCNotInternetViewDelegate
- (void)reloadNetworkRequest:(id)sender{
    if ([self respondsToSelector:@selector(requestDataWithStart:)]) {
        [self performSelector:@selector(requestDataWithStart:)];
    }
} 
  • requestDataWithStart 是基類中刷新數(shù)據(jù)的方法维苔,所有的表格視圖的刷新數(shù)據(jù)方法都要重寫這個方法。

這樣我們就實(shí)現(xiàn)了無網(wǎng)絡(luò)頁面的處理了懂昂,媽媽從此再也不用擔(dān)心沒有網(wǎng)絡(luò)的各種代碼了介时。。

基類控制器

原本在這里事項接著談?wù)劵贛BProgressHUD的封裝凌彬,畢竟在前面有所涉及沸柔,沒有說全面,但考慮基類控制器的作用铲敛,還是優(yōu)先聊聊基類控制器需要做的事情

  • 因為網(wǎng)絡(luò)工具類需要知道當(dāng)前請求的控制器的數(shù)據(jù)源情況褐澎,所以需要定義一個NSMutableArray,而派生類也都要使用這個數(shù)組作為數(shù)據(jù)源數(shù)組
  • 需要提供一個屬性伐蒋,告訴NetUtils當(dāng)沒有網(wǎng)絡(luò)的時候工三,是否顯示無網(wǎng)絡(luò)頁面迁酸,以為有時候,我們沒有網(wǎng)絡(luò)會顯示我們上次本地歸檔的數(shù)據(jù)
  • 加載tableview和刷新控件的方法俭正,當(dāng)子類想用的時候奸鬓,無需再寫一遍,不想用的時候掸读,只需要重寫一下就O了
  • 初始化表格視圖 道理是一樣的串远,當(dāng)父類的表格滿足不了子類的 需要,也可以重寫
  • 顯示無數(shù)據(jù)頁面的展示和隱藏儿惫,這些方法抑淫,直接寫在父類中,子類在請求數(shù)據(jù)的時候姥闪,直接根據(jù)情況調(diào)用就好了
  • 若有需求始苇,當(dāng)前用戶是否登錄,也可以放在這里筐喳,當(dāng)然也可以放在其他地方都可以催式。
@interface TCBaseViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, strong) UIImageView *noDtaView;
@end

@implementation TCBaseViewController

- (void)viewDidLoad {
    [super viewDidLoad];
  
    self.view.backgroundColor = [UIColor whiteColor];
    self.automaticallyAdjustsScrollViewInsets = NO;
    self.isShowNoInternetView = YES;
    self.dataMArr = [NSMutableArray array];
    [self initView];
}

#pragma mark - public method
- (void)initView{
    [self steupTableView];
    [self steupRefreshView];
}

- (void)steupRefreshView {
    __weak typeof (self) weakSelf = self;
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [weakSelf requestDataWithStart:0];
    }];
    
    self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
        [weakSelf requestDataWithStart:weakSelf.dataMArr.count];
    }];
    [self.tableView.mj_header beginRefreshing];
}

- (void)steupTableView {
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    [self.view addSubview:self.tableView];
    
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    
    //設(shè)置內(nèi)容縮進(jìn)
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.height + kStatusBarHigh, 0, 0, 0);
    self.tableView.scrollIndicatorInsets = self.tableView.contentInset;
    
}

- (void)requestDataWithStart:(NSInteger)start{
    //如果子類不實(shí)現(xiàn)、關(guān)閉刷新
    [self.tableView.mj_header endRefreshing];
    [self.tableView.mj_footer endRefreshing];
}

- (void)showNoDataImage {
    _noDtaView = [[UIImageView alloc] init];
    [_noDtaView setImage:[UIImage imageNamed:@"generl_nodata"]];
    
    [self.view.subviews enumerateObjectsUsingBlock:^(__kindof UITableView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isKindOfClass:[UITableView class]]) {
            [_noDtaView setFrame:CGRectMake(0, 0, obj.width, obj.height)];
            [obj addSubview:_noDtaView];
        }
    }];
}

- (void)removeNoDataImage{
    if (_noDtaView) {
        [_noDtaView removeFromSuperview];
    }
}

#pragma mark - tableView delegate && DataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.dataMArr.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    return [UITableViewCell new];
} 

接下來避归, 我們就說說 常用第三方的封裝吧荣月,你想多了,不早了 我要洗洗睡了梳毙,明天還要早起呢哺窄,下一篇,就聊聊第三方的封裝吧账锹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萌业,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奸柬,更是在濱河造成了極大的恐慌生年,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件廓奕,死亡現(xiàn)場離奇詭異抱婉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)桌粉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蒸绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人铃肯,你說我怎么就攤上這事患亿。” “怎么了缘薛?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵窍育,是天一觀的道長卡睦。 經(jīng)常有香客問我,道長漱抓,這世上最難降的妖魔是什么表锻? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮乞娄,結(jié)果婚禮上瞬逊,老公的妹妹穿的比我還像新娘。我一直安慰自己仪或,他們只是感情好确镊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著范删,像睡著了一般蕾域。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上到旦,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天旨巷,我揣著相機(jī)與錄音,去河邊找鬼添忘。 笑死采呐,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的搁骑。 我是一名探鬼主播斧吐,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仲器!你這毒婦竟也來了煤率?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤娄周,失蹤者是張志新(化名)和其女友劉穎涕侈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體煤辨,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年木张,在試婚紗的時候發(fā)現(xiàn)自己被綠了众辨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡舷礼,死狀恐怖鹃彻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妻献,我是刑警寧澤蛛株,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布团赁,位于F島的核電站,受9級特大地震影響谨履,放射性物質(zhì)發(fā)生泄漏欢摄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一笋粟、第九天 我趴在偏房一處隱蔽的房頂上張望怀挠。 院中可真熱鬧,春花似錦害捕、人聲如沸绿淋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吞滞。三九已至,卻和暖如春盾沫,著一層夾襖步出監(jiān)牢的瞬間裁赠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工疮跑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留组贺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓祖娘,卻偏偏與公主長得像失尖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渐苏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,815評論 25 707
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中掀潮。。琼富。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的仪吧,畢竟多個單...
    yhtang閱讀 5,174評論 1 23
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件鞠眉、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • ? 十年之前械蹋,我不認(rèn)識你出皇,你不屬于我,我們還是一樣哗戈,陪在一個陌生人左右郊艘,走過漸漸熟悉的街頭…… 直到后來有一天,我...
    05f3ae22a228閱讀 481評論 0 0
  • 20161212 陰陽瑜伽 1. 平躺屈膝,雙腳分開靠近大腿根纱注,膝蓋向一側(cè)觸地畏浆,頭轉(zhuǎn)向異側(cè)。明顯感覺到異側(cè)腰部和同...
    韋陀閱讀 317評論 0 0