UI之 07 自定義cell 01 (團(tuán)購)

團(tuán)購01 基本數(shù)據(jù)

效果展示:

Snip20160322_2.png

01 展示基本數(shù)據(jù)

題外話: 我們上面有一個(gè)播放廣告的地方是利用我們的tableView的一個(gè)head...控件實(shí)現(xiàn)的, 后面也有一個(gè)foot....

其實(shí)自定義cell有兩種方法:

  • 通過Xib創(chuàng)建
  • 通過代碼創(chuàng)建
    決定是用這兩種的方法的其中一種的根據(jù)我們的所寫的程序決定的
    如果是像上面的這種(所有的cell都比較類似, 我們就用Xib, 如果每一個(gè)cell不一樣, 我們就用代碼來創(chuàng)建)

**開始編寫: **

1. 界面設(shè)計(jì):

storyboard就是一個(gè)簡單的tableView直接拖進(jìn)去就行了

Xib文件: 我們在創(chuàng)建Xib之后, 注意的是這里面不是我們以前說的將一個(gè)UIView拖進(jìn)去, 而是選擇UITableViewCell然后, 設(shè)置它里面的控件: 具體的格式是:

Snip20160322_3.png

2. 代碼的編寫:

上一個(gè)程序中, 我們介紹過有關(guān)于cell的緩存池, 當(dāng)然也是需要標(biāo)識的. 觀察一下我們在加載我們的Xib的時(shí)候, 貌似沒有告訴我們的系統(tǒng), 我們加載的這個(gè)自定義cell沒有標(biāo)識: (這個(gè)里面同樣也牽扯到封裝的原理: 我們將創(chuàng)建cell的方式給封裝了起來, 后面我將介紹到)

Snip20160322_9.png

所以我們要在Xib的這個(gè)位置設(shè)置標(biāo)識:

Snip20160322_4.png

剩下的都是我們在應(yīng)用管理中的Xib的一些步驟:
創(chuàng)建新的類, 用來封裝我們的cell相關(guān)代碼
這里面也包括了一些新的代碼, 在最后, 我會將所有的代碼全部寫在這個(gè)上面的

團(tuán)購 02 添加加載更多功能

2. 1 我們利用TableViewfooterView來完成我們后面的加載數(shù)據(jù)

**第一種方法: **

就是直接使用footerView創(chuàng)建一個(gè)加載更多的按鈕:

     設(shè)置tableView尾部顯示的控件(tableFooterView的寬度永遠(yuǎn)是tableView的寬度)
         tableFooterView只需要設(shè)置高度
UIButton *footerBtn = [UIButton buttonWithType:UIButtonTypeSystem];
footerBtn.frame = CGRectMake(0, 0, 0, 35);
footerBtn.backgroundColor = [UIColor orangeColor];
[footerBtn setTitle:@"加載更多團(tuán)購" forState:UIControlStateNormal];

但是這樣做的不好的地方在于, 顯示的寬度是我們的整個(gè)手機(jī)的屏幕. 而且是我們無法修改的

**第二種方法: **

第二種方法就是創(chuàng)建Xib直接創(chuàng)建一個(gè)Xib文件, 將我們想要界面用Xib給描述出來就可以了

    UINib *nib = [UINib nibWithNibName:@"MJTgFooterView" bundle:[NSBundle mainBundle]];

//  創(chuàng)建nib對象
UINib *nib = [UINib nibWithNibName:@"GJTgFooterView" bundle:nil];

// 加載xib\nib
UIView *footerView = [[nib instantiateWithOwner:nil options:nil] lastObject];
self.tableView.tableFooterView = footerView;

**第三種方法: **

也是利用Xib創(chuàng)建footerView但是這個(gè)與上一個(gè)方法之間的區(qū)別就是很完美的封裝在不同的類中, 這個(gè)我們的控制器就只需一行代碼就可以直接調(diào)用了,這個(gè)封裝還有效的將我們后面的加載更多數(shù)據(jù)的內(nèi)容也給很好的封裝了


題外話:

現(xiàn)在的我們只是做一些簡單的程序所以我們的代碼文件都是隨意放置的, 今天就說一下關(guān)于文件的如果放置

首先, 放置不同的文件夾規(guī)律是按照我們的MVC的來放置例如:

Snip20160322_6.png

02. 2. 關(guān)于我們footerView的 Xib的創(chuàng)建步驟:

首先是Xib的直接創(chuàng)建

Snip20160322_7.png
1. 上面中的1就是加載更多的數(shù)據(jù)而這個(gè)控件是直接是這個(gè)`Xib的子類

而我們后面的兩個(gè)控件: (菊花\正在拼命加載)是我們的正在加載提示的子控件
這樣做是為了, 將來在數(shù)據(jù)加載的時(shí)候, 這兩個(gè)控件, 要么一起出來 , 要么就不出來, 注意的是, 我們的正在加載提示這個(gè)控件是個(gè)UIView
但是這個(gè)控件默認(rèn)情況下是hidden無法顯示, 唯有我們點(diǎn)擊了 加載數(shù)據(jù)這個(gè)按鈕, 他才會顯示出來

這里我們再回憶一次如果用Xib來封裝一個(gè)view:

Snip20160322_8.png

我們牽扯到一個(gè)如何更新數(shù)據(jù), 更新什么數(shù)據(jù)???

/**
*  加載更多的數(shù)據(jù)
 */
- (void)loadingMoreData
{
    // 1.添加更多的模型數(shù)據(jù)
    GJTg *tg = [[GJTg alloc] init];
    tg.icon = @"ad_01";
    tg.title = @"新增加的團(tuán)購數(shù)據(jù)..";
    tg.price = @"100";
    tg.buyCount = @"0";
    [self.tgs addObject:tg];
    
    // 2.刷新表格(告訴tableView重新加載模型數(shù)據(jù), 調(diào)用tableView的reloadData)
    [self.tableView reloadData];
}

這個(gè)是我們UIView控制器中的代碼, 這個(gè)方法就是更新數(shù)據(jù)的
方法

/**
 *  點(diǎn)擊"加載"按鈕
 */
- (IBAction)loadBtnClick {
    // 1.隱藏加載按鈕
    self.loadBtn.hidden = YES;
    
    // 2.顯示"正在加載"
    self.loadingView.hidden = NO;
    
    // 3.顯示更多的數(shù)據(jù)
    // GCD
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 3.0s后執(zhí)行block里面的代碼
        [self.controller loadingMoreData];
        
        // 4.顯示加載按鈕
        self.loadBtn.hidden = NO;
        
        // 5.隱藏"正在加載"
        self.loadingView.hidden = YES;
    });
}

注意, 這里面是牽扯到一個(gè)界面的變換
如果我們點(diǎn)擊了, 下面的加載更多數(shù)據(jù), 就會顯示正在加載提示的那個(gè)UIView

然后進(jìn)過三秒鐘之后(這個(gè)使用我們的block實(shí)現(xiàn)的)顯示出新的數(shù)據(jù).

而更新數(shù)據(jù)的方法在我們的UIView的控制器中, 我們在Xib控制器中的這個(gè)方法是如果拿到, 我們的UIView的方法呢???

這個(gè)有兩種方法:

  • 直接將我們的控制器給我們的Xib控制器:
  1. 首先, 讓我們的這個(gè)方法暴露在外面(使任何類都可以訪問)
 #import <UIKit/UIKit.h>

@interface GJViewController : UIViewController
- (void)loadingMoreData;
@end
  1. 然后拿到我們的UIView的控制器:
#import <UIKit/UIKit.h>

@class GJViewController;

@interface GJTgFooterView : UIView

/**
 *  快速創(chuàng)建一個(gè)footerView對象
 */
+ (instancetype)footerView;

@property (nonatomic , strong) GJViewController *controller;

@end

就可以調(diào)用我們的這個(gè)方法了, 代碼如上面

但是上面的這種方法, 會導(dǎo)致我們的代碼耦合性強(qiáng), 所以不建議使用
所以我們要推薦使用第二種方法:

第二種方法就是利用代理模式即是我們下面要講的內(nèi)容:

團(tuán)購 03 代理設(shè)計(jì)模式

誰代理誰???

其實(shí)是我們的控制器代理我們的Xib控制器(footerView`)

只有當(dāng)我們的footerView`被點(diǎn)擊之后 , 我們的控制器監(jiān)聽這個(gè)點(diǎn)擊事件, 然后做出反應(yīng)(調(diào)用相應(yīng)的方法)

**代碼分析: **

GJFooterView.h文件

/**
 1.協(xié)議名稱:  控件類名 + Delegate
 2.代理方法普遍都是@optional
 3.
 */

@protocol GJTgFooterViewDelegate <NSObject>
@optional
- (void)tgFooterViewDidClickedLoadBtn:(GJTgFooterView *)tgFooterView;
@end

@interface GJTgFooterView : UIView

@property (nonatomic, weak) id<GJTgFooterViewDelegate> delegate;

@end

*GJViewController.m文件代碼: *

  footer.delegate = self;

這個(gè)就是我們利用代理的一部分代碼:

首先, 說明這只是一層重構(gòu), 后面我們會繼續(xù)重構(gòu)

其次:

@property (nonatomic, weak) id<GJTgFooterViewDelegate> delegate;

這一段代碼的中為什么要用id和遵守這個(gè)協(xié)議<GJTgFooterViewDelegate>???

  • id可以讓我們充當(dāng)footerView的代理的類, 不受限制.就是任何類都可以充當(dāng)我們footerView的代理
  • 遵守這個(gè)協(xié)議, 是為了告訴我們的footerView調(diào)用代理的哪一個(gè)方法
[self.delegate loadingMoreData];

而我們上面所寫的協(xié)議,只有這一個(gè)方法, 而這個(gè)方法名稱和我們的控制器里面的方法名稱一樣 .
而且, 我們在控制器中的代碼:

@interface GJViewController () <UITableViewDataSource, GJTgFooterViewDelegate>
footer.delegate = self;

這個(gè)代碼的含義就是告訴我們的控制器, 我們的footerView的代理就是他自己

那么, 當(dāng)我們的footerView的按鈕被點(diǎn)擊之后 , 它就會直接調(diào)用這個(gè)方法了.

團(tuán)購 04 頭部控件

頭部文件其實(shí)就是一個(gè)圖片輪播器, 這個(gè)我們就不多介紹了, 但是我們要說的是那個(gè)圖片輪播器下面的猜你喜歡是怎么做出來的

其實(shí)就是一個(gè)簡單的UIView做出來的, 只是這個(gè)UIView的高度為1而已, 當(dāng)你將UIView的高度設(shè)置為1的時(shí)候, 可能發(fā)現(xiàn)他的線條比較粗,所以, 建議再將他的透明度設(shè)為0.5這個(gè)就可以達(dá)到效果了,

還有就是我們的圖片輪播器的代碼在哪里寫???

#import "GJTgHeaderView.h"


@interface GJTgHeaderView()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

@end

@implementation GJTgHeaderView

+ (instancetype)headerView
{
     return [[[NSBundle mainBundle] loadNibNamed:@"GJTgHeaderView" owner:nil options:nil] lastObject];
//    headerView.scrollView
}

/**
 *  當(dāng)一個(gè)對象從xib中創(chuàng)建初始化完畢的時(shí)候就會調(diào)用一次
 */
- (void)awakeFromNib
{
    // 在這里面添加圖片輪播器
    
    
}

@end

我們圖片輪播器的代碼就在上面的那個(gè)方法中寫:

作者說:

這次講的是團(tuán)購, 來了解如果自定義一個(gè)簡單的cell下次我們介紹的是如果利用自定義cell做一個(gè)微博的簡單界面.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末预明,一起剝皮案震驚了整個(gè)濱河市杨伙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖芭届,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)必孤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敷搪,你說我怎么就攤上這事兴想。” “怎么了赡勘?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵嫂便,是天一觀的道長。 經(jīng)常有香客問我闸与,道長毙替,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任践樱,我火速辦了婚禮厂画,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘映胁。我一直安慰自己木羹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布解孙。 她就那樣靜靜地躺著,像睡著了一般抛人。 火紅的嫁衣襯著肌膚如雪弛姜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天妖枚,我揣著相機(jī)與錄音廷臼,去河邊找鬼。 笑死绝页,一個(gè)胖子當(dāng)著我的面吹牛荠商,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播续誉,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼莱没,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酷鸦?” 一聲冷哼從身側(cè)響起饰躲,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎臼隔,沒想到半個(gè)月后嘹裂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡摔握,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年寄狼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氨淌。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泊愧,死狀恐怖狡逢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拼卵,我是刑警寧澤奢浑,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站腋腮,受9級特大地震影響雀彼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜即寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一徊哑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聪富,春花似錦莺丑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至奸披,卻和暖如春昏名,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阵面。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工轻局, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人样刷。 一個(gè)月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓仑扑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親置鼻。 傳聞我的和親對象是個(gè)殘疾皇子镇饮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件沃疮、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評論 4 62
  • 微博 **效果展示: ** 01 cell的封裝 這里先補(bǔ)充一個(gè)知識點(diǎn): 以前, 我們都是在我們的UIView里面...
    高俊閱讀 669評論 3 5
  • 7盒让、不使用IB是,下面這樣做有什么問題司蔬? 6邑茄、請說說Layer和View的關(guān)系,以及你是如何使用它們的俊啼。 1.首先...
    AlanGe閱讀 674評論 0 1
  • 我親愛的少年 那些到過我生命的 熟悉或者陌生 我親愛的 少年 我親愛的少年 如果別離早已注定 那么遇見 是否只...
    青苔之城閱讀 269評論 0 3
  • 我小的時(shí)候父母感情很好肺缕,他們倆在當(dāng)時(shí)的年代都算得上郎才女貌,非常登對。媽媽總是很甜蜜地回憶16歲那年同木,他們相識在下...
    Ana2閱讀 213評論 0 0