iOS實現(xiàn)當tableview無內(nèi)容時的自動提示

新壁紙鎮(zhèn)樓

nanami madobe (1).jpg

前言

  其實沒什么可前言的拿愧、有圖誰嗶嗶是吧衅谷。
  如果符合你的需求染服、再繼續(xù)往下看原理

TBEmptyDemo.gif
Demo2.gif

正文

項目里之前的寫法是這樣的
- (void)checkData {
[self hideHUD];
[self.tableView reloadData];
[self.tableView.mj_header endRefreshing];
[self.tableView.mj_footer endRefreshing];

  if (self.dataArray.count == 0) {
      [self showNoteView];
  }else {
      [self removeNoteview];
  }
}

然后具體是每個頁面創(chuàng)建一個NoteView。根據(jù)需要展示母债。

為什么這樣寫呢赋荆、我也不知道笋妥。反正一直按著公司舊代碼copy著來了。
這樣寫功能實現(xiàn)上并沒什么問題窄潭、實際使用也是春宣。過程簡單易懂。
不過嫉你、這樣寫月帝。肯定是有問題的:
  1.確實是為了過程而過程了幽污。
  2.每一個列表VC都要copy一份創(chuàng)建的代碼啊真的是一模一樣啊嚷辅。滿地都是啊
  3.也是最重要的距误。領(lǐng)導(dǎo)一直看著這個代碼塊很不順眼~~去年說過讓我解決一下但是我一直沒弄...不過簸搞、去年的任務(wù)總不能拖到春節(jié)以后對吧扁位?
      哼(ˉ(∞)ˉ)唧  哼(ˉ(∞)ˉ)唧

解決實現(xiàn)

我們自然是希望以上需求與tableView綁定成為其固有功能。每次網(wǎng)絡(luò)請求結(jié)束之后趁俊、自動檢查數(shù)據(jù)源贤牛、而后處理。
  網(wǎng)絡(luò)請求我們從tableView中無法直接跟蹤则酝、但只要把相應(yīng)操作注入到reloadData方法里就行了。
  所以接下來闰集。swizzle(別忘了頭文件#import <objc/runtime.h>)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[[UITableView new] swizzleMethod:@selector(reloadData) withMethod:@selector(KTreloadData)];
});
}

- (void)swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector
{
  Class class = [self class];

  Method originalMethod = class_getInstanceMethod(class, origSelector);
  Method swizzledMethod = class_getInstanceMethod(class, newSelector);

  BOOL didAddMethod = class_addMethod(class,
                                    origSelector,
                                          method_getImplementation(swizzledMethod),
                                    method_getTypeEncoding(swizzledMethod));
  if (didAddMethod) {
      class_replaceMethod(class,
                        newSelector,
                        method_getImplementation(originalMethod),
                        method_getTypeEncoding(originalMethod));
  } else {
    method_exchangeImplementations(originalMethod, swizzledMethod);
  }
}

現(xiàn)在我們成功的修改了reloadData方法的指針指向了KTreloadData
在KTreloadData方法中對操作進行注入就行了
- (void)KTreloadData {
[self KTreloadData];
if (self.noteView) {
[self checkDataSource];
}
}
關(guān)于這個if沽讹、由于Catergory會直接全局加載。要有個屬性判斷當前的talbeView是否需要繼續(xù)進行代碼注入才行武鲁。

//工作代碼~就這么幾行
- (void)checkDataSource {
//需求是沒有數(shù)據(jù)則不允許下拉刷新爽雄。如果不要阻隔下拉動作。則把self.noteView置于self上沐鼠、或者將self.noteView的層級調(diào)至self之下即可
  id <UITableViewDataSource> dataSource = self.dataSource;
  NSInteger numberOfSections = [dataSource numberOfSectionsInTableView:self];

  for (int i = 0; i < numberOfSections; i++) {
//  任意一行有內(nèi)容挚瘟、則移除noteView
      if ( [dataSource tableView:self numberOfRowsInSection:i] != 0) {
          [self.noteView removeFromSuperview];
          return;
    }
}

//            [self addSubview:self.noteView];
  [self.superview addSubview:self.noteView];

然后、用起來是這樣的

  [self.tableView addNoteViewWithpicName:@"bg_no_grab" noteText:@"我們的需求是btn刷新饲梭、硬要下拉刷新看類別里" refreshBtnImg:@"detail_btn_filladdress.png"];

就是最上面所展示的默認效果了(最后一個參數(shù)不填就不顯示btn了)乘盖。
當然、也可以自定義憔涉。

    UILabel * customNoteView = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 100)];
    customNoteView.numberOfLines = 0;
    customNoteView.text = @"I am the Custom NoteView I am the Custom NoteView I am the Custom NoteView I am the Custom NoteView I am the Custom NoteView I am the Custom NoteView ";
    self.tableView.noteView = customNoteView;

效果長這樣

Paste_Image.png

最后

最近在學(xué)習前端所以不太有時間造輪子什么的订框、不過demo還是有的。
https://github.com/kiritoSong/KTTableViewEmptyDemo
如果大家需求差不多兜叨、拿回去自己改改比集成各種tableView效果的三方庫要舒服一些穿扳。反正不難、畢竟學(xué)到手了就是自己的嘛国旷。
PS:Catergory是個好東西矛物、可以幫我們提升很多權(quán)限解決很多問題。不過跪但、并不是所有時候都適用履羞、尤其是不要把建Catergory當成習慣~(嗯、不要問我怎么知道的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末特漩,一起剝皮案震驚了整個濱河市吧雹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌涂身,老刑警劉巖雄卷,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蛤售,居然都是意外死亡丁鹉,警方通過查閱死者的電腦和手機妒潭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揣钦,“玉大人雳灾,你說我怎么就攤上這事》氚迹” “怎么了谎亩?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宇姚。 經(jīng)常有香客問我匈庭,道長,這世上最難降的妖魔是什么浑劳? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任阱持,我火速辦了婚禮,結(jié)果婚禮上魔熏,老公的妹妹穿的比我還像新娘衷咽。我一直安慰自己,他們只是感情好蒜绽,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布镶骗。 她就那樣靜靜地躺著,像睡著了一般躲雅。 火紅的嫁衣襯著肌膚如雪卖词。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天吏夯,我揣著相機與錄音此蜈,去河邊找鬼。 笑死噪生,一個胖子當著我的面吹牛裆赵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跺嗽,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼战授,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桨嫁?” 一聲冷哼從身側(cè)響起植兰,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璃吧,沒想到半個月后楣导,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡畜挨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年筒繁,在試婚紗的時候發(fā)現(xiàn)自己被綠了噩凹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡毡咏,死狀恐怖驮宴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呕缭,我是刑警寧澤堵泽,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站恢总,受9級特大地震影響落恼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜离熏,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望戴涝。 院中可真熱鬧滋戳,春花似錦、人聲如沸啥刻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽可帽。三九已至娄涩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間映跟,已是汗流浹背蓄拣。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留努隙,地道東北人球恤。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像荸镊,于是被迫代替她去往敵國和親咽斧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

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