我為什么不喜歡直接使用UITableViewController

版本記錄

版本號 時間
V1.0 2017.12.31

前言

大家都知道UITableView這個控件是大家一定會用到的匠楚,使用的時候可以直接放在UIViewController里面實例化缎罢,也可以直接繼承UITableViewController纤掸,如果采取后者方案會少寫一些代碼,比如實例化代碼以及遵守代理和數(shù)據(jù)源代理方法,但是我還是不喜歡這么做竞穷,下面我就說一下我的原因梳庆。

使用UITableViewController的優(yōu)缺點

1. 優(yōu)點

使用UITableViewController有很多優(yōu)點暖途,比如:

  • 不用像在UIViewController里面那樣實例化UITableView了卑惜。
  • 不用寫數(shù)據(jù)源和代理的遵守了<UITableViewDelegate, UITableViewDataSource>。因為系統(tǒng)已經(jīng)給加好了驻售。
NS_CLASS_AVAILABLE_IOS(2_0) @interface UITableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

2. 缺點

下面就說一下缺點露久,比如:

  • 添加控件時候,由于根視圖是UITableView欺栗,所以你沒得選擇毫痕,添加子視圖,子視圖就要跟隨控件一起滾動迟几,但是絕大多數(shù)情況消请,就是除了列表以外的控件時不能滾動的。如果想讓UITableView子視圖不滾動类腮,就要監(jiān)聽- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法臊泰,獲取scrollView.contentOffset更新子控件的frame,這個在下面的例子會給出蚜枢。先給出沒解決之前的示意圖缸逃。
  • 在加載空視圖后者斷網(wǎng)的錯誤視圖的時候,由于根視圖是UITableView祟偷,如果你的返回section個數(shù)不為0的時候察滑,你直接加一個斷網(wǎng)視圖放在UITableView上,就會出現(xiàn)斷網(wǎng)視圖在sectionHeader的下面的尷尬情況修肠,一條條的sectionHeader就會把你的頁面搞亂贺辰,非常煩人。這個時候你只能依靠返回那個section個數(shù)代理方法返回為0嵌施,并且reloadData饲化,然后才可以讓sectionHeader不顯示,達到斷網(wǎng)視圖蓋到UITableView上的情況吗伤,但是這么做吃靠,你就需要在代理方法中進行判斷,無疑增加了成本足淆。

綜上所述巢块,我一般都是繼承自UIViewController,并在里面實例化UITableView巧号,并不會多增加多少代碼族奢,但是可以避免很多問題,比如加載子視圖放在UIViewController根view上就不會有跟隨滾動的問題丹鸿,加載斷網(wǎng)圖越走,也不會出現(xiàn)蓋不全的問題。


UITableView子視圖跟隨滾動問題的解決

下面我們就直接看一下代碼。

1. JJTableActivityVC.h
#import <UIKit/UIKit.h>

@interface JJTableActivityVC : UITableViewController

@end
2. JJTableActivityVC.m
#import "JJTableActivityVC.h"

@interface JJTableActivityVC ()

@property (nonatomic, strong) UIView *activityView;

@end

@implementation JJTableActivityVC

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor whiteColor];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
    
    [self initUI];
}

#pragma mark - Object Private Function

- (void)initUI
{
    self.activityView = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width - 130.0, self.view.bounds.size.height - 130.0, 100.0, 100.0)];
    self.activityView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.activityView];
}

#pragma mark - UITableViewDataSource && UITableViewDelegate

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 100;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
    return cell;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"滾動范圍 : x = %lf, y = %lf", scrollView.contentOffset.x, scrollView.contentOffset.y);
    
    //更新視圖的y值廊敌,讓其看似不動在右下角
    self.activityView.frame = CGRectMake(self.view.bounds.size.width - 130.0, self.view.bounds.size.height - 130.0 + scrollView.contentOffset.y, 100.0, 100.0);
    
    NSLog(@"tableviewFrame = %@", self.tableView);
    NSLog(@"activityViewFrame = %@", self.activityView);
}

@end

看部分輸出結(jié)果

2017-12-31 16:01:53.314784+0800 JJTableView[2857:116083] 滾動范圍 : x = 0.000000, y = 633.000000
2017-12-31 16:01:53.315163+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 633}; contentSize: {375, 4429}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.315570+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1170; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.331156+0800 JJTableView[2857:116083] 滾動范圍 : x = 0.000000, y = 648.000000
2017-12-31 16:01:53.331559+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 648}; contentSize: {375, 4429}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.331821+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1185; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.348096+0800 JJTableView[2857:116083] 滾動范圍 : x = 0.000000, y = 662.500000
2017-12-31 16:01:53.348449+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 662.5}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.348806+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1199.5; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.364676+0800 JJTableView[2857:116083] 滾動范圍 : x = 0.000000, y = 676.500000
2017-12-31 16:01:53.365079+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 676.5}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.365379+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1213.5; 100 100); layer = <CALayer: 0x604000220020>>
2017-12-31 16:01:53.381149+0800 JJTableView[2857:116083] 滾動范圍 : x = 0.000000, y = 690.000000
2017-12-31 16:01:53.381790+0800 JJTableView[2857:116083] tableviewFrame = <UITableView: 0x7fad5581bc00; frame = (0 0; 375 667); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x600000243990>; layer = <CALayer: 0x6000000331e0>; contentOffset: {0, 690}; contentSize: {375, 4430}; adjustedContentInset: {20, 0, 0, 0}>
2017-12-31 16:01:53.382252+0800 JJTableView[2857:116083] activityViewFrame = <UIView: 0x7fad53f0a350; frame = (245 1227; 100 100); layer = <CALayer: 0x604000220020>>

看一下效果圖

這樣子控件就不跟著跑了铜跑,雖然這個可以解決,但是還是覺得不方便骡澈,盡量用UIViewController吧锅纺。

后記

未完,待續(xù)~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秧廉,一起剝皮案震驚了整個濱河市伞广,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疼电,老刑警劉巖嚼锄,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蔽豺,居然都是意外死亡区丑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門修陡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沧侥,“玉大人,你說我怎么就攤上這事魄鸦⊙缟保” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵拾因,是天一觀的道長旺罢。 經(jīng)常有香客問我,道長绢记,這世上最難降的妖魔是什么扁达? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蠢熄,結(jié)果婚禮上跪解,老公的妹妹穿的比我還像新娘。我一直安慰自己签孔,他們只是感情好叉讥,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饥追,像睡著了一般图仓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上判耕,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天透绩,我揣著相機與錄音翘骂,去河邊找鬼壁熄。 笑死帚豪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的草丧。 我是一名探鬼主播狸臣,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昌执!你這毒婦竟也來了烛亦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤懂拾,失蹤者是張志新(化名)和其女友劉穎煤禽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖赋,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡檬果,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了唐断。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片选脊。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脸甘,靈堂內(nèi)的尸體忽然破棺而出恳啥,到底是詐尸還是另有隱情,我是刑警寧澤丹诀,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布钝的,位于F島的核電站,受9級特大地震影響忿墅,放射性物質(zhì)發(fā)生泄漏扁藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一疚脐、第九天 我趴在偏房一處隱蔽的房頂上張望亿柑。 院中可真熱鬧,春花似錦棍弄、人聲如沸望薄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痕支。三九已至,卻和暖如春蛮原,著一層夾襖步出監(jiān)牢的瞬間卧须,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留花嘶,地道東北人笋籽。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像椭员,于是被迫代替她去往敵國和親车海。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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