1. 程式人生 > >2015年07月18日第11天筆記

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不用