日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍...

發布時間:2023/12/2 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 創建集合視圖,設置相關屬性以滿足要求

1.1 問題

集合視圖控制器UIConllectionViewController是一個展示大量數據的控制器,系統默認管理著一個集合視圖UICollectionView,功能幾乎和UITableViewController差不多,能夠以多行多列的形式展示數據。

集合視圖UICollectionView繼承至UIScrollView,也同tableView一樣有兩個協議,分別是UICollectionViewDataSource數據源協議和UICollectionViewDelegate委托協議,本案例將學習如何使用UICollectionView來展示數據,如圖-1所示:

圖-1

1.2 方案

首先創建一個SingleViewApplication項目,然后創建一個TRMyCollectionViewController集合視圖控制器,該視圖控制器繼承至UICollectionViewController,然后在TRAppDelegate中創建一個帶有導航的TRMyCollectionViewController集合視圖控制作為根視圖控制器。

其次在xib文件刪除自動生成的View視圖,增加一個CollectionView視圖,并將File’s Owner的view屬性連線到CollectionView,同時也將collectionView的dataSource和delegate進行連線。

在xib中選中collectionView在右邊欄的檢查器中設置collectionView的各種屬性,包括單元格的寬高、分區的邊距,單元格之間的間距,滾動方向等。

然后創建一個帶有xib文件的TRMyCell類,該類繼承至UICollectionViewCell,UICollectionViewCell是集合視圖的單元格類,是集合視圖的重要組成部分,與表視圖的單元格不同,由于集合視圖的單元格沒有系統定義好的內容視圖和輔助視圖,所以集合視圖的單元格通常都需要自定義。

最后在TRMyCollectionViewController中注冊集合視圖的單元格,然后實現集合視圖的協議方法,給集合視圖加載數據。

1.3 步驟

實現此案例需要按照如下步驟進行。

步驟一:創建TRMyCollectionViewController類

在Xcode項目中創建一個TRMyCollectionViewController集合視圖控制器,該視圖控制器繼承至UICollectionViewController,然后在TRAppDelegate中創建一個帶有導航的TRMyCollectionViewController集合視圖控制作為根視圖控制器,代碼如下所示:

  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  • {
  • self.window?=?[[UIWindow?alloc] initWithFrame:[[UIScreen?mainScreen] bounds]];
  • self.window.backgroundColor?=?[UIColor?whiteColor];
  • TRMyCollectionViewController?*myCVC?=?[[TRMyCollectionViewController?alloc]initWithNibName:@"TRMyCollectionViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:myCVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中設置集合視圖

    將xib文件中的view視圖刪除,從對象庫中拖拽一個CollectionView到xib中,注意不要選成了CollectionViewController,如圖-2所示:

    圖-2

    然后將File’s Owner的view屬性連線到CollectionView,同時也將collectionView的dataSource和delegate進行連線,如圖-3所示:

    圖-3

    最后在右邊欄的第五個檢查器中設置collectionView的相關屬性,包括單元格的寬高,分區的邊距以及單元格之間的間距等,如圖-4所示:

    圖-4

    由于UICollectionView是繼承至UIScrollView,所以也可以滾動,默認的滾動方向是垂直的,也可以通過右邊欄的第四個檢查器將滾動方向設置為水平的,如圖-5所示:

    圖-5

    步驟三:創建單元格類TRMyCell,自定義集合視圖單元格

    創建一個帶有xib文件的TRMyCell類,該類繼承至UICollectionViewCell,在xib文件中拖放一個Label控件到CollectionViewCell中,并設置Label的相關屬性,如圖-6所示:

    圖-6

    將Label控件關聯成TRMyCell的公開屬性displayLabel,代碼如下所示:

  • @interface?TRMyCell?: UICollectionViewCell
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*displayLabel;
  • @end
  • 然后在TRMyCollectionViewController中導入頭文件“TRMyCell.h”,并且在viewDidLoad方法里面注冊cell,代碼如下所示:

  • //定義個cell標識
  • static?NSString?*cellIdentifier?= @"MyCell";
  • -?(void)viewDidLoad
  • {
  • [super viewDidLoad];
  • self.title?= @"CollectionView";
  • //注冊cell
  • [self.collectionView?registerNib:[UINib?nibWithNibName:@"TRMyCell" bundle:nil] forCellWithReuseIdentifier:cellIdentifier];
  • }
  • 步驟四:實現集合視圖的協議方法,加載數據

    首先實現集合視圖的協議方法numberOfSectionsInCollectionView:告訴集合視圖需要顯示的分區數,代碼如下所示:

  • -?(NSInteger)numberOfSectionsInCollectionView:(UICollectionView?*)collectionView
  • {
  • return?15;
  • }
  • 然后實現協議方法告訴集合視圖每個分區需要顯示的單元格數,如圖-6所示:

  • -(NSInteger)collectionView:(UICollectionView?*)collectionView?
  • numberOfItemsInSection:(NSInteger)section
  • {
  • return?10;
  • }
  • 最后實現協議方collectionView:cellForItemAtIndexPath:告訴集合視圖需要顯示的內容。同表視圖一樣在該方法里面使用dequeueReusableCellWithReuseIdentifier:forIndexPath:方法創建cell對象,并且根據indexPath參數設置每個cell的顯示內容,代碼如下所示:

  • -(UICollectionViewCell?*)collectionView:(UICollectionView?*)collectionView?
  • cellForItemAtIndexPath:(NSIndexPath?*)indexPath
  • {
  • TRMyCell?*cell?=?[collectionView?dequeueReusableCellWithReuseIdentifier:cellIdentifier?forIndexPath:indexPath];
  • cell.displayLabel.text?=?[NSString?stringWithFormat:@"%d",indexPath.row];
  • cell.backgroundColor?=?[UIColor?colorWithRed:0 green:1 blue:0 alpha:indexPath.row?*?0.1];
  • return cell;
  • }
  • 1.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRCustomLayoutCollectionViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc] initWithFrame:[[UIScreen?mainScreen] bounds]];
  • self.window.backgroundColor?=?[UIColor?whiteColor];
  • TRCustomLayoutCollectionViewController?*myCVC?=?[[TRCustomLayoutCollectionViewController?alloc]initWithNibName:@"TRCustomLayoutCollectionViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:myCVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRMyCollectionViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRMyCollectionViewController.h"
  • #import?"TRMyCell.h"
  • @implementation TRMyCollectionViewController
  • //定義個cell標識
  • static?NSString?*cellIdentifier?= @"MyCell";
  • -?(void)viewDidLoad
  • {
  • [super viewDidLoad];
  • self.title?= @"CollectionView";
  • //注冊cell
  • [self.collectionView?registerNib:[UINib?nibWithNibName:@"TRMyCell" bundle:nil] forCellWithReuseIdentifier:cellIdentifier];
  • }
  • -?(NSInteger)numberOfSectionsInCollectionView:(UICollectionView?*)collectionView
  • {
  • return?15;
  • }
  • -(NSInteger)collectionView:(UICollectionView?*)collectionView?
  • numberOfItemsInSection:(NSInteger)section
  • {
  • return?10;
  • }
  • -?(UICollectionViewCell?*)collectionView:(UICollectionView?*)collectionView?
  • cellForItemAtIndexPath:(NSIndexPath?*)indexPath
  • {
  • TRMyCell?*cell?=?[collectionView?dequeueReusableCellWithReuseIdentifier:cellIdentifier?forIndexPath:indexPath];
  • cell.displayLabel.text?=?[NSString?stringWithFormat:@"%d",indexPath.row];
  • cell.backgroundColor?=?[UIColor?colorWithRed:0 green:1 blue:0 alpha:indexPath.row?*?0.1];
  • return cell;
  • }
  • @end
  • ?

    本案例中,TRMyCell.h文件中的完整代碼如下所示:

    ?
  • #import<UIKit/UIKit.h>
  • @interface?TRMyCell?: UICollectionViewCell
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*displayLabel;
  • @end
  • ?

    2 使用布局創建集合視圖

    2.1 問題

    CollectionView的布局是其精髓,相當于CollectionView的大腦和中樞,負責設置CollectionView的一些屬性,包括位置、尺寸、透明度、層級關系、形狀等,本案例將使用集合視圖的布局用代碼創建一個集合視圖,如圖-7所示:

    圖-7

    2.2 方案

    UICollectionViewFlowLayout布局類是UICollectionViewLayout類的子類,稱為流式布局類,所有的單元格都依次挨著擺放。

    首先創建一個SingleViewApplication項目,然后創建一個帶有導航的TRCustomLayoutCollectionViewController視圖控制器作為根視圖控制器,該視圖繼承至UIViewController。

    其次在viewDidLoad方法里面創建一個UICollectionViewFlowLayout布局對象,設置布局對象的各種屬性。

    然后在viewDidLoad方法里面創建集合視圖對象collectionView,使用初始化方法initWithFrame:collectionViewLayout:進行初始化,collectionViewLayout:所傳遞的參數就是上一步所創建的布局對象。

    最后注冊集合視圖的cell,TRCustomLayoutCollectionViewController遵守集合視圖協議,并且實現協議方法給集合視圖加載數據。

    2.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建集合視圖項目

    在Xcode項目中創建一個TRCustomLayoutCollectionViewController視圖控制器類,繼承至UIViewController。然后在TRAppDelegate中創建一個帶有導航的TRCustomLayoutCollectionViewController視圖控制器作為根視圖控制器,代碼如下所示:

    ?
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  • {
  • self.window?=?[[UIWindow?alloc] initWithFrame:[[UIScreen?mainScreen] bounds]];
  • self.window.backgroundColor?=?[UIColor?whiteColor];
  • TRCustomLayoutCollectionViewController?*myCVC?=?[[TRCustomLayoutCollectionViewController?alloc]initWithNibName:@"TRCustomLayoutCollectionViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:myCVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:創建UICollectionViewFlowLayout布局對象

    首先在viewDidLoad方法里面創建集合視圖對象collectionView,使用初始化方法initWithFrame:collectionViewLayout:進行初始化,frame:所傳遞的參數就是屏幕的大小,collectionViewLayout:所傳遞的參數就是上一步所創建的布局對象,代碼如下所示:

    ?
  • //創建集合視圖的布局對象
  • UICollectionViewFlowLayout?*layout?=?[[UICollectionViewFlowLayout?alloc]init];
  • //設置每個cell的大小
  • layout.itemSize?=?CGSizeMake(150,?150);
  • //設置每個cell之間的間距
  • layout.minimumInteritemSpacing?=?10;
  • //設置每個分局的邊距
  • layout.sectionInset?=?UIEdgeInsetsMake(150,?20,?150,?20);
  • //設置滾動方向為水平方向
  • layout.scrollDirection?= UICollectionViewScrollDirectionHorizontal;
  • 步驟三:創建集合視圖對象collectionView

    在xib界面上拖拽一個UISlider控件,在右邊欄的第四個檢查器中將miniMum、maxiMum和current分別設置為0、1和0,然后將slider關聯成TRViewController的方法sliderValueChange:,該方法主要實現功能是拖動滑塊能控制tableView1在界面中的顯示第幾行單元格,在方法里面根據slider的value值計算出tableView的contentOffset即可,代碼如下所示:

  • //創建集合視圖對象
  • CGSize?screenSize?=?[[UIScreen?mainScreen] bounds].size;
  • UICollectionView?*collectionView?=?[[UICollectionView?alloc]initWithFrame:CGRectMake(0,?0, screenSize.width, screenSize.height) collectionViewLayout:layout];
  • 然后設置collectionView的數據源對象和委托對象,并添加到父視圖中,代碼如下所示:

    ?
  • //設置collectionView的委托對象
  • collectionView.dataSource?= self;
  • collectionView.delegate?= self;
  • //將集合視圖添加到父視圖中
  • [self.view?addSubview:collectionView];
  • 步驟四:遵守委托協議,實現協議方法

    首先在viewDidLoad方法里面注冊集合視圖的單元格,本案例沒有使用自定義的cell,而是直接使用系統提供的UICollectionViewCell,所以使用方法registerClass:forCellWithReuseIdentifier:進行注冊,registerClass:參數傳遞的是UICollectionViewCell類,代碼如下所示:

    ?
  • //在viewDidLoad方法外面定義cell的注冊標識
  • static?NSString?*cellIdentifier?= @"MyCell";
  • //在viewDidLoad方法里面進行cell的注冊
  • [collectionView?registerClass:[UICollectionViewCell?class] forCellWithReuseIdentifier:cellIdentifier];
  • 然后TRCustomLayoutCollectionViewController遵守集合視圖協議,并且實現協議方法給集合視圖加載數據,代碼如下所示:

    ?
  • //遵守集合視圖的數據源協議和委托協議
  • @interface?TRCustomLayoutCollectionViewController?()?<UICollectionViewDataSource, UICollectionViewDelegate>
  • @end
  • -?(NSInteger)numberOfSectionsInCollectionView:(UICollectionView?*)collectionView
  • {
  • return?10;
  • }
  • -(NSInteger)collectionView:(UICollectionView?*)collectionView?
  • numberOfItemsInSection:(NSInteger)section
  • {
  • return?6;
  • }
  • -(UICollectionViewCell?*)collectionView:(UICollectionView?*)collectionView?
  • cellForItemAtIndexPath:(NSIndexPath?*)indexPath
  • {
  • UICollectionViewCell?*cell?=?[collectionView?dequeueReusableCellWithReuseIdentifier:cellIdentifier?forIndexPath:indexPath];
  • cell.backgroundColor?=?[UIColor?grayColor];
  • return cell;
  • }
  • 2.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  • {
  • self.window?=?[[UIWindow?alloc] initWithFrame:[[UIScreen?mainScreen] bounds]];
  • self.window.backgroundColor?=?[UIColor?whiteColor];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:vc];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRCustomLayoutCollectionViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRCustomLayoutCollectionViewController.h"
  • //遵守集合視圖的數據源協議和委托協議
  • @interface?TRCustomLayoutCollectionViewController?()?<UICollectionViewDataSource, UICollectionViewDelegate>
  • @end
  • @implementation TRCustomLayoutCollectionViewController
  • //在viewDidLoad方法外面定義cell的注冊標識
  • static?NSString?*cellIdentifier?= @"MyCell";
  • -?(void)viewDidLoad
  • {
  • [super viewDidLoad];
  • UICollectionViewFlowLayout?*layout?=?[[UICollectionViewFlowLayout?alloc]init];
  • //設置每個cell的大小
  • layout.itemSize?=?CGSizeMake(150,?150);
  • //設置每個cell之間的間距
  • layout.minimumInteritemSpacing?=?10;
  • //設置每個分局的邊距
  • layout.sectionInset?=?UIEdgeInsetsMake(150,?20,?150,?20);
  • //設置滾動方向為水平方向
  • layout.scrollDirection?= UICollectionViewScrollDirectionHorizontal;
  • //創建集合視圖對象
  • CGSize?screenSize?=?[[UIScreen?mainScreen] bounds].size;
  • UICollectionView?*collectionView?=?[[UICollectionView?alloc]initWithFrame:CGRectMake(0,?0, screenSize.width, screenSize.height) collectionViewLayout:layout];
  • //設置collectionView的委托對象
  • collectionView.dataSource?= self;
  • collectionView.delegate?= self;
  • //將集合視圖添加到父視圖中
  • [self.view?addSubview:collectionView];
  • //由于直接使用的系統的UICollectionViewCell,注冊cell使用registerClass:方法
  • [collectionView?registerClass:[UICollectionViewCell?class] forCellWithReuseIdentifier:cellIdentifier];
  • }
  • -?(NSInteger)numberOfSectionsInCollectionView:(UICollectionView?*)collectionView
  • {
  • return?10;
  • }
  • -(NSInteger)collectionView:(UICollectionView?*)collectionView?
  • numberOfItemsInSection:(NSInteger)section
  • {
  • return?6;
  • }
  • -(UICollectionViewCell?*)collectionView:(UICollectionView?*)collectionView?
  • cellForItemAtIndexPath:(NSIndexPath?*)indexPath
  • {
  • UICollectionViewCell?*cell?=?[collectionView?dequeueReusableCellWithReuseIdentifier:cellIdentifier?forIndexPath:indexPath];
  • cell.backgroundColor?=?[UIColor?grayColor];
  • return cell;
  • }
  • @end
  • 3 使用TabBar管理多個VC及Navi
  • 3.1 問題

    UITabbarController同導航控制器一樣是一個控制器的控制器,標簽欄位于屏幕下方,占有49個像素,本案例將學習如何使用標簽控制器來管理視圖控制器,如圖-8所示:

    圖-8

    3.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建三個帶有xib的視圖控制器類TRFirstViewController、TRSecondViewController,TRThirdViewController,作為標簽控制器所管理的子控制器。

    然后在TRAppDelegate的程序入口方法中分別創建三個帶有導航子視圖控制器對象,再創建一個UITabbarController對象tabbar,將三個視圖控制器對象設置為tabbar的子視圖控制器,屏幕下方的標簽欄就回有三個按鈕對應三個子視圖控制。

    通常為了點擊方便一般管理的子視圖控制器不超過五個,如果超過五個則最后一個標簽欄按鈕顯示為更多,點擊更多標簽按鈕會出現一個更多列表。

    最后將tabbar設置為根視圖控制器,分別在三個子視圖控制器類中設置title和tabBarItem的顯示內容。

    3.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRTableViewController視圖控制器

    首先在Xcode項中創建三個帶有xib的視圖控制器類TRFirstViewController、TRSecondViewController,TRThirdViewController,全都繼承至UIViewController,并在xib中給三個控制器的視圖設置不同的背景顏色。

    這三個視圖控制器將作為標簽控制器所管理的子控制器,如圖-9所示:

    圖-9

    步驟二:創建UITabbarController對象

    在TRAppDelegate的程序入口方法中分別創建三個帶有導航子視圖控制器對象,代碼如下所示:

    ?
  • TRFirstViewController?*firstVC?=?[[TRFirstViewController?alloc]initWithNibName:@"TRFirstViewController" bundle:nil];
  • UINavigationController?*navi1?=?[[UINavigationController?alloc]initWithRootViewController:firstVC];
  • TRSecondViewController?*secondVC?=?[[TRSecondViewController?alloc]initWithNibName:@"TRSecondViewController" bundle:nil];
  • UINavigationController?*navi2?=?[[UINavigationController?alloc]initWithRootViewController:secondVC];
  • TRThirdViewController?*thirdVC?=?[[TRThirdViewController?alloc]initWithNibName:@"TRThirdViewController" bundle:nil];
  • UINavigationController?*navi3?=?[[UINavigationController?alloc]initWithRootViewController:thirdVC];
  • 然后再創建一個UITabbarController對象tabbar,將三個視圖控制器對象設置為tabbar的子視圖控制器,屏幕下方的標簽欄就回有三個按鈕對應三個子視圖控制,代碼如下所示:

    ?
  • //創建UITabBarController對象
  • UITabBarController?*tabbar?=?[[UITabBarController?alloc]init];
  • //設置tabbar的子控制器
  • tabbar.viewControllers?= @[navi1, navi2, navi3];
  • 最后將tabbar設置為根視圖控制器,運行程序顯示的第一個界面為標簽控制器所管理的第一個子控制器的視圖,代碼如下所示:

    ?
  • self.window.rootViewController?= tabbar;
  • 步驟三:設置title和tabBarItem

    分別在三個子視圖控制器類中的initWithNibName:bundle:初始化方法中設置title和tabBarItem的顯示內容,代碼如下所示:

    ?
  • //TRFirstViewController類中
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"FirstVC";
  • self.tabBarItem.image?=?[UIImage?imageNamed:@"tabbar_item_selected.png"];
  • }
  • return self;
  • }
  • //TRSecondViewController類中
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"@"SecondVC"";
  • self.tabBarItem.image?=?[UIImage?imageNamed:@"tabbar_item_music.png"];
  • }
  • return self;
  • }
  • //TRThirdViewController類中
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"ThirdVC"";
  • self.tabBarItem.image = [UIImage imageNamed:@"tabbar_item_store.png"];
  • }
  • return self;
  • }
  • 運行程序可見標簽按鈕都添加了標題和圖片,如圖-10所示:

    圖-10

    3.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRFirstViewController.h"
  • #import?"TRSecondViewController.h"
  • #import?"TRThirdViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions
  • {
  • self.window?=?[[UIWindow?alloc] initWithFrame:[[UIScreen?mainScreen] bounds]];
  • self.window.backgroundColor?=?[UIColor?whiteColor];
  • //創建tabbar所管理的子控制器,每個子控制器都帶有一個導航
  • TRFirstViewController?*firstVC?=?[[TRFirstViewController?alloc]initWithNibName:@"TRFirstViewController" bundle:nil];
  • UINavigationController?*navi1?=?[[UINavigationController?alloc]initWithRootViewController:firstVC];
  • TRSecondViewController?*secondVC?=?[[TRSecondViewController?alloc]initWithNibName:@"TRSecondViewController" bundle:nil];
  • UINavigationController?*navi2?=?[[UINavigationController?alloc]initWithRootViewController:secondVC];
  • TRThirdViewController?*thirdVC?=?[[TRThirdViewController?alloc]initWithNibName:@"TRThirdViewController" bundle:nil];
  • UINavigationController?*navi3?=?[[UINavigationController?alloc]initWithRootViewController:thirdVC];
  • //創建UITabBarController對象
  • UITabBarController?*tabbar?=?[[UITabBarController?alloc]init];
  • //設置tabbar的子控制器
  • tabbar.viewControllers?= @[navi1, navi2, navi3];
  • //將標簽控制器設置為根視圖控制器,程序的第一個界面默認為標簽控制器所管理的第一個子控制器的視圖
  • self.window.rootViewController?= tabbar;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRFirstViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRFirstViewController.h"
  • @implementation TRFirstViewController
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"FirstVC";
  • self.tabBarItem.image?=?[UIImage?imageNamed:@"tabbar_item_selected.png"];
  • }
  • return self;
  • }
  • @end
  • ?

    本案例中,TRSecondViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRSecondViewController.h"
  • @implementation TRFirstViewController
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"SecondVC";
  • self.tabBarItem.image?=?[UIImage?imageNamed:@"tabbar_item_music.png"];
  • }
  • return self;
  • }
  • @end
  • 本案例中,TRThirdViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRFirstViewController.h"
  • @implementation TRFirstViewController
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"ThirdVC";
  • self.tabBarItem.image?=?[UIImage?imageNamed:@"tabbar_item_store.png"];
  • }
  • return self;
  • }
  • @end
  • 隱藏

    4 分段選擇展示

    4.1 問題

    IOS提供了分段選擇控件,分段控件由兩段或更多段構成,每一段都相當于一個獨立的按鈕。分段控件通常只能激活其中一個按鈕。本案例將學習如何使用分段選擇控件,根據不同的選擇改變label的顯示內容,如圖-11所示:

    圖-11

    4.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建一個帶有xib的視圖控制器類TRViewController,作為本案例的根視圖控制器。

    其次在xib文件中拖放一個SegmentedControl控件和一個標簽控件。

    然后在右邊欄的第四個檢查器中設置SegmentedControl控件的各屬性,包括樣式、每個分段按鈕的顯示標題、背景樣色以及渲染顏色。

    最后將xib中的label關聯成屬性,將SegmentedControl關聯成方法,在TRViewController.m文件中實現SegmentedControl的事件響應方法。

    4.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRViewController視圖控制器

    首先在Xcode項中創建一個帶有xib的視圖控制器類TRViewController,繼承至UIViewController,并在TRAppDelegate的程序入口方法中創建根視圖控制器對象,代碼如下所示:

  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中拖放控件

    在xib文件中拖放一個SegmentedControl控件和一個標簽控件,如圖-12所示:

    圖-12

    然后在右邊欄的第四個檢查器中設置日期檢查器的相關屬性,將分段數設置為3個,并以此設置每個分段的標題,如圖-13所示:

    圖-13

    步驟三:關聯代碼,實現方法

    首先將xib中的label關聯成私用屬性label,代碼如下所示:

  • @interface?TRDatePickerViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  • @end
  • 然后將SegmentedControl關聯成事件方法segmentedControlAction:,此時SegmentedControl的事件應選擇valueChanged,segmentedControlAction:方法的功能是根據不同的選擇修改label的顯示內容,代碼如下所示:

    ?
  • -(IBAction)segmentedControlAction:(UISegmentedControl?*)sender?{
  • NSInteger?*index?=?[sender?selectedSegmentIndex];
  • NSString?*title?=?[sender?titleForSegmentAtIndex:index];
  • self.label.text?=?[NSString?stringWithFormat:@"用戶選中%@",title];
  • }
  • 4.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[UIScreen?mainScreen].bounds];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRViewController.h"
  • @interface?TRViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  • @end
  • @implementation TRViewController
  • -?(IBAction)segmentedControlAction:(UISegmentedControl?*)sender?{
  • NSInteger?*index?=?[sender?selectedSegmentIndex];
  • NSString?*title?=?[sender?titleForSegmentAtIndex:index];
  • self.label.text?=?[NSString?stringWithFormat:@"用戶選中%@",title];
  • }
  • @end
  • 5 下載進度指示

    5.1 問題

    活動指示器UIActivityIndicatorView是UIKit框架提供的一個用于提示用戶等待的指示圖,是一個標準的旋轉進度輪。本案例使用活動指示器和進度條模擬實現下載進度指示,如圖-14所示:

    圖-14

    5.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建一個帶有xib的視圖控制器類TRViewController,作為本案例的根視圖控制器。

    其次在xib文件中拖放一個ActivityIndicatorView控件和一個ProgressView控件。

    然后在右邊欄的第四個檢查器中設置ActivityIndicatorView和ProgressView各屬性。

    最后將xib中的ActivityIndicatorView和ProgressView關聯成私用屬性,在viewDidLoad方法里面創建一個計時器,模擬下載進度。

    5.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRViewController視圖控制器

    首先在Xcode項中創建一個帶有xib的視圖控制器類TRViewController,繼承至UIViewController,并在TRAppDelegate的程序入口方法中創建根視圖控制器對象,代碼如下所示:

  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中拖放控件

    在xib文件中拖放一個ActivityIndicatorView控件和一個ProgressView控件,如圖-15所示:

    圖-15

    然后在右邊欄的第四個檢查器中設置ActivityIndicatorView控件的相關屬性,將Hides When Stopped選項勾上,表示當ActivityIndicatorView停止旋轉時隱藏,如圖-16所示:

    圖-16

    最后在右邊欄的第四個檢查器中設置ProgressView控件的相關屬性,將Progress的值設置為0,progress是UIProgressView的一個重要屬性,是float類型,默認的取值范圍為0~1,如圖-17所示:

    圖-17

    步驟三:關聯代碼,實現方法

    首先將xib中的ActivityIndicatorView和ProgressView關聯成私用屬性activityIndicatorView和progressView,代碼如下所示:

    ?
  • @interface?TRDatePickerViewController?()
  • @property?(weak, nonatomic)?IBOutletUIActivityIndicatorView?*activityIndicatorView;
  • @property?(weak, nonatomic)?IBOutlet?UIProgressView?*progressView;
  • @end
  • 然后在viewDidLoad方法里面創建一個NSTimer類型的計時器對象,計時器可以設定固定的時間間隔反復調用某個方法,本案例使用計時器模擬實現一個下載進度狀態,每隔一定的時間修改progressView的progress值,當progress的值為1時,activityIndicatorView停止旋轉并隱藏,代碼如下所示:

    ?
  • -?(void)viewDidLoad?{
  • [super viewDidLoad];
  • //timeInterval參數是時間間隔,以秒為單位,target:參數是目標,selector參數是調用的方法,repeats參數表示是否重復調用該方法
  • [NSTimer?scheduledTimerWithTimeInterval:1 target:self?selector:@selector(download:) userInfo:nil?repeats:YES];
  • }
  • 最后實現download:方法,該方法實現功能修改progressView的progress值,當progress的值為1時,activityIndicatorView停止旋轉并隱藏,該方法傳遞過來的參數就是計時器對象,代碼如下所示:

    ?
  • //download方法的參數就是計時器對象
  • -(void)download:(NSTimer*)timer?{
  • //活動指示器開始旋轉
  • [self.activityIndicatorView?startAnimating];
  • //每次調用進度條的progress都加0.1
  • self.progressView.progress+=0.1;
  • if?(self.progressView.progress?==1)?{
  • //當進度條的progress==1時,表示下載完成,活動指示器停止旋轉
  • [self.activityIndicatorView?stopAnimating];
  • //彈出提示對話框
  • UIAlertView?*av?=?[[UIAlertView?alloc]initWithTitle:@"提示" message:@"下載完成" delegate:nil?cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
  • [av?show];
  • //計時器停止
  • [timer?invalidate];
  • }
  • }
  • 5.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[UIScreen?mainScreen].bounds];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • 本案例中,TRViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRViewController.h"
  • @interface?TRViewController?()
  • @property?(weak, nonatomic) IBOutlet
  • UIActivityIndicatorView?*activityIndicatorView;
  • @property?(weak, nonatomic)?IBOutlet?UIProgressView?*progressView;
  • @end
  • @implementation TRViewController
  • -?(void)viewDidLoad?{
  • [super viewDidLoad];
  • [NSTimer?scheduledTimerWithTimeInterval:1 target:self?selector:@selector(download:) userInfo:nil?repeats:YES];
  • }
  • //download方法的參數就是計時器對象
  • -(void)download:(NSTimer*)timer?{
  • //活動指示器開始旋轉
  • [self.activityIndicatorView?startAnimating];
  • //每次調用進度條的progress都加0.1
  • self.progressView.progress+=0.1;
  • if?(self.progressView.progress?==1)?{
  • //當進度條的progress==1時,表示下載完成,活動指示器停止旋轉
  • [self.activityIndicatorView?stopAnimating];
  • //彈出提示對話框
  • UIAlertView?*av?=?[[UIAlertView?alloc]initWithTitle:@"提示" message:@"下載完成" delegate:nil?cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
  • [av?show];
  • //計時器停止
  • [timer?invalidate];
  • }
  • }
  • @end
  • 6 使用DatePicker控件選擇日期

    6.1 問題

    IOS提供了日期選擇器控件,可以提供對日期的選擇,本案例將學習如何使用日期選擇器來選擇時間,如圖-18所示:

    圖-18

    6.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建一個帶有xib的視圖控制器類TRDatePickerViewController,作為本案例的根視圖控制器。

    其次在xib文件中拖放一個DatePicker控件、一個標簽控件以及一個按鈕控件。日期選擇器提供四種模式:日期、日期和時間、時間以及倒計時,本案例使用日期和時間模式。

    然后在右邊欄的第四個檢查器中設置日期選擇器的各屬性,包括Mode模式、Local設定本地化、Interval設定時間間隔、Date開始時間、Constraints顯示的最大和最小日期。

    最后將xib中的日期選擇器和label關聯成屬性,將日期選擇器和按鈕關聯成方法,在TRDatePickerViewController.m文件中實現日期選擇器和按鈕的事件響應方法。

    6.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRDatePickerViewController視圖控制器

    首先在Xcode項中創建一個帶有xib的視圖控制器類TRDatePickerViewController,繼承至UIViewController,并在TRAppDelegate的程序入口方法中創建根視圖控制器對象,代碼如下所示:

    ?
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRDatePickerViewController?*dpVC?=?[[TRDatePickerViewController?alloc]initWithNibName:@"TRDatePickerViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:dpVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中拖放控件

    在xib文件中拖放一個DatePicker控件、一個標簽控件以及一個按鈕控件,如圖-19所示:

    圖-19

    然后在右邊欄的第四個檢查器中設置日期檢查器的相關屬性,將模式選擇為Date and Time,如圖-20所示:

    圖-20

    步驟三:關聯代碼,實現方法

    首先將xib中的日期選擇器和label關聯成私用屬性datePicker和dateLabel,代碼如下所示:

    ?
  • @interface?TRDatePickerViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UIDatePicker?*datePicker;
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*dateLabel;
  • @end
  • 然后將日期選擇器關聯成事件方法datePickerValueChanged:,此時日期選擇器的的事件應選擇valueChanged,datePickerValueChanged:方法的功能是將日期選擇器所表示的時間顯示到dateLabel上,代碼如下所示:

    ?
  • -?(IBAction)datePickerValueChanged:(UIDatePicker?*)sender
  • {
  • NSDateFormatter?*df?=?[[NSDateFormatter?alloc]init];
  • [df?setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
  • self.dateLabel.text?=?[df?stringFromDate:sender.date];
  • }
  • 最后將按鈕關聯成事件方法launch:,該方法的功能是讓日期選擇器獲取當前日期,代碼如下所示:

    ?
  • -?(IBAction)launch:(id)sender
  • {
  • NSDate?*date?= self.datePicker.date;
  • NSDateFormatter?*df?=?[[NSDateFormatter?alloc]init];
  • [df?setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
  • self.dateLabel.text?=?[df?stringFromDate:self.datePicker.date];
  • date?=?[NSDate?date];
  • [self.datePicker?setDate:date?animated:YES]?
  • }
  • 6.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRDatePickerViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRDatePickerViewController?*dpVC?=?[[TRDatePickerViewController?alloc]initWithNibName:@"TRDatePickerViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:dpVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRDatePickerViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRDatePickerViewController.h"
  • @interface?TRDatePickerViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UIDatePicker?*datePicker;
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*dateLabel;
  • @end
  • @implementation TRDatePickerViewController
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"Date";
  • }
  • return self;
  • }
  • -?(IBAction)launch:(id)sender
  • {
  • NSDate?*date?= self.datePicker.date;
  • NSDateFormatter?*df?=?[[NSDateFormatter?alloc]init];
  • [df?setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
  • self.dateLabel.text?=?[df?stringFromDate:self.datePicker.date];
  • date?=?[NSDate?date];
  • [self.datePicker?setDate:date?animated:YES];
  • }
  • -?(IBAction)datePickerValueChanged:(UIDatePicker?*)sender
  • {
  • NSDateFormatter?*df?=?[[NSDateFormatter?alloc]init];
  • [df?setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
  • self.dateLabel.text?=?[df?stringFromDate:sender.date];
  • }
  • @end
  • ?

    7 使用PickerView控件實現火車起始地點選擇

    7.1 問題

    有時候我們還需要選擇日期以外的內容,IOS提供了普通的視圖選擇器控件,可以滿足用戶的需要,本案例將學習如何使用PickerView控件實現火車起始地點選擇,如圖-21所示:

    圖-21

    7.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建一個帶有xib的視圖控制器類TRPickerViewViewController,作為本案例的根視圖控制器。

    其次在xib文件中拖放一個PickerView控件、一個標簽控件以及一個按鈕控件,并在右邊欄的第四個檢查器中設置各個控件的相關屬性。

    然后將xib中的PickerView控件和label關聯成屬性,將按鈕關聯成方法。并以拉線的形式設置PickerView的委托對象為TRPickerViewViewController,TRPickerViewViewController類需要遵守協議UIPickerViewDataSource和 UIPickerViewDelegate。

    最后在TRPickerViewViewController類中定義兩個NSArray的屬性formCity和toCity,用來存放PickerView顯示的數據。

    在TRPickerViewViewController類中實現按鈕的事件響應方法和PickerView的協議方法,完成數據加載。

    7.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRPickerViewViewController視圖控制器

    首先在Xcode項中創建一個帶有xib的視圖控制器類TRPickerViewViewController,繼承至UIViewController,并在TRAppDelegate的程序入口方法中創建根視圖控制器對象,代碼如下所示:

  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRPickerViewViewController?*pvVC?=?[[TRPickerViewViewController?alloc]initWithNibName:@"TRPickerViewViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:pvVC]; self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中拖放控件

    在xib文件中拖放一個PickerView控件、一個標簽控件以及一個按鈕控件,并在右邊欄的第四個檢查器中設置各個控件的相關屬性,如圖-22所示:

    圖-22

    然后將xib中的PickerView控件和label關聯成私有屬性pickerView和label,將按鈕關聯成方法luanch:,代碼如下所示:

  • @interface?TRPickerViewViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UIPickerView?*pickerView;
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  • @end
  • 最后以拉線的形式設置PickerView的dataSource和delegate兩個委托對象為File‘s Owner,即TRPickerViewViewController,如圖-23所示:

    圖-23

    步驟三:遵守協議,實現方法

    在TRPickerViewViewController類中定義兩個NSArray類型的公開屬性formCity和toCity,用來存放PickerView顯示的數據,并重寫setter方法初始化數據,代碼如下所示:

  • @interface?TRPickerViewViewController?: UIViewController
  • @property?(nonatomic, strong)NSArray?*fromCitys;
  • @property?(nonatomic, strong)NSArray?*toCitys;
  • @end
  • //重寫setter方法,初始化數據
  • -?(NSArray?*)fromCitys
  • {
  • if(!_fromCitys)_fromCitys?= @[@"北京",@"上海",@"廣州",@"深圳",@"成都"];
  • return _fromCitys;
  • }
  • -?(NSArray?*)toCitys
  • {
  • if(!_toCitys)_toCitys?= @[@"上海",@"廣州",@"深圳",@"成都", @"杭州"];
  • return _toCitys;
  • }
  • 然后TRPickerViewViewController類需要遵守協議UIPickerViewDataSource和 UIPickerViewDelegate,并且實現相關的協議方法,完成數據加載,代碼如下所示:

  • //遵守協議
  • @interface?TRPickerViewViewController?()?<UIPickerViewDataSource, UIPickerViewDelegate>
  • //告訴pickerView顯示多少組
  • -?(NSInteger)numberOfComponentsInPickerView:(UIPickerView?*)pickerView
  • {
  • return?2;
  • }
  • //告訴pickerView每組顯示多少行
  • -(NSInteger)pickerView:(UIPickerView?*)pickerView?
  • numberOfRowsInComponent:(NSInteger)component
  • {
  • if?(component==0)?{
  • return self.fromCitys.count;
  • }else?if(component==1){
  • return self.toCitys.count;
  • }
  • return?0;
  • }
  • //告訴pickerView每行顯示的標題
  • -(NSString?*)pickerView:(UIPickerView?*)pickerView?
  • titleForRow:(NSInteger)row?
  • forComponent:(NSInteger)component
  • {
  • if(component==0){
  • return self.fromCitys[row];
  • }else{
  • return self.toCitys[row];
  • }
  • }
  • 最后在TRPickerViewViewController類中實現按鈕的事件響應方法luanch:,當點擊按鈕時label上顯示用戶選擇的起始地點信息,代碼如下所示:

  • -?(IBAction)luanch:(id)sender
  • {
  • NSInteger?fromIndex?=?[self.pickerView?selectedRowInComponent:0];
  • NSInteger?toIndex?=?[self.pickerView?selectedRowInComponent:1];
  • self.label.text?=?[NSString?stringWithFormat:@"用戶想從%@到%@", self.fromCitys[fromIndex], self.toCitys[toIndex]];
  • }
  • 7.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRDatePickerViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRPickerViewViewController?*pvVC?=?[[TRPickerViewViewController?alloc]initWithNibName:@"TRPickerViewViewController" bundle:nil];
  • UINavigationController?*navi?=?[[UINavigationController?alloc]initWithRootViewController:pvVC];
  • self.window.rootViewController?= navi;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • 本案例中,TRPickerViewViewController.h文件中的完整代碼如下所示:

    ?
  • #import<UIKit/UIKit.h>
  • @interface?TRPickerViewViewController?: UIViewController
  • @property?(nonatomic, strong)NSArray?*fromCitys;
  • @property?(nonatomic, strong)NSArray?*toCitys;
  • @end
  • ?

    本案例中,TRPickerViewViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRPickerViewViewController.h"
  • @interface?TRPickerViewViewController?()?<UIPickerViewDataSource, UIPickerViewDelegate>
  • @property?(weak, nonatomic)?IBOutlet?UIPickerView?*pickerView;
  • @property?(weak, nonatomic)?IBOutlet?UILabel?*label;
  • @end
  • @implementation TRPickerViewViewController
  • -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil
  • {
  • self?=?[super initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];
  • if?(self)?{
  • self.title?= @"起始地點";
  • }
  • return self;
  • }
  • -?(NSArray?*)fromCitys
  • {
  • if(!_fromCitys)_fromCitys?= @[@"北京",@"上海",@"廣州",@"深圳",@"成都"];
  • return _fromCitys;
  • }
  • -?(NSArray?*)toCitys
  • {
  • if(!_toCitys)_toCitys?= @[@"上海",@"廣州",@"深圳",@"成都", @"杭州"];
  • return _toCitys;
  • }
  • //告訴pickerView顯示多少組
  • -?(NSInteger)numberOfComponentsInPickerView:(UIPickerView?*)pickerView
  • {
  • return?2;
  • }
  • //告訴pickerView每組顯示多少行
  • -?(NSInteger)pickerView:(UIPickerView?*)pickerView?numberOfRowsInComponent:(NSInteger)component
  • {
  • if?(component==0)?{
  • return self.fromCitys.count;
  • }else?if(component==1){
  • return self.toCitys.count;
  • }
  • return?0;
  • }
  • //告訴pickerView每行顯示的標題
  • -?(NSString?*)pickerView:(UIPickerView?*)pickerView?titleForRow:(NSInteger)row?forComponent:(NSInteger)component
  • {
  • if(component==0){
  • return self.fromCitys[row];
  • }else{
  • return self.toCitys[row];
  • }
  • }
  • -?(IBAction)luanch:(id)sender
  • {
  • NSInteger?fromIndex?=?[self.pickerView?selectedRowInComponent:0];
  • NSInteger?toIndex?=?[self.pickerView?selectedRowInComponent:1];
  • self.label.text?=?[NSString?stringWithFormat:@"用戶想從%@到%@", self.fromCitys[fromIndex], self.toCitys[toIndex]];
  • }
  • @end
  • ?

    8 網頁瀏覽

    8.1 問題

    網頁控件UIWebView是UIKit框架提供的用于訪問網頁的視圖控件,它有一個內置的瀏覽器。本案例將學習如何使用UIWebView控件實現一個簡易的瀏覽器,并且具有網頁的前進、后退和刷新功能,如圖-24所示:

    圖-24

    8.2 方案

    首先同樣創建一個SingleViewApplication項目,然后創建一個帶有xib的視圖控制器類TRViewController,作為本案例的根視圖控制器。

    其次在xib文件中拖放一個UIWebView控件用于加載網頁、一個ActivityIndicatorView控件用于加載等待、一個TextField控件用于用戶輸入網址以及三個Button控件用于控制前進、后退和刷新。

    然后在右邊欄的第四個檢查器中設置各控件的相關屬性。

    最后將xib中的UIWebView控件、ActivityIndicatorView控件和TextField關聯成私有屬性。

    再分別將三個Button控件和TextField控件關聯成方法,在TRViewController.m文件中實現TextField控件和按鈕事件的響應方法。

    8.3 步驟

    實現此案例需要按照如下步驟進行。

    步驟一:創建TRViewController視圖控制器

    首先在Xcode項中創建一個帶有xib的視圖控制器類TRViewController,繼承至UIViewController,并在TRAppDelegate的程序入口方法中創建根視圖控制器對象,代碼如下所示:

    ?
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • 步驟二:在xib文件中拖放控件

    在xib文件中拖放一個UIWebView控件、一個ActivityIndicatorView控件、一個TextField控件以及三個Button控件,如圖-25所示:

    圖-25

    然后在右邊欄的第四個檢查器中設置個控件的相關屬性,將WebView控件的Scales Page To Fit選項勾上,表示會根據WebView的大小顯示所訪問的網頁,如圖-26所示:

    圖-26

    步驟三:關聯代碼,實現方法

    首先將xib中UIWebView控件、ActivityIndicatorView控件和TextField關聯成私有屬性webView、tf和activityIndicatorView,代碼如下所示:

    ?
  • @interface?TRDatePickerViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UIWebView?*webView;
  • @property?(weak, nonatomic)?IBOutlet?UITextField?*tf;
  • @property?(weak, nonatomic)?IBOutlet?UIActivityIndicatorView?*activityIndicatorView;
  • @end
  • 其次將TextField控件的Did End On Exit事件關聯方法go:,當點擊鍵盤右下角的按鈕時就訪問所輸入的網址,代碼如下所示:

    ?
  • -?(IBAction)go:(UITextField?*)sender
  • {
  • //tf退出第一響應
  • [sender?resignFirstResponder];
  • //創建一個url請求
  • NSString?*urlString?=?[NSString?stringWithFormat:@"http://%@",sender.text];
  • sender.text?= urlString;
  • NSURL?*url?=?[NSURL?URLWithString:urlString];
  • NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
  • //webView發送請求
  • [self.webView?loadRequest:request];
  • }
  • 然后分別將三個按鈕關聯成事件方法goBack:、goForward以及reload:,三個方法分別實現網頁的后退、前進和刷新,代碼如下所示:

    ?
  • -?(IBAction)goBack:(UIButton?*)sender?{
  • [self.webView?goBack];
  • }
  • -?(IBAction)gouForward:(UIButton?*)sender?{
  • [self.webView?goForward];
  • }
  • -?(IBAction)reLoad:(UIButton?*)sender?{
  • [self.webView?reload];
  • }
  • 最后根據webView的屬性loading的值,控制activityIndicatorView的旋轉和顯示,代碼如下所示:

    ?
  • -(void)viewDidLoad?{
  • [super viewDidLoad];
  • [NSTimer?scheduledTimerWithTimeInterval:0.1 target:self?selector:@selector(isActivity) userInfo:nil?repeats:YES];
  • }
  • -(void)isActivity?{
  • if?(self.webView.isLoading==YES)?{
  • //當網頁正在加載時,活動指示器開始旋轉
  • [self.activityIndicatorView?startAnimating];
  • }else?{
  • //當網頁加載完成,活動指示器停止旋轉
  • [self.activityIndicatorView?stopAnimating];
  • }
  • }
  • 8.4 完整代碼

    本案例中,TRAppDelegate.m文件中的完整代碼如下所示:

    ?
  • #import?"TRAppDelegate.h"
  • #import?"TRViewController.h"
  • @implementation TRAppDelegate
  • -(BOOL)application:(UIApplication?*)application?
  • didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions?{
  • self.window?=?[[UIWindow?alloc]initWithFrame:[[UIScreen?mainScreen]bounds]];
  • TRViewController?*vc?=?[[TRViewController?alloc]initWithNibName:@"TRViewController" bundle:nil];
  • self.window.rootViewController?= vc;
  • [self.window?makeKeyAndVisible];
  • return YES;
  • }
  • @end
  • ?

    本案例中,TRViewController.m文件中的完整代碼如下所示:

    ?
  • #import?"TRViewController.h"
  • @interface?TRViewController?()
  • @property?(weak, nonatomic)?IBOutlet?UIWebView?*webView;
  • @property?(weak, nonatomic)?IBOutlet?UITextField?*tf;
  • @property?(weak, nonatomic)?IBOutlet?UIActivityIndicatorView?*activityIndicatorView;
  • @end
  • @implementation TRViewController
  • -(void)viewDidLoad?{
  • [super viewDidLoad];
  • [NSTimer?scheduledTimerWithTimeInterval:0.1 target:self?selector:@selector(isActivity) userInfo:nil?repeats:YES];
  • }
  • -(void)isActivity?{
  • if?(self.webView.isLoading==YES)?{
  • [self.activityIndicatorView?startAnimating];
  • }else?{
  • [self.activityIndicatorView?stopAnimating];
  • }
  • }
  • -?(IBAction)go:(UITextField?*)sender
  • {
  • [sender?resignFirstResponder];
  • NSString?*urlString?=?[NSString?stringWithFormat:@"http://%@",sender.text];
  • sender.text?= urlString;
  • NSURL?*url?=?[NSURL?URLWithString:urlString];
  • NSURLRequest?*request?=?[NSURLRequest?requestWithURL:url];
  • [self.webView?loadRequest:request];
  • }
  • -?(IBAction)goBack:(UIButton?*)sender?{
  • [self.webView?goBack];
  • }
  • -?(IBAction)gouForward:(UIButton?*)sender?{
  • [self.webView?goForward];
  • }
  • -?(IBAction)reLoad:(UIButton?*)sender?{
  • [self.webView?reload];
  • }
  • @end
  • 轉載于:https://www.cnblogs.com/hytx/p/5049504.html

    總結

    以上是生活随笔為你收集整理的集合视图控制器(CollectionViewController) 、 标签控制器(TabBarController) 、 高级控件介绍...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    久久免费视频1 | 人人看人人草 | 这里只有精彩视频 | 九九av | 欧美久久九九 | 亚洲国产欧美在线人成大黄瓜 | 亚洲天堂色婷婷 | 成在线播放 | 最新国产一区二区三区 | 国产一二三四在线视频 | 人操人| 欧美激情视频三区 | 美女久久网站 | 日韩精品免费在线视频 | 黄色亚洲 | 国产黄色理论片 | 亚洲久草网 | 欧美日韩精品国产 | 日韩一级电影在线 | 午夜色场 | 综合久久精品 | 在线观看成年人 | 久久99国产精品久久99 | 婷婷久久一区 | 狠狠色丁香婷综合久久 | 久草久| 一本一本久久a久久精品牛牛影视 | 黄色影院在线免费观看 | 丝袜+亚洲+另类+欧美+变态 | 日韩免费小视频 | 欧美做受高潮 | 国产91九色视频 | 久久99免费观看 | 狠狠狠操 | 久久精品国产v日韩v亚洲 | 国产r级在线观看 | 91在线免费看片 | 不卡的av电影在线观看 | 国内偷拍精品视频 | 亚洲精品久久久久久久蜜桃 | 99午夜| 久久亚洲欧美 | 久久99亚洲精品久久 | 国产又粗又猛又爽又黄的视频先 | 成人av在线直播 | 精品一区电影国产 | 国产美女精品久久久 | 日日夜夜免费精品 | 一级免费看视频 | 日韩高清成人 | 人人玩人人添人人 | 狠狠操夜夜 | 国产精品av免费在线观看 | 五月开心六月伊人色婷婷 | 国产精品原创av片国产免费 | 亚洲专区在线播放 | 黄色毛片大全 | 天天操综合网 | 天堂av在线网 | 亚洲砖区区免费 | 国产精品视频地址 | 日韩一三区 | 欧美日韩在线视频免费 | 久久精品网站视频 | 色99之美女主播在线视频 | 黄色片软件网站 | 天天爽综合网 | 国产91精品一区二区麻豆亚洲 | 亚洲国产精品va在线看黑人动漫 | 欧美亚洲一区二区在线 | 999免费视频 | 中文字幕在线字幕中文 | 不卡av电影在线观看 | av高清在线观看 | 中文字幕有码在线播放 | 国产色爽 | 亚洲午夜精| 69国产精品成人在线播放 | 欧美综合在线视频 | 日韩精品免费一区二区在线观看 | 99久久影院| 欧美一区二区三区免费看 | 国产精品黄色 | 午夜久久久久久久久久影院 | 在线播放日韩av | 91成版人在线观看入口 | 免费h漫在线观看 | 亚洲美女视频在线观看 | 免费精品人在线二线三线 | 夜夜骑天天操 | 9999在线观看| 97人人网| 亚洲欧洲xxxx | 久久香蕉电影网 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 91中文在线视频 | 国产在线观看地址 | 久久大片网站 | 色天堂在线视频 | 91视频 - 88av| 亚洲激情一区二区三区 | 最新日韩在线观看 | 久久久视频在线 | 奇米影视777影音先锋 | 在线观看国产福利片 | 91精品在线观看视频 | 久久情爱 | 少妇搡bbbb搡bbb搡aa | 免费下载高清毛片 | 国产精品一区二区白浆 | 江苏妇搡bbbb搡bbbb | 日本中文字幕网 | 国产精品成久久久久 | 国产精品久久久久一区二区国产 | 亚洲1级片 | 日本黄色大片儿 | 亚洲国产成人精品在线 | 91成版人在线观看入口 | 九九热视频在线免费观看 | 国产成人精品午夜在线播放 | 99自拍视频在线观看 | 日本婷婷色 | 探花视频免费在线观看 | 国产精品美女久久久久久久 | 日本巨乳在线 | 天天射天天做 | 在线视频国产区 | www激情久久 | 香蕉视频久久久 | 日韩高清在线不卡 | 久久精品视频在线播放 | 国产精品久久久久久久99 | 欧美一级网站 | 欧美日本在线视频 | 亚洲精品视频在线免费 | 91尤物国产尤物福利在线播放 | 美女精品久久久 | 国产剧情在线一区 | 久久久久99精品成人片三人毛片 | 亚洲精品午夜国产va久久成人 | 国精产品999国精产品岳 | 久久精品国产99国产 | 中文字幕一区二区三区在线观看 | 日韩毛片在线一区二区毛片 | 91在线视频精品 | 韩国av电影在线观看 | 日本h在线播放 | 亚洲尺码电影av久久 | 国产高清av免费在线观看 | 日韩欧美一区二区三区视频 | 国产老熟 | 97超碰在线久草超碰在线观看 | 在线播放日韩av | 毛片一区二区 | 91av手机在线观看 | 一区中文字幕在线观看 | 亚洲一级久久 | 久久久性 | 亚洲精品国产精品国自产观看 | 国产不卡在线观看 | 中文字幕在线观看不卡 | 婷婷干五月 | 五月婷婷久久综合 | 日韩激情在线视频 | 97综合视频| 久草在线播放视频 | 成年人黄色免费看 | 免费成人av网站 | 97超碰色| 亚洲色图 校园春色 | 99久久久国产精品免费99 | 国产在线999 | 国产精品免费久久久久久 | www日| 在线观看国产亚洲 | 天天爱天天操 | 深爱五月激情网 | 久久久99精品免费观看乱色 | 99精品视频在线免费观看 | 在线电影日韩 | www.婷婷色| 国产成人精品一区二区三区网站观看 | 丁香导航 | 伊人色综合久久天天网 | 国内精品毛片 | 国产欧美日韩精品一区二区免费 | 在线视频一区观看 | 美女视频久久黄 | 国产成人福利片 | 欧洲亚洲激情 | 欧美热久久 | 91cn国产在线| 亚洲日本va午夜在线电影 | 麻豆国产视频 | 天天色天天射综合网 | 天天曰夜夜爽 | 欧美成人h版 | 999久久久免费视频 午夜国产在线观看 | 国产高清亚洲 | 日日摸日日爽 | 欧美日韩另类在线 | а天堂中文最新一区二区三区 | 国产一区二区网址 | 久热电影 | 久久男人中文字幕资源站 | 久久a v电影 | 五月天亚洲激情 | 国产高清一级 | 成人全视频免费观看在线看 | 日韩高清www | 久久99国产精品久久99 | 激情视频二区 | 国产又粗又猛又爽 | 色吊丝在线永久观看最新版本 | zzijzzij亚洲日本少妇熟睡 | 97超级碰碰| 97av在线视频免费播放 | 天天爽天天射 | 中文字幕一区二区三区四区在线视频 | 在线视频日韩 | 精品国产99国产精品 | 99精品视频在线观看免费 | 韩国一区视频 | 婷婷色5月| 99久久久久成人国产免费 | 亚洲综合欧美日韩狠狠色 | 日韩欧美99 | 日韩天堂在线观看 | 99色婷婷 | 亚洲无线视频 | 中文字幕在线看视频国产中文版 | 日韩电影中文字幕在线观看 | 精品人妖videos欧美人妖 | 免费一级特黄毛大片 | www.狠狠操 | 日韩va欧美va亚洲va久久 | 中文字幕视频一区 | 天天操天天操天天爽 | 99精品久久久久久久久久综合 | 国产精品18久久久久白浆 | 成人毛片一区 | 亚洲成人精品国产 | 午夜美女福利直播 | 美女性爽视频国产免费app | 久久免费播放 | 最新国产视频 | 中文在线字幕免费观看 | 精品国产诱惑 | 日本久久久久久 | 五月婷婷网站 | 国产精品福利视频 | 插婷婷 | 亚洲国产精品一区二区久久hs | 久久人人爽人人片 | 久久香蕉影视 | 亚洲最新av在线网站 | 免费高清在线观看电视网站 | 91在线观看视频 | av免费成人 | 日韩中文字幕视频在线观看 | 91精品高清 | 久久九九视频 | www夜夜操 | 中文字幕国产一区二区 | 91丨九色丨蝌蚪丨老版 | 国产在线视频一区 | 亚洲精品小视频 | 国模一区二区三区四区 | 国产精品久久久久久久毛片 | 天堂在线视频中文网 | 韩国一区二区三区视频 | 狠狠躁18三区二区一区ai明星 | 国产一级黄色免费看 | 亚洲精品在线播放视频 | 成人免费观看大片 | 成人在线一区二区三区 | 日日操日日插 | 国产精品 美女 | 国产精品视频你懂的 | 久久综合婷婷 | 一本—道久久a久久精品蜜桃 | 狠狠天天 | 国产成人精品午夜在线播放 | 久久伦理电影网 | 69xxxx欧美 | 韩国精品视频在线观看 | 九精品| 精品在线看 | 亚洲综合最新在线 | 中文字幕视频 | 国产成人久久av977小说 | 国产亚洲成人精品 | 一级欧美一级日韩 | 久久免费在线观看 | 久久久精品欧美一区二区免费 | 99精品国产免费久久久久久下载 | 一区在线电影 | 婷婷午夜天 | 911av视频| 国产在线观看xxx | 精品av在线播放 | 欧美激情一区不卡 | 免费观看福利视频 | 成人片在线播放 | 日韩精品免费一区二区在线观看 | 欧美一级性视频 | 激情网色 | 国产这里只有精品 | 久保带人| 99综合影院在线 | 91精品啪啪 | 国产视频91在线 | 欧美成人性网 | 激情综合电影网 | 97精品超碰一区二区三区 | 在线观看亚洲国产精品 | 久久久久久久久艹 | 久久夜色电影 | 国产欧美中文字幕 | 国产亚洲欧美一区 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 欧美黑人猛交 | 黄色一级片视频 | 夜夜操网站| 九九热在线精品 | 亚洲精品在线国产 | 精品黄色在线观看 | 香蕉久久久久久久 | 日韩美视频 | 国产视频亚洲视频 | 亚洲精品中文字幕视频 | 国内精品久久影院 | 又黄又爽免费视频 | 黄色三级免费看 | 久久精品www人人爽人人 | 99色精品视频 | 久久久亚洲网站 | 亚洲欧美在线视频免费 | 91麻豆网 | 婷婷丁香狠狠爱 | 国产中文字幕亚洲 | 国产精品久久久久久久久久东京 | 婷婷色社区 | 欧美精品少妇xxxxx喷水 | 丝袜美腿亚洲 | 在线免费中文字幕 | 夜夜躁狠狠躁日日躁 | 日韩精品一区二区三区电影 | 一区二区三区电影在线播 | 国产精品久久久久久久久久白浆 | 97色在线观看免费视频 | 免费在线黄色av | 91精品免费在线观看 | 黄色av一区二区 | 日韩在线欧美在线 | 国产精品久久久久久五月尺 | 99re8这里有精品热视频免费 | 亚洲精品在线国产 | 97国产精品久久 | 综合色站 | 激情久久综合网 | 精品在线一区二区 | 国产精品二区在线观看 | 亚洲综合欧美精品电影 | a视频免费看| 在线视频1卡二卡三卡 | 国产剧情av在线播放 | 色综合久久久久综合体桃花网 | 又色又爽又激情的59视频 | 中文在线免费视频 | 97在线观看视频 | 日韩精品不卡在线 | 午夜久操| 天天色天天上天天操 | 国产精品国产亚洲精品看不卡15 | 国产又粗又猛又黄又爽视频 | 91免费观看视频网站 | 很污的网站 | 午夜视频亚洲 | 中文字幕一区二区三区在线播放 | 亚洲日本色 | 日韩精品亚洲专区在线观看 | 一区二区激情视频 | 国产天天综合 | www日韩精品 | 超碰97中文 | 日韩免费区 | 91视频免费看片 | 久久久久伊人 | 天天色综合三 | 五月婷婷视频在线 | 亚洲视频资源在线 | 久久久www免费电影网 | 欧美精品中文在线免费观看 | 91爱爱视频 | 日韩在线电影一区二区 | 午夜成人免费影院 | 永久免费在线 | 精品av网站 | 国产精品日韩欧美一区二区 | 免费视频 三区 | 免费在线观看av网站 | 亚欧日韩av | 国产视频 亚洲精品 | 69国产盗摄一区二区三区五区 | 久久精品一二三区 | 国产在线欧美 | 亚洲激情 欧美激情 | 91经典在线 | 四虎8848免费高清在线观看 | 色999精品| 国产精品扒开做爽爽的视频 | 超碰97免费观看 | a级片网站 | 国产一级黄色电影 | 欧美精品在线观看一区 | 在线中文字幕一区二区 | 国产精品在线看 | 国产精品一区二区中文字幕 | 99视频精品免费观看, | 99欧美 | 成人国产精品 | 久久久精品电影 | 美女黄频| 中文字幕视频免费观看 | 亚洲理论片在线观看 | 又黄又网站 | 91在线视频免费91 | 亚洲一级片免费观看 | 国产精品99精品久久免费 | 最近日本中文字幕 | 成人在线一区二区 | 中文字幕在线一区二区三区 | 亚洲专区 国产精品 | 天天操天天是 | 婷五月天激情 | 亚洲片在线观看 | 国产免费视频在线 | 国产黄免费在线观看 | 欧美性免费 | 男女拍拍免费视频 | 欧美日韩国产一区 | 色婷婷综合五月 | 91久久精 | 久久久久久久99精品免费观看 | 国产精品12345 | 91福利视频在线 | 夜夜操天天 | 国产精品成人av电影 | 五月天婷亚洲天综合网精品偷 | 中文资源在线播放 | 色综合国产 | 玖玖视频免费在线 | 狠狠干成人综合网 | 久久国产精品久久精品 | 九九热只有这里有精品 | 女人18片毛片90分钟 | 国产区在线视频 | 色婷婷激婷婷情综天天 | 国产中文字幕一区 | 91精品国产91久久久久福利 | 免费高清在线视频一区· | 91中文字幕在线播放 | 久久天天躁狠狠躁亚洲综合公司 | 欧美美女视频在线观看 | 超碰在线日韩 | 日本精品视频免费观看 | 欧美成人91| 在线免费视频a | 91视频在线国产 | 少妇bbbb揉bbbb日本 | 九九免费在线观看视频 | 97在线观看视频 | 欧美另类巨大 | 五月天视频网站 | 91大神在线观看视频 | 四虎在线免费观看视频 | 精品毛片久久久久久 | 日韩黄色在线观看 | 99久久婷婷国产综合精品 | 国产又粗又猛又黄 | 欧美一二三视频 | 在线观看日韩中文字幕 | 欧美日韩不卡一区 | 黄色毛片网站在线观看 | 国产精品久久久久久久久蜜臀 | 正在播放五月婷婷狠狠干 | 三级黄色网址 | 99精品视频免费 | 日韩美一区二区三区 | 91在线最新 | 日韩欧美不卡 | 韩国精品一区二区三区六区色诱 | 亚洲色图27p | 69国产盗摄一区二区三区五区 | 超级碰碰免费视频 | 色婷婷免费 | 久久久国产精品久久久 | 99久久综合精品五月天 | 国产亚洲精品久久19p | 狠狠插天天干 | 久草精品国产 | 欧美精品一区二区在线观看 | 黄色一级大片在线观看 | 成人国产精品入口 | 少妇bbw揉bbb欧美 | 国产日韩精品一区二区三区 | 色婷婷狠狠操 | 在线a人v观看视频 | 欧美一级看片 | 成人毛片一区 | 91久久黄色 | 天天爽夜夜爽人人爽曰av | 欧美亚洲国产日韩 | 午夜私人影院 | 天堂网av 在线 | av在线免费观看不卡 | 丁香综合五月 | 久久在线视频在线 | 成人在线观看免费 | 亚洲精品www| 激情深爱| 久草免费手机视频 | 国产自在线 | 欧美做受高潮 | 国产录像在线观看 | 免费污片 | 日韩视频三区 | 欧美一级乱黄 | 日韩精品中文字幕在线 | 久久99久久99精品免观看软件 | 国内精品久久久久久久久久清纯 | 国产麻豆果冻传媒在线观看 | 亚洲国产精品久久 | 成人av在线一区二区 | 在线91观看| 国产亚洲精品久久久久5区 成人h电影在线观看 | 天天色天天射天天干 | 999久久久久久久久久久 | 日韩欧美电影在线观看 | 久久成人黄色 | 草莓视频在线观看免费观看 | 免费观看国产成人 | 丝袜美腿av| 亚洲精选视频在线 | 操久久免费视频 | 久久免费观看少妇a级毛片 久久久久成人免费 | 在线视频91| 久草香蕉在线 | 五月激情片 | 99c视频在线 | 久久亚洲精品电影 | 国产精品欧美 | 亚洲视频,欧洲视频 | 日韩欧美视频在线播放 | 国产成人一区二区三区影院在线 | 丁香婷婷深情五月亚洲 | 日日干视频 | 国产一区福利在线 | 福利视频网站 | 日韩丝袜| 色综合久久综合网 | 欧美极品在线播放 | 日本99干网 | 久久伦理网| 99精品在线播放 | 精品在线免费视频 | 国产精品久久久99 | 伊人狠狠色 | 日韩羞羞 | 日产乱码一二三区别在线 | 免费成人黄色av | 久久久久久久久久免费 | 国产黄免费 | 激情文学综合丁香 | 国产在线观看 | www.色午夜.com | 丝袜网站在线观看 | 欧美贵妇性狂欢 | 中文字幕av在线 | 国产在线精品一区 | 国产精品自产拍在线观看中文 | 国产免费久久精品 | 久久大片网站 | 二区三区中文字幕 | 亚洲视频在线播放 | 天天爱综合 | 久久久久国产成人免费精品免费 | 99视频导航| 久久人人爽人人爽人人片 | 国产精品一区二区三区在线 | 中文字幕在线看视频国产 | 免费精品视频在线 | 深夜视频久久 | 欧美激情片在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | av日韩不卡 | 国产精品观看 | 成人av午夜| 欧美精品久久久久性色 | 国产黄色片在线免费观看 | 日韩在线观看网址 | 片黄色毛片黄色毛片 | 黄色在线视频网址 | 久久视频中文字幕 | 久久99精品久久只有精品 | 中文字幕丰满人伦在线 | 久久免费精品一区二区三区 | 国产97在线观看 | 国产精品免费一区二区三区在线观看 | 天天曰天天干 | 久久99国产一区二区三区 | 国产香蕉97碰碰碰视频在线观看 | 日本中文字幕在线视频 | 天堂av在线中文在线 | 国产精品欧美激情在线观看 | 99999精品 | 午夜精品久久久久99热app | 国产精品久久久精品 | 99色在线播放 | 精品一区二区久久久久久久网站 | 中文字幕电影在线 | 亚洲区另类春色综合小说校园片 | 亚洲视频456| 91久久在线观看 | 欧美综合国产 | 久久国产精品99久久久久久进口 | 91精品一区二区三区蜜臀 | 精品一区二区日韩 | 亚洲狠狠操 | 欧美日韩国产免费视频 | 激情丁香婷婷 | 毛片网站免费在线观看 | 91丨九色丨首页 | 在线免费色 | 在线免费av电影 | 亚洲天堂精品视频 | 人成免费网站 | 亚洲一级特黄 | 天天舔夜夜操 | 99热最新| 国产免费叼嘿网站免费 | 高清av在线免费观看 | 日韩欧美视频在线观看免费 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 在线免费观看羞羞视频 | 亚洲精品乱码久久久久久按摩 | 激情动态 | 激情综合婷婷 | 五月婷婷操 | 99久久久国产免费 | 欧美激情xxxx| 在线免费观看视频 | 五月亚洲| 国产剧情在线一区 | 国产精品一区二区久久精品爱涩 | 久久免费福利视频 | 97**国产露脸精品国产 | 久久精品国产免费看久久精品 | 日韩欧美在线视频一区二区三区 | 日韩精品 在线视频 | 91精品999 | 久久无码av一区二区三区电影网 | 国内精品久久久久久久影视麻豆 | 日韩视频一二三区 | 国产亚洲一区二区在线观看 | 在线观看自拍 | 91精品一区二区三区蜜桃 | 国产一级二级在线播放 | 在线观看 国产 | 96久久欧美麻豆网站 | 2020天天干夜夜爽 | 精品亚洲视频在线 | 国产精品99精品 | 日韩电影一区二区三区 | 欧美伦理一区二区三区 | 二区三区精品 | 好看的国产精品视频 | 久久社区视频 | 久久人人97超碰com | 国产裸体视频网站 | 国产精品网红福利 | 91传媒免费观看 | 欧美永久视频 | 久久成人欧美 | 黄色av播放 | 国产精品国产亚洲精品看不卡15 | 深夜国产在线 | 亚洲欧洲一区二区在线观看 | 日韩精品视 | 五月激情视频 | 欧美在线视频一区二区三区 | 久久资源在线 | 色.com| 亚洲国产精品999 | 精品久久久免费视频 | 在线免费观看一区二区三区 | 激情网五月婷婷 | 国产涩涩在线观看 | 色a网| 欧美日韩亚洲在线 | 国产精品一区二区久久久久 | 在线免费观看涩涩 | 久久久高清视频 | 久久久久久久久久久福利 | 粉嫩av一区二区三区免费 | 久久精品99国产精品酒店日本 | 2018好看的中文在线观看 | 国产精品第一页在线 | 激情视频二区 | 天天色天天射天天操 | 波多野结衣一区二区三区中文字幕 | 精品久久一 | 日韩视频中文字幕 | 一级免费看视频 | 狠狠操影视 | 精品国产一区二 | 国产直播av| 西西444www大胆高清视频 | 久久久久久久久久久久久9999 | av电影 一区二区 | 久久伊人精品一区二区三区 | 色在线国产 | 麻豆影视在线播放 | 国产一区二区视频在线 | 中文字幕色在线视频 | 永久免费的啪啪网站免费观看浪潮 | 天天射天天| 久久久久久久久久久久av | 亚洲成人午夜av | 在线免费观看黄色小说 | 久久久在线视频 | 亚洲国产成人精品在线 | 国产精品国产亚洲精品看不卡 | 亚洲成av人片在线观看香蕉 | 日日日操操 | 国色天香在线观看 | 久久久久久久久久久久久久免费看 | 国产1区2| 国产剧情在线一区 | 狠狠操操 | 成人av在线一区二区 | 中文字幕一区二区三区久久蜜桃 | 午夜精品久久久久久 | 激情五月亚洲 | 国产亚洲精品女人久久久久久 | 99精品久久只有精品 | 中文字幕丰满人伦在线 | 国产精品尤物视频 | 日日干日日操 | 亚洲涩涩色 | 成人一区二区三区在线 | 热99在线视频 | 超碰电影在线观看 | 日本动漫做毛片一区二区 | 精品视频一区在线观看 | 国产一区欧美日韩 | 精品久久久成人 | 国产精品欧美激情在线观看 | www.午夜 | 亚洲精品国产第一综合99久久 | 免费精品视频在线 | 久久a国产 | 亚洲国产精品资源 | 久久久伊人网 | 激情六月婷婷久久 | 成人免费视频网站在线观看 | 在线中文字幕电影 | 99在线精品视频在线观看 | 久久综合五月婷婷 | 狠狠色丁香婷婷综合久小说久 | 久久99在线视频 | 免费毛片aaaaaa | 天天操综 | 精品一二三四五区 | 日本视频不卡 | 午夜av免费 | 日本精品一区二区三区在线观看 | 青青草国产在线 | 日韩精品一二三 | 久9在线 | 精品一区二区av | 黄色www在线观看 | 久久久久99精品成人片三人毛片 | 狠狠狠色丁香婷婷综合激情 | 欧美极品一区二区三区 | 精品在线视频播放 | 国产精品国内免费一区二区三区 | 亚洲三级毛片 | 成人免费亚洲 | 狠狠插天天干 | 婷婷在线五月 | 日本久久91| 日韩伦理片hd | 五月婷婷,六月丁香 | 黄色影院在线免费观看 | 日日摸日日添日日躁av | 美女福利视频网 | 欧美巨大 | 超碰免费97 | 日本资源中文字幕在线 | 超碰人人舔 | 亚洲国产中文字幕在线 | 500部大龄熟乱视频 欧美日本三级 | 国产午夜麻豆影院在线观看 | 国际精品久久久久 | 激情网五月婷婷 | 国内精品久久久久久中文字幕 | 久久久久高清毛片一级 | 国产精品一区二区久久国产 | 91夫妻自拍 | 91精品久久久久久综合乱菊 | 人人讲| 6080yy午夜一二三区久久 | 亚洲一区二区观看 | 久久福利| 中文字幕第 | 久久久亚洲网站 | 亚洲成av人影院 | 色偷偷88888欧美精品久久 | 91成人免费看片 | 日韩av福利在线 | 在线观看黄网 | 国产不卡视频在线 | 国产精品久久久久久久久费观看 | 欧美久久久久久久久久久久久 | 久久九九精品久久 | 欧美另类亚洲 | 国产精品视频不卡 | 99久久久国产精品 | 成人性生交大片免费观看网站 | 日本在线精品视频 | 五月综合激情 | 国产999精品 | 国产精品99久久久久久人免费 | 国产一区精品在线 | 最近免费中文字幕 | 亚洲草视频 | av网站免费在线 | 日韩免费久久 | 欧美精品黑人性xxxx | 免费日韩在线 | 欧美精品乱码久久久久 | 亚洲精品视频www | 在线视频 亚洲 | 人人插人人看 | 中文字幕av电影下载 | 99免费精品 | 蜜臀aⅴ国产精品久久久国产 | 久久欧美视频 | 日韩免费中文字幕 | 亚洲欧洲xxxx | 51久久成人国产精品麻豆 | 99久久精品久久久久久动态片 | 狠狠狠色丁香婷婷综合久久五月 | 99国产一区二区三精品乱码 | 久久综合久久伊人 | 婷婷丁香在线视频 | 99草视频 | 欧美国产日韩一区 | 国产免码va在线观看免费 | 高清av中文字幕 | 免费黄a| 日韩a在线看 | 欧美性生活免费看 | 成人国产精品免费观看 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 日狠狠| 91精品啪啪 | 91精品在线观看入口 | 欧美一二在线 | 中文字幕视频观看 | 久久久精品视频成人 | 欧美一区在线观看视频 | 精品1区二区| 亚洲一区二区麻豆 | 99国产在线观看 | 国产精品精品国产色婷婷 | 久久99精品久久久久蜜臀 | 中日韩三级视频 | 在线视频国产区 | 最近在线中文字幕 | 在线免费成人 | 亚洲黄色免费观看 | 亚洲国产手机在线 | 亚洲高清久久久 | 日韩高清在线一区二区三区 | 国产精品18久久久久久vr | 天天操天天操天天操天天操天天操 | 视频一区亚洲 | 中文字幕频道 | 国产成人99av超碰超爽 | 五月天综合色 | 91香蕉视频在线下载 | 91激情视频在线 | 国产伦精品一区二区三区免费 | 在线亚洲午夜片av大片 | 色综合久久精品 | 国产精品久久99综合免费观看尤物 | 国产在线精品二区 | 超碰在线亚洲 | 久久久免费国产 | 亚洲一区日韩精品 | 超碰人人做 | 在线观看麻豆av | 日韩欧美视频免费看 | 亚洲精品在线视频 | 涩五月婷婷 | 91视频com| 天堂黄色片 | 国产精品自产拍 | 天天做天天爱天天综合网 | 亚洲精品国产精品国 | 国产无遮挡猛进猛出免费软件 | 91中文字幕网 | 日韩av不卡播放 | 色综合久久久久久中文网 | 日韩精品高清视频 | 亚洲综合国产精品 | 狠狠做深爱婷婷综合一区 | 日韩在线免费视频观看 | 国产在线精品播放 | 在线免费观看视频a | 久久99在线视频 | 色综合久久久久综合99 | 日本黄色一级电影 | 丁香视频免费观看 | 国产成人精品亚洲 | 91福利影院在线观看 | 久久久观看 | 日韩精品观看 | 亚洲麻豆精品 | 久久国产精品一区二区 | 亚洲人成在线观看 | 成人免费观看av | 青青河边草免费观看完整版高清 | 色99之美女主播在线视频 | 久久国产精品系列 | 亚洲蜜桃av | 中文字幕字幕中文 | 国产手机在线观看视频 | 精品女同一区二区三区在线观看 | 国内综合精品午夜久久资源 | 视频国产区 | 国产精品一区二区久久国产 | 亚洲另类视频在线 | 日韩动漫免费观看高清完整版在线观看 | 91高清在线 | 日韩一区二区三区高清在线观看 | 日韩av综合网站 | 欧洲视频一区 | 丁香花在线视频观看免费 | 在线观看亚洲电影 | 亚洲精品中文在线 | 综合色站 | 天天操天天摸天天射 | 99久久这里有精品 | 亚洲禁18久人片 | 色一级片 | 日韩欧美中文 | 色婷婷97| 久久精品人 | 国产最新在线视频 | 日韩av在线不卡 | 色播99| 久久国产精品免费 | 日韩在线观看你懂的 | 久久麻豆视频 | 日韩av福利在线 | 在线只有精品 | 黄p在线播放 | 国产专区视频在线观看 | 久久久久久久久久久精 | 国外av在线| 国产精品九色 | 天天操天天干天天爱 | 人人玩人人添人人澡超碰 | 超碰国产在线 | 天天天天天操 | 97在线观看免费高清完整版在线观看 | 欧美性生爱| 精品在线一区二区三区 | 在线观看一区二区精品 | 奇米网8888 | 欧美一级艳片视频免费观看 | 国产老太婆免费交性大片 | 成年人视频在线免费播放 | 国产精品激情在线观看 | 国产精品一区二区果冻传媒 | 国产视频精品免费播放 | 亚洲精品美女在线观看播放 | 91黄色影视| 91麻豆看国产在线紧急地址 | 国产在线不卡一区 | 少妇高潮流白浆在线观看 | 精品国产一区二区三区久久久蜜月 | 狠狠干成人综合网 | 欧美日韩亚洲一 |