標籤:
//封裝總結
如何封裝?1.確定變化點 *.資料變化點(資料模型), 重寫set *.通訊(代理, block)2.確定一個容器(UIView)3.邏輯搭建 *.UI 搭建 *.響應 UI 的邏輯//1>登入模組的封裝(建立類繼承自UIVIew)
1.代理的作用
*封裝變化點
*解決類與類之間的強耦合性
*可以在類之間進行資料傳遞
2.什麼情況下使用代理
*有一系列的變化點,能夠讓使用者清晰的知道到底有哪些變化點被封裝起來了
//登入封裝變化點:需要用代理來傳遞密碼和使用者名稱
3.外部(.h)
*提供一個類方法用於外界擷取到自己(xib載入)
*提供代理方法,傳遞資料給控制器
4.內部(.m)
*定義子控制項(UITestField,UIButton)
*定義按鈕事件(實現代理方法,傳遞資料)
//2>控制器
1.初始化資料來源(重寫get方法 實現懶載入)
2.載入並初始化視圖,建立父子關係
2.傳遞資料來源
//3>封裝ScrollView廣告輪播(建立類繼承自UIView)
1.外部(.h)
*提供一個類方法。用於外界擷取到自己
*提供一個代理方法,當點擊scrollView上的方法時,控制器擷取此按鈕事件時執行相應的操作
- (void)adsViewDidSelected:(GPAdsView *)adsView andImage:(NSString *)image andIndex:(NSInteger)index;
@property(nonatomic,assign)id<GPAdsViewDelegate> delegate;
*提供一個NSArray屬性,儲存資料,用於傳遞scrollView需要的資料
2.內部(.m)
*定義控制項屬性(pageControl,Timer,ScrollView等)
*實作類別方法,返回一個UIView對像
*在initFrame對象方法中,執行個體化控制項,設定一些控制項的基本屬性(此時不建議設定大小,大小應有父類擷取到並賦值)並儲存,添加到父視圖中
/* 在初始化子視圖時最好是先建立一個新視圖,再賦值給自己的屬性視圖
*/
註:在視圖樣本化時最終調用的是initframe方法,init ->initFrame
*在willMoveToSuPerView設定主視圖的frame及其屬性,並給子控制項設定大小
//子控制項參考父控制項設定 Frame 值
*重寫資料的set方法,給scrollView添加子視圖,更新本視圖的所有資料
//1.設定依賴於資料的一些屬性
//2.計算ScrollView的 ContentSize
//3.給 ScrollView 添加子控制項
*添加NSTimer,實現自動播放功能,在ScrollDidScroll方法中,更新pageControl的當前頁
// 建立:NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(autoScroll) userInfo:nil repeats:YES];
// 將一個 timer 對象加入到最主要的事件迴圈中
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
// 1.計算當前應該顯示到的具體頁數
// 2.更新scrollView的位移量
在scrollViewWillBeginDragging方法中銷毀Timer,在scrollViewDidEndDragging方法中重新建立Timer(NSTimer一旦停止就會被銷毀,所以得重寫建立,為了讓廣告不受其他動作的影響,應該在建立Timer對象時給它提供多執行緒,加入到最主要的事件迴圈中[[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];)
4> 封裝UITableView(建立xib,繼承自UIView)
1.外部(.h)
*提供一個類方法,用於外界擷取到自己
*提供一個數組屬性(控制器資料來源數組資料),儲存外界傳來的資料(用於定義行數,以及cell資料)
2.內部(.m)
*實作類別方法,返回一個UITableView(從xib獲得)
//return [[[NSBundle mainBundle] loadNibNamed:@"GPContentView" owner:nil options:nil] lastObject]
*繼承UITableView 資料來源方法,實現numberOfRowsInSection方法及其cellForRowAtIndexPath方法(返回的是自訂的cell對象,自訂cell對象提供模型資料,將控制器傳來的資料來源賦給cell的模型對象)
*重寫資料來源的set方法,將外界傳遞過來的資料儲存,並且一定要更新tableView對象資料([self.tableView reloadData])
*在awakeFromNib方法中給tableView添加子控制項(如:廣告輪播添加到頭視圖)
// 只要當前對象是從 xib 檔案中載入來的,就會自動調用awakeFromNib方法
5>封裝cell(建立xib,繼承自UITableViewCell)
// 考慮cell複用機制
//去記憶體池中取可重用的 cell
//1.如果有給你返回一個可重用的 cell
//2.如果沒有,自動建立一個返回給你用
* 對於頻繁載入的 xib 檔案,不要使用loadNibNamed
//註冊 直接使用類名作為唯一標識
+ (id)subjectCellWithTableView:(UITableView *)tableView
{
// 1.註冊 直接使用類名作為唯一標識
NSString * Identifier = NSStringFromClass([self class]);
// 2.建立UINib對象
UINib * nib = [UINib nibWithNibName:Identifier bundle:nil];
// 3.使用註冊機制, xib 檔案上不需要再去加上重用標識
[tableView registerNib:nib forCellReuseIdentifier:Identifier];
// 4.複用返回
return [tableView dequeueReusableCellWithIdentifier:Identifier];
}
1.外部(.h)
*提供一個類方法,用於外界擷取到自己
+ (id)subjectCellWithTableView:(UITableView *)tableView;
*提供一個數組資料(模型資料),儲存模型資料用於給Cell屬性賦值
*提供一個帶有參數的類方法,用於從緩衝池中取的Cell資料
2.內部(.m)
*定義子控制項
*實作類別方法,返回一個UITableViewCell對象(從xib中獲得)
*實現帶參數的類方法(從傳過來的tableView緩衝池中取出有相同ID的Cell資料,返回一個Cell)
*重寫資料的set方法,給Cell的屬性賦值
6>模型封裝(模型資料,繼承自NSobject)
*將需要的資料屬性抽象成模型屬性(一般是NSDictionary,將字典裡的key值和模型屬性一一對應)
*提供一個類方法和一個對象方法(因為操作習慣,會不自覺的使用類方法初始化,所以在執行個體化時最好提供一個類方法),都帶字典參數
*實作類別方法和對象方法建立模型( [self setValuesForKeysWithDictionary:dict];)
*對於嵌套模型,應當在重寫init方法是再將子模型模型封裝
- (id)initWithDict:(NSDictionary *)dict
{
if (self = [super init])
{
[self setValuesForKeysWithDictionary:dict];
NSMutableArray * objs = [NSMutableArray array];
for (NSDictionary * dic in self.friends)
{
GPFriend * friend = [GPFriend friendWithDict:dic];
[objs addObject:friend];
}
//更新一下自己的 friends 屬性
_friends = objs;
}
return self;
}
*當有字典屬性和系統關鍵字衝突時調用forUndefinedKey方法解決
/**
* 沒有定義屬性
*/
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
if ([key isEqualToString:@"id"]) {
self.iD = value;
}
}
IOS常用封裝總結