亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS學習筆記——iOS高級控件

2019-11-14 19:31:11
字體:
來源:轉載
供稿:網友

UITableView

  UITableView的樣式有兩種,一種是Grouped(左圖),另一種是Plain(右圖),如下圖,它的屬性是style,類型為UITableViewStyle,枚舉值分別是UITableViewStyleGrouped和UITableViewStylePlain;

用這個控件的ViewController可以使用UITableViewController,使用了這個ViewController可以不需要另外創建UITableView,里面也包含了UITableViewDataSource和UITableViewDelegate這兩個實現,這兩個類稍后討論,但是也有不方便的地方,默認情況下使用UITableViewController創建的tableView是充滿全屏的,如果需要用到tableView是不充滿全屏的話,我們應該使用UIViewController。

  UITableView的數據可以通過靜態綁定和動態綁定,控件默認是動態綁定的,在StoryBoard里面設置Content屬性,它有兩個值Static Cell和Dynamic,顧名思義了。如果設置了Static Cell,點擊Section的標題則可以控制UITableView的行數,添加了行數則可以。若要往行里添加內容可以直接把控件拖入單元格里面。

  如果要動態的往UITableView添加內容,則需要實現UITableViewDataSource和UITableViewDelegate的幾個方法。其實這兩個方法的共同作用有點類似于Andriod中的各種Adapter,Android中的Adapter是指定了列表中各個元素的布局,列表的數據源,而這兩個協議要實現的方法是傳遞數據源的情況還有各個數據單元格的定義情況。

 

//返回分組的數量-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{}//每個分組里面行數-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{}//定義單元格的內容,并返回。-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{}

 

  如果使用了UITableViewController,則可以直接去實現這幾個方法,假如用的是UIViewController,則在類聲明的地方顯式實現UITableViewDataSource和UITableViewDelegate。

  UITableView的每個單元格對象都是UITableViewCell類型的。在上面最后的一個方法里面構造并返回,單元格的布局類型有幾種,它是UITableViewCellStyle類型的枚舉,一般在初始化函數中設置它的類型。

  • UITableViewCellStyleDefault:只有一個靠左對齊的Label,它的值通過cell的textLabel設置

  • UITableViewCellStyleValue1:一個左對齊的Label和一個右對齊藍色字體的Label,左邊的Label是通過cell的textLabel設置,右邊的Label是通過cell的detailTextLabel設置

  • UITableViewCellStyleValue2:同樣有兩個Lebel,但左邊的Lable是右對齊的,Label的屬性如上一個一樣,效果如下圖

  • UITableViewCellStyleSubtitle:同樣有兩個Lable,這種樣式的第二個Lable充當了副標題

 

每個單元格的布局都是分左中右三塊,最左邊是圖標,最右邊是附件視圖,附件一般是箭頭,它通過UITableViewCellaccessoryType類型的屬性accessoryType,它的值有以下幾個

  • UITableViewCellAccessoryNone,
  • UITableViewCellAccessoryDisclosureIndicator,
  • UITableViewCellAccessoryDetailDisclosureButton,
  • UITableViewCellAccessoryCheckmark,
  • UITableViewCellAccessoryDetailButton

官方文檔上是上面五個值,但是我的環境是iOS6的,只有截圖的那幾個值(None除外)。附件區域也可以自己添加控件,如下面這樣的形式可以在每一行中添加了一個開關控件

cell.accessoryView= [[UISwitch alloc]init];

 

 

UITableViewCell提供了imageView來設置每一個單元格的圖標它是一個UIImageView類型的屬性,可以直接通過設置它的image屬性來給每一行添加一個圖標如

cell.imageView.image=[UIImage imageNamed:@"African Daisy.gif"];

 

假如這些控件還是太少的話,還可以通過Cell的contentCell的addSubview方法來添加控件到單元格里面,如下所示。

[cell.contentView addSubview:label];

 

但是要控制好添加到Cell里面控件的數量,因為如果控件數量多于3、4個的話,會比較影響效率,在列表滾動的時候會出現卡頓了。

在UITableView的表頭表尾,分組頭分組尾都可以添加視圖,如果添加表頭表尾的視圖的話可以通過設置UITableVIew的tableHeaderView和tableFoorterView兩個屬性,如下所示

self.tableView.tableHeaderView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bd_logo1.png"] highlightedImage:nil];self.tableView.tableFooterView=[[UISwitch alloc]init];

 

那添加分組頭和分組尾時就可以通過實現下面兩個方法

-(NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{}-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{}

 

之前說了那么多,現在給個簡單的例子來說明動態綁定的步驟

這里用到的數據源是自己填充上去的,

@PRoperty(nonatomic,strong) NSArray *carGroups;-(NSArray*)carGroups{if(_carGroups==nil){// 1.創建模型HGTableviewModel *cg1 =[[HGTableviewModel alloc]init];cg1.group=@"日本仔車";cg1.desc=@"日系車";cg1.cars=@[@"本田",@"豐田",@"日產"]; HGTableviewModel *cg2 = [[HGTableviewModel alloc] init];cg2.group=@"鬼佬車";cg2.desc=@"德國車";cg2.cars=@[@"大眾",@"別克",]; // 2.將模型添加到數組中_carGroups = @[cg1, cg2];}return _carGroups;}

 

在viewDidLoad方法中給tableView指定數據源

self.tableView.dataSource=self;

 

在這個方法里面可以對tableView做其他設置,這里不一一例舉了,最后就實現之前獲取分組數量,每個分組的列數,構造單元格的三個方法

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{return self.carGroups.count;}-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{HGTableviewModel *item= self.carGroups[section];return item.cars.count;}-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{UITableViewCell *cell=nil;if(indexPath.section==0)cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];elsecell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];HGTableviewModel *item=self.carGroups[indexPath.section];cell.textLabel.text= item.cars[indexPath.row];cell.accessoryType= UITableViewCellAccessoryDetailDisclosureButton;cell.detailTextLabel.text=item.desc;if(indexPath.section==0)cell.imageView.image=[UIImage imageNamed:@"African Daisy.gif"];elsecell.accessoryView= [[UISwitch alloc]init];//[UIButton buttonWithType:UIButtonTypeContactAdd];return cell;}

 

如果要給選中單元格這個事件綁定方法,只需要實現下面這個方法則可,如下面代碼所示,選中了某行后彈出一個框說明當前選中了是哪個品牌

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{NSString *msg=[[NSString alloc]initWithFormat:@"你選中了 %@", ((HGTableviewModel*)self.carGroups[indexPath.section]).cars[indexPath.row]];UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"選中行" message:msg delegate:self cancelButtonTitle:nil otherButtonTitles:@"確定", nil]; [alert show];}

 

UIDatePickerView

  UIDatePickerView是一個日期時間選取的空間,它是以一個滾輪的形式呈現出來,可以通過設置它的當前顯示時間,最大最小時間范圍,這些值都是NSDate類型的,

NSDateFormatter *formatter=[[NSDateFormatter alloc]init];[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];self.dtpDateTime.minimumDate= [formatter dateFromString:@"2011-01-01 00:00:00"];self.dtpDateTime.maximumDate=[formatter dateFromString:@"2015-01-01 00:00:00"];self.dtpDateTime.date=[formatter dateFromString:@"2015-03-01 00:00:00"];

 

它有一個datePickerMode屬性來設置DatePicker的顯示類型,它是一個UIDatePickerMode類型的枚舉,分別有下面這些值

  • UIDatePickerModeTime:時鐘模式,只有時分,
  • UIDatePickerModeDate:日期模式
  • UIDatePickerModeDateAndTime:日期時間模式,時間只有時分,日期只有月日
  • UIDatePickerModeCountDownTimer:時鐘模式,只有時分,但是24小時

效果圖按順序如下圖所示

UIDatePicker有個ValueChange事件,是在控件的Value發生改變之后觸發的,需要綁定事件,通過StoryBoard或者使用addTargetWithActionForControlEvents方法,下面則是改變了值之后輸出當前的日期

- (IBAction)dtpValueChanged:(id)sender {NSLog(@"當前日期是 %@",self.dtpDateTime.date);}

 

UipickerView

  UIPickerView是把數據列表以滾輪的形式呈現給用戶,與UITableVIew類似,它的數據綁定需要實現UIPickerViewDataSource和UIPickerViewDelegate兩個協議,但是這個UIPickerView卻不支持靜態綁定數據。綁定數據主要是實現兩個協議的下面這些方法

//返回顯示的列數-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{}//返回當前列顯示的行數-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{}//下面的方法是PickerDelegate協議的方法,可以二選一,主要是返回每一項顯示的內容- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{}- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{}

 

加入滾輪中只是一些單純的文本信息則可以使用返回String的那個方法,如果是每一項都是一些文本以外的內容,則需要使用返回UIView的那個方法,既然是返回View則說明可以返回任何的控件,包括自定義的也可以。

假如要在UIPickerView被選中后觸發事件執行方法,則實現下面的方法則可

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{NSLog([[NSString alloc]initWithFormat:@"SELECT Item %@ " ,[pickerDs objectAtIndex:row] ] );}

 

下面則給出一個例子完整說明給一個UIPicker綁定數據的過程,里面的數據抄襲了某位網友的博文,莫怪。

首先是要實現兩個協議

@interface HGDatePickerViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate >@end 

通過StoryBoard建立了關聯的變量picker和定義數據源一個NSArray的變量,然后在viewDidLoad里面添加下面這些代碼,其中設置deletage的最為關鍵

pickerDs=[[NSArray alloc]initWithObjects:@"許嵩",@"周杰倫",@"梁靜茹",@"許飛",@"鳳凰傳奇",@"阿杜",@"方大同",@"林俊杰",@"胡夏",@"邱永傳", nil];self.picker.delegate=self;

 

然后實現之前提到的方法,在這里把兩個UIPickerViewDelegate的方法列舉出來了,返回View的那種是返回一個UILabel,它們的效果圖分別列舉

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{return 1;}-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{return [pickerDs count];}- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{return [pickerDs objectAtIndex:row];}- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view{UILabel *myView = nil;myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 180, 30)];myView.text = [pickerDs objectAtIndex:row];myView.textAlignment = UITextAlignmentCenter;myView.font = [UIFont systemFontOfSize:14];myView.backgroundColor = [UIColor clearColor];return myView;}

  

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component實現的效果

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view實現的效果

  其實UIPicker可以實現像以前在BS或CS開發中的下拉菜單多級聯動效果的,這里都不詳細列舉了,主要是通過-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component方法根據當前級別的數據來調用[self.picker reloadComponent:xxx];方法來出發下一級別的值重新載入。

UIActionSheet

  UIActionSheet這個控件是在之前看UIDatePicker時別人用了而發現的,感覺也比較有用所以也記錄下來,本人沒有iOS的設備,故有哪些控件都不太了解,之前在一個界面原型圖中見過這個控件,但不知道它是ActionSheet。這個ActionSheet個人感覺和AlertView很像。也能給界面彈出按鈕選擇框,同時具備遮罩的效果。

使用這個UIActionSheet需要實現UIActionSheetDelegate協議,構造和初始化ActionSheet的代碼如下

UIActionSheet *as=[[UIActionSheet alloc]initWithTitle:@"This is my First ActionSheet" delegate:selfcancelButtonTitle:@"Cancle" destructiveButtonTitle:@"Sure" otherButtonTitles:@"First Btn",@"Second Btn", nil];

 

在上述參數中有兩個比較特殊的按鈕,cancelButton和destructiveButton,在ActionSheet中按鈕也是有一定序列的,如AlertView那樣,所有按鈕都是有一定順序的,按默認的情況下,destructiveButton是排在第一,是一個紅色的按鈕,接著是到ortherButton,它們的順序由添加進去的順序而定,最后的是cancelButton,是一個黑色的按鈕。在上面的初始化函數中如果那個按鈕不需要的話則可以傳入nil則可。上面的ActionSheet顯示的效果如下圖

添加OtherButton也可以調用下面方法來添加

[as addButtonWithTitle:@"addButton"];

 

destructiveButton也可以更替由其他按鈕來充當,通過下面這個屬性的設置則可

as.destructiveButtonIndex=1;

 

效果如下圖

顯示ActionSheet則調用下面的方法

[as showInView:self.view];

 

在開發過程中,發現有時候UIActionSheet的最后一項點擊失效,點最后一項的上半區域時有效,這是在特定情況下才會發生,這個場景就是試用了UITabBar的時候才有。解決辦法:

在showView時這樣使用,[actionSheet showInView:[UIapplication sharedApplication].keyWindow];或者[sheet showInView:[AppDelegate sharedDelegate].tabBarController.view];這樣就不會發生遮擋現象了。

ActionSheet的actionSheetStyle屬性是設置ActionSheet的樣式,它是一個UIActionSheetStyle類型的枚舉,它是值有下面三種

  • UIActionSheetStyleDefault //默認風格:灰色背景上顯示白色文字
  • UIActionSheetStyleBlackTranslucent //透明黑色背景,白色文字
  • UIActionSheetStyleBlackOpaque //純黑背景,白色文字

與UIAlertView類似,UIActionSheet也是有一組方法在ActionSheet里面出現,點擊,消失各個時候觸發調用的

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{} -(void)willPresentActionSheet:(UIActionSheet *)actionSheet{}-(void)didPresentActionSheet:(UIActionSheet *)actionSheet{}-(void)actionSheetCancel:(UIActionSheet *)actionSheet{ }-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{}-(void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex{}

 

到這里遇到了在UIAlert中一樣知什么時候會觸發的actionSheetCancel方法,這些方法的觸發順序如下(actionSheetCancel是按照UIAlertView中的順序推斷出來的)

willPresentActionSheet——>didPresentActionSheet

點擊了按鈕之后

actionSheetclickedButtonAtIndex——>willDismissWithButtonIndex——>didDismissWithButtonIndex


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美大片va欧美在线播放| 久久视频在线看| 懂色av中文一区二区三区天美| 亚洲淫片在线视频| 欧美美女18p| 91精品中文在线| 欧美性做爰毛片| 亚洲无限乱码一二三四麻| 91免费看片网站| 91久久综合亚洲鲁鲁五月天| 久久久日本电影| 亚洲人成网站色ww在线| 久久精品国产精品亚洲| 高清欧美性猛交xxxx黑人猛交| 国产中文欧美精品| 欧美日韩国产一区在线| 91久久久久久久久久久| 亚洲国产精品福利| 国产在线观看不卡| 欧美精品videosex牲欧美| 精品国产欧美成人夜夜嗨| 91系列在线观看| 日韩中文视频免费在线观看| 欧美乱妇高清无乱码| 茄子视频成人在线| 一本色道久久88综合亚洲精品ⅰ| 91精品国产91久久久久久吃药| 国产成人免费av| 中文字幕在线视频日韩| 大伊人狠狠躁夜夜躁av一区| 日本高清久久天堂| 久久精品在线播放| 欧美香蕉大胸在线视频观看| 中文字幕欧美国内| 久久久久免费精品国产| 欧美性猛交xxxx富婆弯腰| 精品久久久久久久久久久久| 97视频在线观看成人| 中文字幕欧美在线| 九九热精品视频| 亚洲第一免费播放区| 久久精品91久久久久久再现| 国产午夜精品久久久| 日韩av一卡二卡| 欧美亚洲一级片| 日韩网站免费观看| 国产99视频精品免视看7| 中文字幕一区日韩电影| 欧洲精品在线视频| 亚洲xxx自由成熟| 日韩成人中文电影| 亚洲毛片在线观看.| 欧美亚洲另类视频| 亚洲国产精品悠悠久久琪琪| 国产欧美精品一区二区三区-老狼| 国产精品户外野外| 成人乱人伦精品视频在线观看| 欧美激情一区二区三级高清视频| 青青草一区二区| 欧美在线视频一区二区| 亚洲精品资源美女情侣酒店| 久久久亚洲精品视频| 国产欧美一区二区三区久久| 亚洲欧美中文另类| 亚洲欧美在线x视频| 国产mv久久久| 欧美精品久久久久久久| 亚洲影院色在线观看免费| 98精品国产高清在线xxxx天堂| 日韩高清电影免费观看完整| 欧美日韩国产在线看| 欧美性受xxxx白人性爽| 日本久久亚洲电影| 日韩中文字幕在线精品| 日韩精品极品毛片系列视频| 91国产美女在线观看| 久久成人av网站| 中文字幕九色91在线| 国产精品电影久久久久电影网| 免费不卡欧美自拍视频| 日韩av电影中文字幕| 国产精品白嫩初高中害羞小美女| 亚洲激情在线观看| 国产精品wwwwww| 中文字幕亚洲欧美日韩2019| 国产精品爽爽爽爽爽爽在线观看| 538国产精品一区二区在线| 操日韩av在线电影| 日韩中文字幕在线免费观看| 久久久久久一区二区三区| 国产精品一区二区三区久久久| 51视频国产精品一区二区| 日韩av网址在线| 亚洲乱码一区二区| 欧美黑人视频一区| 欧美日韩中文在线观看| 日韩在线视频观看| 国产日韩换脸av一区在线观看| 午夜精品久久久久久久白皮肤| 久久久久久久久爱| 中文字幕欧美在线| 日韩精品在线观看一区二区| 51色欧美片视频在线观看| 亚洲国产福利在线| 欧美性感美女h网站在线观看免费| 国产不卡一区二区在线播放| 欧美黑人性猛交| 日韩国产欧美区| 国产精品久久久久久久一区探花| 日韩在线观看免费高清完整版| 亚洲女人天堂视频| 日韩精品一二三四区| 一二美女精品欧洲| 亚洲国产婷婷香蕉久久久久久| 久久人人爽人人爽人人片av高清| 亚洲欧洲在线视频| 亚洲国产精品悠悠久久琪琪| 欧美激情视频一区二区| 97在线看免费观看视频在线观看| 欧美夫妻性生活xx| 国产亚洲一区精品| 91tv亚洲精品香蕉国产一区7ujn| 欧美成人剧情片在线观看| 久久久亚洲精选| 日韩精品在线视频美女| 久久免费国产精品1| 九九热r在线视频精品| 51色欧美片视频在线观看| 国产精品91在线| 亚洲另类图片色| 91网站免费观看| 少妇久久久久久| 日韩av综合网站| 日本精品久久中文字幕佐佐木| 国产三级精品网站| 成人亚洲综合色就1024| 91精品国产高清久久久久久久久| 亚洲成人精品视频在线观看| 精品五月天久久| 亚洲一区二区久久久久久久| 亚洲第一av在线| 日韩在线免费视频| 国产亚洲精品美女久久久久| 久久久国产精品x99av| 中文字幕精品影院| 久久久久久九九九| 色婷婷综合久久久久| 日本成人免费在线| 欧美日韩免费观看中文| 久久精品成人动漫| 不卡av日日日| 亚洲最新av在线| 久久91精品国产91久久久| 国产精品久久999| 另类色图亚洲色图| 精品偷拍各种wc美女嘘嘘| 国产999精品久久久影片官网| 久久久久久久久久久网站| 欧美丝袜美女中出在线| 日日骚久久av| 欧美激情视频在线免费观看 欧美视频免费一| 精品久久久久久中文字幕大豆网| 国产日韩在线免费| 亚洲欧美三级伦理|