標籤:原因 編輯 att should layer 首字母 ble char rac
1、UIPickerView簡介
UIPickerView繼承自UIView,且遵守了協議;UIPickerView的高度(height = 162)不能改變, 但UIPickerView中的行高可以改變。
UIPickerView兩個必須實現的資料來源方法:
UIPickerView常見屬性:
UIPickerView代理方法:
#pragma mark - <UIPickerViewDelegate>/** * pickerView每一列寬度 */- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component{ return 100;}/** * pickerView每一行高度 */- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component{ return 60;}/** * pickerView每行顯示內容 */- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ return @"賀華峰";}/** * pickerView顯示字串時,字串富文字屬性(可設定字串字型大小、字型顏色...),返回nil時不影響顯示文字 */- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component{ return nil;}/** * pickerView每行顯示視圖, 當與pickerView:titleForRow:forComponent:同時實現時, 優先調用 */- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view{ return nil;}/** * pickerView選中某行或某列時調用, 只有使用者拖拽才會調用 */- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { NSLog(@"%s", __func__);}
UIPickerView顯示?問題:
- 原因: 只設定了資料來源, 沒有設定代理實現返回pickerView要顯示的內容; 所以, pickerView顯示預設的
?。
點擊隨機點餐按鈕實現隨機點餐:
/*** 隨機點餐*/- (IBAction)random { for (int i = 0; i < self.foods.count; i++) { // 1. 隨機數 int random = arc4random_uniform((u_int32_t)[self.foods[i] count]); // 2. 選中pickerView對應的列、行 [self.pickView selectRow:random inComponent:i animated:YES]; // 3. 將隨機選中的資料設定到對應的Label上, 此處的row切記不能再重新使用隨機數 //[self pickerView:self.pickView didSelectRow:arc4random_uniform((u_int32_t)[self.foods[i] count]) inComponent:i]; [self pickerView:self.pickView didSelectRow:random inComponent:i]; }}
- 在實現隨機點餐的時候兩大注意事項:
- 使用隨機數函數時要注意每調用一次都會產生新的隨機數, 如果要多次使用同一個隨機數; 需要定義一個變數儲存要多次使用的隨機數。
- 調用pickerView的
selectRow:inComponent:animated:時, pickerView的代理方法pickerView:didSelectRow:inComponent:方法不會調用, 需要我們手動調用; 但是, 當使用者拖拽pickerView時代理方法pickerView:didSelectRow:inComponent:方法會自動調用。
2、UIPickerView實現國旗選擇(MVC模式)
- Model(模型): HFFlag
- View(視圖): HFFlagView
- 使用xib封裝國旗視圖,在資料模型的set方法中設定控制項資料;
- Controller(控制器): Controller
- 懶載入讀取plist檔案,擷取資料;
- 實現資料來源方法;
- 實現代理方法,返回UIPickerView自訂顯示視圖。
3、UIDatePicker簡介
4、UITextField代理方法
- 要實現UITextField代理方法, 必須先遵守協議; 成為UITextField的代理。
#pragma mark - <UITextFieldDelegate> /** * @return YES : 文字框允許編輯 * @return NO : 文字框不允許編輯 */ - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ return NO; } /** * 文字框成為第一響應者 */ - (void)textFieldDidBeginEditing:(UITextField *)textField{ NSLog(@"%@", textField); } /** * 是否允許當前文字框結束編輯 * * @return YES : 文字框允許結束編輯, 且當前正在編輯的文字框辭去第一響應者身份 * @return NO : 當前文字框不允許結束編輯直至結束 */ - (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ return NO; } /** * 文字框已經結束編輯 */ - (void)textFieldDidEndEditing:(UITextField *)textField{ NSLog(@"%s", __func__); } /** * 文本款是否能夠顯示輸入 * * @param range 當前文字框游標所在位置, 與輸入之後游標所在位置 * @param string 替換文字框中range範圍內容 * * @return YES : 輸入文字框的內容能替換range範圍,游標移動 * @return NO : 文字框不能替換,游標不移動 */ - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ return NO; } /** * 只要點擊文字框清除按鈕, 調用此方法 * * @return YES : 點擊清空按鈕清空文字框 * @return NO : 點擊清空按鈕忽略, 文字框內容不清空 */ - (BOOL)textFieldShouldClear:(UITextField *)textField{ return YES; } /** * 只要點擊鍵盤return鍵調用此方法 */ - (BOOL)textFieldShouldReturn:(UITextField *)textField{ return NO; }
以下屬性是設定文字框下一次編輯開始時自動清空文字框內容,下一次編輯開始時會自動調用textFieldShouldClear:方法以清空文字框:
自訂鍵盤, 設定文字框的inputVeiw屬性;自訂文字框輸入視圖。
5、將時間以格式字串形式顯示步驟:
- <1> 擷取要顯示的時間;
- <2> 建立時間格式管理對象;
- <3> 設定時間格式對象的時間格式字串;
<4> 時間格式對象調用其stringFromDate:方法, 傳入要顯示的時間; 返回格式時間字串。
樣本程式:
// 1. 建立datePickerUIDatePicker *datePicker = [[UIDatePicker alloc] init];datePicker.datePickerMode = UIDatePickerModeDate;datePicker.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh"];// 2. 擷取datePicker時間NSDate *date = datePicker.date;// 3. 時間格式管理對象NSDateFormatter *formatter = [[NSDateFormatter alloc] init];// 4. 設定時間格式字串formatter.dateFormat = @"yyyy-MM-dd";// 5. 擷取格式時間字串NSString *dateStr = [formatter stringFromDate:date];
細小知識點:
<1> storyboard中直接拖線設定控制器為控制項的代理與資料來源, 在控制器可以不用寫明相應的協議; 因為連線時已經自動化佈建控制器遵守相應的協議, 為保持代碼可讀性通常依舊會在控制器代碼中聲明遵守相應的協議。
<2> Xcode中能直接使用jpg、png、gif格式的圖片。
<3> id與instancetype區別:
- instancetype: 作為方法的傳回值類型時能自動識別當前接收類型與方法實質傳回型別是否一致,不能聲明變數;
- id: 作為方法傳回值類型時方法返回對象的接收類型可以是任意類型,且可以聲明變數;id類型的對象可以調用任何方法,編譯時間不會報錯;運行時如果調用了沒有實現的方法程式會崩潰;id類型變數不能使用點文法。
<4> 字串調用NSString類的capitalizedString方法,返回字串首字母大寫之後的字串。
<5> 所有繼承自UIControl類的控制項都可以採用addTarget:action:forControlEvents:方法監聽控制項。
實用小技巧:
<1> NSLog方法使用%s重列印 __func__: 輸出調用當前方法所在的類;
<2> Debug中調試顯示當前介面所有layer(圖層):
<3> Xcode快速鍵:
- 1、 command + option + 斷行符號 : 分屏;
- 2、 command + 斷行符號 : 退出分屏。
- 3、command + option + [ : 代碼上調
- 4、command + option + ] : 代碼下調
- 5、command + [ : 代碼左移
- 6、command + ] : 代碼右移
<4> 當無法確認控制項監聽觸發事件類型時, 可以將storyboard中控制項連線到代碼中以方便查看事件類型。
iOS核心筆記——UIPickerView