2015年07月18日第11天筆記
零碎知識
快捷鍵
1.自己百度
2.有多少字典就有多少個模型
3.根型別決定控制器要定義的存資料的型別
4.從檔案獲取資料稱作“解析”
5.匯入標頭檔案的快捷鍵
6.外掛整理程式碼格式
7.pickView的資料來源方法
8.標題forRow,檢視forRow
9.連一個線,自動生成程式碼後,複製幾份以備其他xib控制元件使用 修改後反連線
10.loadNibName mainBundle 返回的是陣列
11.command + shift(option) + b 自動匯入標頭檔案
12.一個xib類檔案一般包含兩個東西:控制元件+資料模型
13.更新frames 還有一個更新約束的選項
14.有個返回pickView的高度代理方法
15.選擇–拿值
16.build 和 run 的區別
17.NSString path = [[NSBundle mainBundle] pathForResource:@”provinces” ofType:nil];
18.當前組的選中的值的索引 selectedRowInComponent
19.用陣列點不出 屬性:可能原因陣列元素的型別是id,這時候用[]去呼叫
20.兩組有關係的時候,選中好一組後,必須程式碼去重新整理它關聯的組,否則不會自動重新整理;這件事放在didSelectRow的代理方法去完成
21.重新整理組:[pickerView reloadComponent];
22.關聯的兩組,同時滾動的時候會有bug,在左下角的加號設定全域性斷點,會跳到出錯位置
23.bug資訊:陣列越界:兩組資訊不配套
24.控制元件一般佈局:上左右高
25.想監聽某個控制元件,首先思考有沒有對應的代理方法
2015年07月18日15:33:18
1.文字框的一些監聽事件,彈出不同的輸入檢視,設定文字框的編輯屬性
2.在item裡點出action賦值
3.在.h裡定義代理協議方法,變數
4.在.m裡去讓代理去呼叫代理方法
5.在控制器裡指定代理,並實現代理。
6.封裝就是一個鬆耦合
7.一個block就對應一個方法,一個代理可以對於多個方法。
8.什麼時候用block什麼時候用代理:兩個類之間夠不著了,就寫個代理連線下
9.定義全域性控制元件變數一般用weak
10.Bundle display name 改程式的名稱
11.Bundble version 版本號最好改成和SVN伺服器的生成的版本號一致,以便有bug的時候好找
12.點選專案出現的介面就是info.plist對應的的,在介面修改的時候,能選就選,別手寫改
13.版本號:帶浮點是給使用者看的(visiion)而build是給自己看的
14.引導頁:通過版本號判斷來決定是否顯示引導頁(添加了什麼新功能)
15.獲取版本號:[NSBundle mainBundle].infoDictionary 獲取plist檔案字典,然後通過鍵屬性(先用xml開啟去找這個鍵名)獲得。
16.怎麼設定類字首:選中專案,在右邊的面板裡Class prefix裡先設定(只能再設定後建立的檔案有,之前的只能手動去改)
17.類字首:自定義的一般是三個字元組成的;兩個字元的是蘋果自己保留用的
18.檔案重名在xCode是不被允許的。為了避免,就有了類字首來區分。防止兩個框架裡類名可能重名的問題
19.真正的類怎麼區別?OC裡沒有的類的概念
2015年07月19日07:56:44
課堂程式碼分析
一、點餐系統
1.UI設計
1)頂部選單條:UIView
2)選單條上又一個隨機按鈕,一個標題Label
3)中間一個PickerView
4)下面6個Lbale:水果,主菜,飲料以及對應的三個待定Label
2.程式碼分析
1)將要操作的控制元件進行連線
@property (nonatomic,weak) IBOutlet UIPickerView *pickerView;
@property(nonatomic,strong) NSArray *food;
2)載入資料
-(NSArray *)foods
3)設定介面啟動後初始資料
for(int commponent = 0;componment<self.foods.count;++component)
{
[self pickerView:nil didSelectRow:0 inComponent:component];
}
4)設定資料來源和代理
可以UI設計的時候完成
5)實現資料來源方法
返回列
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return self.foods.count;
}
返回行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
NSArray *subfoods = self.foods[component];
return subfoods.count;
}
6)實現代理方法
返回行文字
-(NSString *)pickerView:(UIPicerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
retutn self.foods[component][row];
}
設定選中某列某行後的操作
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if(component == 0)
{
self.fruitLabel.text = self.foods[component][row];
}
else if
{
self.mainLabel.text = self.foods[component][row];
}
esle if
{
self.drinnkLabel.text = self.food[component][row];
}
}
7)實現隨機按鈕的事件處理方法
-(IBAction)randomFood
{
for(int component = 0; component < self.foods.count; ++component)
{
NSUInteger count = [self.foods[component] count];
//獲取在當前列選中的行號
NSUInteger oldrow = [self.pickerView selectedRowInComponent:component];
NSUInteger row = oldRow;
//保證和上次不一樣
while(row == oldRow)
{
row = arc4random()%count;
}
//讓pickView主動選中第component列的第row行
[self.pickerView selectRow:row inComponent:component animated:YES];
//設定選中某列某行後的操作
[self pickerView:nil didSelectRow:row inComponent:component];
}
}
知識總結:
)返回列(資料方法,實現)
2)返回行(資料方法,實現)
3)返回行文字(代理方法,實現)
4)設定選中後的操作(代理方法,實現)
5)獲取在當前列已經選中的行號(控制元件物件 方法,呼叫)
6)主動選中第component列的第row行(控制元件物件 方法,呼叫)
7)生成隨機數//row = arc4random()%count;
二、國旗選擇
和點菜系統的區別:用一列顯示兩列的內容
1.UI設計
1)自定義pickerView行檢視樣式實現一列顯示兩列的內容
2)檢視繼承UIView
3)自定義檢視:一個Label,一個UIImageView
4)設定約束
UIImageView:寬固定,上下右固定
Label:寬固定,上下左固定
5)面板設定關聯的xib類
2.程式碼分析
1.定義xib類
1)引入模型類屬性
2)定義連線控制元件屬性
3)定義一個從xib檔案載入控制元件的類方法
4)實現類方法,重寫set資料模型,給控制元件賦值
2.控制器
-(void)viewDidLoad
{
[super viewDidLoad];
//建立pickerView,預設有寬高
UIPickerView *pickerView = [[UIPickerView alloc] init];
[self.view addSubview:pickerView];
pickerView.delegate = self;
pickerView.dataSource = self;
}
//返回列
-(NSInteger)numberOfComponentsInPickrView:(UIPickerView *)pickerView
{
return 1;
}
//返回行
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return self.flags.count;
}
//返回pickerView檢視的樣式
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
//ios6 要判斷view是否為空,為空再建立
FLagView *flagView = [FlagView flag];
flagView.flag = self.flags[row];
return flagView.flag;
}
//設定pickerView的高度
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 60;
}
知識總結
1)pickerView的建立
2)設定pickerView的高度
3)返回一個行檢視UIView型別的
4)判斷是否為空的簡寫(感嘆號,取反) if(!_flags){}
三、鍵盤處理:根據不同的文字框,彈出不同樣式的輸入檢視
1.UI設計
1)新增兩個文字框
2)輔助控制元件xib檔案
a:一個ToolBar控制元件
b:三個item控制元件,一個FlexibleSapce控制元件
2.程式碼分析
===xib程式碼設計
1)三個item控制元件連線屬性
2)載入控制元件的類方法
3)定義完成文字框選擇的工作代理協議(監聽按鈕在xib類,操作的文字框在控制器類,於是就有了代理來實現這兩個類之間的通訊)
4)定義代理變數
5)實現監聽方法(用代理呼叫控制器類實現的方法),實現類方法(返回控制元件物件實體)
===控制器
1)屬性設計
兩個文字框
一個文字框陣列:用來間接區別不同文字框
一個輸入輔助控制元件物件(上一個,下一個,完成)
一個記錄當前使用的文字框的陣列索引
2)程式碼實現分析
在didViewLoad裡
1.監聽文字框點選,監聽輔助檢視的點選:引入2者的代理;並指定代理
<UITextFieldDelegate,HMToolBarDelegate>;
self.birth.delegate = self;
2.監聽datePicker,沒有代理協議,但是它繼承自
UIControl(UIControl繼承UIView),於是可以向它指定一個自定義的方法
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicer.locale = [[NSLoacle alloc] initWithLocaleIndentifier:@"zh_CN"];//讓它顯示中文
datePicker.datePickerMode = UIDatePickerModeDate;//設定時間的樣式
//監聽自身值是否發生改變,改變則去執行指定方法
[datePicker addTarget:self action:@selector(timeChange:) forControlEvents:UIControlEventValueChanged];
3.鍵盤是文字框的預設輸入檢視,也可以自定義;於是可以重新設定文字框的輸入檢視
self.birth.inputView = datePicker;
4.文字框不僅有輸入檢視,還有輸入檢視對應的輔助檢視,也可以自定義xib檔案
HMToolBar *toolBar = [HMToolBar toolBar];
self.toolBar = toorBar;
toorBar.toolBarDelegate = self;
self.birth.inputAccessoryView = toolBar;
5.一個文字框陣列:用來間接區別不同文字框
self.textFields = @[self.birth,self.city,self.time];
其他方法
1.實現輔助檢視的代理方法:用一個switch利用按鈕的列舉型別做出不同判斷
-(void)toorBar:(HMToolBar *)toolBar withButtonType:(HMToolBarButtonType)type
{
switch(type)
{
case:HMToolBarButtonTypePre:
[self.textFields[self.textIndex -1 ] becomeFirstResponder];//文字框獲取焦點成為第一響應者
break;
case:HMToolBarButtonTypeNext:
[self.textFields[self.textIndex + 1] becomeFirstResponder];
break;
case:HMToolBarButtonTypeDone:
[self.view endEditing:YES];//收起鍵盤
break;
default:
break;
}
}
2.實現datePicker值改變後要執行的方法
-(void)timeChange:(UIDatePicket *)sender
{
NSDate* date = sender.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd";
NSString *time = [formatter stringFromDate:date];
self.birth.text = time;
}
3.實現讓文字框文字不能改變的代理方法,但是這個方法不能阻止文字框被賦值,依然會顯示游標
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)
{
return NO;
}
4.文字框開始編輯的時候呼叫,就是文字框獲取到游標的時候
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
self.textIndex = [self.textFields indexOfObject:textField];//獲取當前文字框的索引
if(self.textIndex == 0 )
{
self.tooBar.preButton.enabled = NO;
self.tooBar.nextButton.enabled = YES;
}
else if
{
self.tooBar.preButton.enabled = YES;
self.tooBar.nextButton.enabled = NO;
}
else
{
self.toolBar.nextButton.enabled = YES;
self.toolBar.preButton.enabled = YES;
}
}
知識總結
方法:
1.監聽輔助控制元件的item的點選(實現自定義的代理方法)
2.監聽文字框是否開始編輯 (文字框自帶的代理方法)
3.讓文字框不可編輯(文字框自帶的代理方法)
4.監聽datePicker值有沒有改變 (新增處理值改變(UIControlEventValueChanged)的自定義方法)
屬性
1.datePicker的local、datePickerMode
2.textField的inputView、inputAccessoryView
補充:
1.關於文字框的代理方法
1)是否允許使用者編輯
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
return NO;
}
2)文字框開始編輯的時候呼叫
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
}
3)是否允許文字框結束編輯
-(BOOL)textFieldShouldEditing:(UITextField *)textField
{
}
4)文字框結束編輯的時候呼叫
-(void)textFieldDidEndEditing:(UITextField *)textField
{
}
2.用Block實現代理流程
1)首先在委託類.h裡定義一個Block
@property(nonatomic,copy)void (^clickBlock)(HMToolBarButtonType type);
2) 然後在委託類的.m裡的控制元件監聽方法裡去用
-(IBAction)preClikc:(id)sender
{
if(self.clickBlock)
{
self.clickBlock(HMToolBarButtonTypePre);
}
}
3) 去“代理”類去實現(這個“代理”類就是,就是建立委託類物件的那個類檔案)
a:首先建立一個委託物件
b:用這個委託物件點出這個Block屬性
c:建立一個實現預期功能的程式碼塊賦給這個屬性就OK了。
4)代理和Block在這方面能力的區別
a:代理可以對應多個方法的實現,Block只能對應一個方法
b:代理要定義一個代理協議,Block不用