因為是結(jié)構(gòu)方面的東西淑翼,直接給Demo運(yùn)行也是看不出效果的逾雄,而這些代碼都在項目中阀溶,不好放出來,所以嘲驾,我也在整理一個能看到效果的demo供大家參考淌哟,待我整理完,就會放到github上辽故,大家如果想要徒仓,可以關(guān)注下我,我整理完誊垢,會在簡書上通知大家的掉弛。 標(biāo)題不知道應(yīng)該怎么寫症见,感覺怎么寫都不是很合適,接著上一篇繼續(xù)扯下去吧殃饿,先看一下效果吧:
這是我剛把這部分的代碼拿出來做的小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];
}
接下來避归, 我們就說說 常用第三方的封裝吧荣月,你想多了,不早了 我要洗洗睡了梳毙,明天還要早起呢哺窄,下一篇,就聊聊第三方的封裝吧账锹。