HMViewController.h
#import "HMViewController.h"#import "HMTg.h"#import "HMTgCell.h"#import "HMTgFooterView.h"@interfaceHmviewcontroller () <HMTgFooterViewDelegate>@property (nonatomic, strong) Nsmutablearray*TGS;@end@implementationHmviewcontroller-(Nsarray *) tgs{if(_tgs = = nil) _tgs =[Hmtg TGS]; Data transfer Modelreturn_tgs;}- (void) viewdidload{[Super Viewdidload]; Self.tableView.rowHeight= the; //adjust the margins to make the table view stand out of the status barSelf.tableView.contentInset = Uiedgeinsetsmake ( -,0,0,0); //Footerview//the width of the footerview is consistent with the overall width of the table, only the height can be specified//Self.tableView.tableFooterView = [UIButton buttonwithtype:uibuttontypecontactadd];//UIView *view = [[UIView alloc] Initwithframe:cgrectmake (0, 0, 0,)];//View.backgroundcolor = [Uicolor redcolor];//Self.tableView.tableFooterView = view; //load last view from Xib set to FooterviewHmtgfooterview *footer =[Hmtgfooterview Footerview]; //View Controller becomes a proxy for FooterviewFooter.Delegate=Self ; Self.tableView.tableFooterView=footer; Self.tableView.tableHeaderView= [[[[NSBundle Mainbundle] loadnibnamed:@"Hmtgheadview"Owner:nil Options:nil] lastobject];}///* * Hide status bar *///-(BOOL) Prefersstatusbarhidden//{//return YES;//}#pragmaProxy methods for Mark-footerview/** Preprocessing Instructions #if 0 All code will not be executed #endif*/#if1-(void) Tgfooterviewdiddownloadbuttonclick: (Hmtgfooterview *) Footerview//Agent-to-method{ //Loading DataNSLog (@"try to load data in ...."); //add data to the array to simulate the effect of the network after it is loadedNsdictionary *dict = @{@"title":@"haha",@"icon":@"ad_00",@" Price":@"100.2",@"Buycount":@" -"}; HMTG*TG =[Hmtg tgwithdict:dict]; NSLog (@"add data before%d", Self.tgs.count); [Self.tgs ADDOBJECT:TG]; NSLog (@"add data after%d", Self.tgs.count); //Refresh Data//[Self.tableview Reloaddata]; //Create a new IndexpathNsindexpath *path = [Nsindexpath indexpathforrow: (Self.tgs.count-1) Insection:0]; [Self.tableview Insertrowsatindexpaths:@[path] withrowanimation:uitableviewrowanimationmiddle];}#endif#pragmaMark-Data Source Method-(Nsinteger) TableView: (UITableView *) TableView numberofrowsinsection: (nsinteger) section{returnSelf.tgs.count;}-(UITableViewCell *) TableView: (UITableView *) TableView Cellforrowatindexpath: (Nsindexpath *) indexpath{//1. Create a cellHmtgcell *cell =[Hmtgcell Cellwithtableview:tableview]; //2. Through the data model, set the cell content, you can let the view controller does not need to understand the implementation details inside the cell CELL.TG=Self.tgs[indexpath.row]; returncell;}@end
hmtgcell.m
#import "HMTgCell.h"#import "HMTg.h"@interfaceHmtgcell () @property (weak, nonatomic) Iboutlet Uiimageview*IconView, @property (weak, nonatomic) Iboutlet UILabel*Titlelabel, @property (weak, nonatomic) Iboutlet UILabel*Pricelabel, @property (weak, nonatomic) Iboutlet UILabel*Buycountlabel;@end@implementationHmtgcell+ (Instancetype)Cellwithtableview:(UITableView *) tableview{//1. Reusable identifiers StaticNSString *id =@"Cell"; //2. TableView Query Reusable CellHmtgcell *cell =[TableView Dequeuereusablecellwithidentifier:id]; //3. If there are no reusable cells if(Cell = =Nil) {NSLog (@"Load Xib"); //load a custom view from Xibcell = [[[NSBundle Mainbundle] loadnibnamed:@"Hmtgcell"Owner:nil Options:nil] lastobject]; } returncell;}-(void) SETTG: (HMTG * ) TG { //in the Setter method, the first sentence is assigned, otherwise the model will be used in other methods and the_TG =TG; Self.titleLabel.text=Tg.title; Self.iconView.image=[UIImage ImageNamed:tg.icon]; Self.priceLabel.text=Tg.price; Self.buyCountLabel.text=Tg.buycount;}#pragmaThe method provided by the mark-template/** The initialization method is called when the cell is created using code, and if you use Xib or storyboard, this method will not be called*/- (ID) Initwithstyle: (Uitableviewcellstyle) style Reuseidentifier: (NSString *) reuseidentifier{ Self=[Super Initwithstyle:style Reuseidentifier:reuseidentifier]; if(self) {NSLog (@"%s", __func__); } returnSelf ;}/** After being loaded from xib, it will be automatically called and will not be executed if pure code is used*/- (void) awakefromnib{NSLog (@"%s", __func__); Self.contentView.backgroundColor=[Uicolor Clearcolor];}/** Cell is selected or unchecked it will be called if a custom cell control, all child controls should be added to Contentview*/- (void) setselected: (BOOL) selected animated: (BOOL) animated{[Super setselected:selected animated:animated]; if(selected) {Self.contentView.backgroundColor=[Uicolor Redcolor]; } Else{Self.contentView.backgroundColor=[Uicolor Greencolor]; }}@end
HMTgCell.h
#import <UIKit/UIKit.h>@class hmtg; @interface Hmtgcell:uitableviewcell /* */@property (nonatomic, strong)*TG; /* */+ (Instancetype) Cellwithtableview: (UITableView *) TableView; @end
HMTgFooterView.h
#import<UIKit/UIKit.h>@classHmtgfooterview;@protocolHmtgfooterviewdelegate <NSObject>@optional/** The download button of the view is clicked*/- (void) Tgfooterviewdiddownloadbuttonclick: (Hmtgfooterview *) Footerview;@end@interfaceHmtgfooterview:uiview//If a proxy uses a strong reference, a circular reference is generated, causing the controller and child views to be freed, causing a memory leak@property (nonatomic, weak)ID<HMTgFooterViewDelegate>Delegate;+(instancetype) Footerview;@end
hmtgfooterview.m
#import "HMTgFooterView.h"@interfaceHmtgfooterview () @property (weak, nonatomic) Iboutlet UIButton*Loadmorebutton, @property (weak, nonatomic) Iboutlet UIView*Tipsview;@end@implementationHmtgfooterview+(instancetype) footerview{return[[[NSBundle Mainbundle] loadnibnamed:@"Hmtgfooterview"Owner:nil Options:nil] lastobject];}-(ibaction) loadmore{NSLog (@"load More"); //1. Hide the buttonSelf.loadMoreButton.hidden =YES; //2. Display the prompt viewSelf.tipsView.hidden =NO; //delay Execution command, multithreaded gcd//future operation on delay, unified use of Dispatch_afterDispatch_after (Dispatch_time (Dispatch_time_now, (int64_t) (1.0* nsec_per_sec)), Dispatch_get_main_queue (), ^{ //code in the block code executes after 1 seconds//3. Load data (load from Web server, time required ...) //view is used to display the data, with the agent to achieve! //agent is used to listen, when something happens, notify the "agent"-"controller to" work "load data//3.1 Determine if the agent implements the Protocol method if([Self.Delegaterespondstoselector: @selector (Tgfooterviewdiddownloadbuttonclick:)]) {[Self.DelegateTgfooterviewdiddownloadbuttonclick:self]; } //4. Loading complete DataSelf.loadMoreButton.hidden =NO; Self.tipsView.hidden=YES; });}@end
iOS eighth day (1:uitableviewcontroller buy, click Bottom, xib load more, proxy mode)