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

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

淺談UIAlertView與UIAlertController

2019-11-09 18:50:17
字體:
來源:轉載
供稿:網友

蘋果在iOS8.0后推出了UIAlertController以代替UIAlertView,導致的后果就是UIAlertView在iOS9.0之后被dePRecated了,也就是iOS8.0之后只能用UIAlertController,iOS8.0之前只能用UIAlertView。所以如果想同時兼容iOS7和iOS8,就判斷一下系統的版本,demo代碼如下:

 

?
123456789101112131415161718192021222324if([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {        // for iOS8        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"是否結束行程?"message:nil preferredStyle:UIAlertControllerStyleAlert];                 UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消"style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {            [self.navigationController dismissViewControllerAnimated:alertController completion:nil];        }];        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定"style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {            [self upload];        }];                 [alertController addAction:cancelAction];        [alertController addAction:okAction];        [self.navigationController presentViewController:alertController animated:YES completion:nil];    }else{        // for iOS7        self.uploadAlertView = [[UIAlertView alloc]                               initWithTitle:@"是否結束行程?"                               message:nil                               delegate:self                               cancelButtonTitle:@"取消"                               otherButtonTitles:@"確定", nil];        [self.uploadAlertView show];    }
當然蘋果其實沒有真正的把UIAlertView給deprecate掉,UIAlertView 在iOS8以后 可能會發生異常Bug而已。而且你也不知道它哪天真的就會把它給禁用了。所以最好還是做一下兼容判斷處理。

 

iOS 8的新特性之一就是讓接口更有適應性、更靈活,因此許多視圖控制器的實現方式發生了巨大的變化。全新的UipresentationController在實現視圖控制器間的過渡動畫效果和自適應設備尺寸變化效果(比如說旋轉)中發揮了重要的作用,它有效地節省了程序員們的工作量(天地良心?。_€有,某些舊的UIKit控件也同樣發生了許多變化,比如說Alert Views、Action Sheets、Popovers以及Search Bar Controllers。本文將會對Alert Views和Action Sheets發生的改變進行一個大致的介紹,我們會采用Objective-C和swift兩種語言同時進行代碼說明。

UIAlertView

隨著蘋果上次iOS 5的發布,對話框視圖樣式出現在了我們面前,直到現在它都沒有發生過很大的變化。下面的代碼片段展示了如何初始化和顯示一個帶有“取消”和“好的”按鈕的對話框視圖。

Objective-C版本:

?
12UIAlertView*alertview=[[UIAlertViewalloc]initWithTitle:@"標題"message:@"這個是UIAlertView的默認樣式"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"好的",nil];[alertviewshow];

加載中...

UIAlertView的默認樣式

swift版本和Objective-C版本不同,在swift中,alertView的初始化只允許創建擁有一個取消按鈕的對話框視圖?;蛟S您可以看到帶有otherButtonTitles的init方法,但是很遺憾,這個方法是沒有辦法通過編譯的。

?
12varalertView=UIAlertView(title:"標題",message:"這個是UIAlertView的默認樣式",delegate:self,cancelButtonTitle:"取消")alertView.show()

02.png

swift版本的UIAlertView

要能夠創建和上面Objective-C版本相同的對話框視圖,我們可以采取曲線救國的方法,雖然麻煩了些,但是我們為了目的可以不擇手段的,是吧?

?
1234567varalertView=UIAlertView()alertView.delegate=selfalertView.title="標題"alertView.message="這個是UIAlertView的默認樣式"alertView.addButtonWithTitle("取消")alertView.addButtonWithTitle("好的")alertView.show()

您也可以通過更改UIAlertView的alertViewStyle屬性來實現輸入文字、密碼甚至登錄框的效果。

03.png

UIAlertView文本對話框

04.png

UIAlertView密碼對話框

05.png

UIAlertView登錄對話框

UIAlertViewDelegate協議擁有響應對話框視圖的按鈕動作的回調方法。還有當文本框內容改變時,調用alertViewShouldEnableOtherButton:方法可以讓按鈕動態地可用或者不可用。

要說明一點,蘋果官方現在并不提倡在iOS 8中使用UIAlertView,取而代之的是UIAlertController。下面我們就來介紹UIAlertController的使用方法。

UIAlertController

在iOS 8中,UIAlertController在功能上是和UIAlertView以及UIActionSheet相同的,UIAlertController以一種模塊化替換的方式來代替這兩貨的功能和作用。是使用對話框(alert)還是使用上拉菜單(action sheet),就取決于在創建控制器時,您是如何設置首選樣式的。

一個簡單的對話框例子

您可以比較一下兩種不同的創建對話框的代碼,創建基礎UIAlertController的代碼和創建UIAlertView的代碼非常相似:

Objective-C版本:

?
1UIAlertController*alertController=[UIAlertControlleralertControllerWithTitle:@"標題"message:@"這個是UIAlertController的默認樣式"preferredStyle:UIAlertControllerStyleAlert];

swift版本:

?
1varalertController=UIAlertController(title:"標題",message:"這個是UIAlertController的默認樣式",preferredStyle:UIAlertControllerStyle.Alert)

同創建UIAlertView相比,我們無需指定代理,也無需在初始化過程中指定按鈕。不過要特別注意第三個參數,要確定您選擇的是對話框樣式還是上拉菜單樣式。

通過創建UIAlertAction的實例,您可以將動作按鈕添加到控制器上。UIAlertAction由標題字符串、樣式以及當用戶選中該動作時運行的代碼塊組成。通過UIAlertActionStyle,您可以選擇如下三種動作樣式:常規(default)、取消(cancel)以及警示(destruective)。為了實現原來我們在創建UIAlertView時創建的按鈕效果,我們只需創建這兩個動作按鈕并將它們添加到控制器上即可。

Objective-C版本:

?
1234UIAlertAction*cancelAction=[UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:nil];UIAlertAction*okAction=[UIAlertActionactionWithTitle:@"好的"style:UIAlertActionStyleDefaulthandler:nil];[alertControlleraddAction:cancelAction];[alertControlleraddAction:okAction];

swift版本:

?
1234varcancelAction=UIAlertAction(title:"取消",style:UIAlertActionStyle.Cancel,handler:nil)varokAction=UIAlertAction(title:"好的",style:UIAlertActionStyle.Default,handler:nil)alertController.addAction(cancelAction)alertController.addAction(okAction)

最后,我們只需顯示這個對話框視圖控制器即可:

Objective-C版本:

?
1[selfpresentViewController:alertControlleranimated:YEScompletion:nil];

swift版本:

?
1self.presentViewController(alertController,animated:true,completion:nil)

06.png

UIAlertController默認樣式

按鈕顯示的次序取決于它們添加到對話框控制器上的次序。一般來說,根據蘋果官方制定的《iOS 用戶界面指南》,在擁有兩個按鈕的對話框中,您應當將取消按鈕放在左邊。要注意,取消按鈕是唯一的,如果您添加了第二個取消按鈕,那么你就會得到如下的一個運行時異常:

* Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘UIAlertController can only have one action with a style of UIAlertActionStyleCancel’

異常信息簡潔明了,我們在此就不贅述了。

“警示”樣式

什么是“警示”樣式呢?我們先不著急回答這個問題,先來看一下下面關于“警示”樣式的簡單示例。在這個示例中,我們將前面的示例中的“好的”按鈕替換為了“重置”按鈕。

Objective-C版本:

?
12UIAlertAction*resetAction=[UIAlertActionactionWithTitle:@"重置"style:UIAlertActionStyleDestructivehandler:nil];[alertControlleraddAction:resetAction];

swift版本:

?
12varresetAction=UIAlertAction(title:"重置",style:UIAlertActionStyle.Destructive,handler:nil)alertController.addAction(resetAction)

07.png

“警示”樣式

可以看出,我們新增的那個“重置”按鈕變成了紅色。根據蘋果官方的定義,“警示”樣式的按鈕是用在可能會改變或刪除數據的操作上。因此用了紅色的醒目標識來警示用戶。

文本對話框

UIAlertController極大的靈活性意味著您不必拘泥于內置樣式。以前我們只能在默認視圖、文本框視圖、密碼框視圖、登錄和密碼輸入框視圖中選擇,現在我們可以向對話框中添加任意數目的UITextField對象,并且可以使用所有的UITextField特性。當您向對話框控制器中添加文本框時,您需要指定一個用來配置文本框的代碼塊。

舉個栗子吧,要重新建立原來的登錄和密碼樣式對話框,我們可以向其中添加兩個文本框,然后用合適的占位符來配置它們,最后將密碼輸入框設置使用安全文本輸入。

Objective-C版本:

?
12345678UIAlertController*alertController=[UIAlertControlleralertControllerWithTitle:@"文本對話框"message:@"登錄和密碼對話框示例"preferredStyle:UIAlertControllerStyleAlert];[alertControlleraddTextFieldWithConfigurationHandler:^(UITextField*textField){textField.placeholder=@"登錄";}];[alertControlleraddTextFieldWithConfigurationHandler:^(UITextField*textField){textField.placeholder=@"密碼";textField.secureTextEntry=YES;}];

swift版本:

?
123456789alertController.addTextFieldWithConfigurationHandler{(textField:UITextField!)->VoidintextField.placeholder="登錄"}alertController.addTextFieldWithConfigurationHandler{(textField:UITextField!)->VoidintextField.placeholder="密碼"textField.secureTextEntry=true}

在“好的”按鈕按下時,我們讓程序讀取文本框中的值。

Objective-C版本:

?
12345UIAlertAction*okAction=[UIAlertActionactionWithTitle:@"好的"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction*action){UITextField*login=alertController.textFields.firstObject;UITextField*passWord=alertController.textFields.lastObject;...}];

swift版本:

?
12345varokAction=UIAlertAction(title:"好的",style:UIAlertActionStyle.Default){(action:UIAlertAction!)->Voidinvarlogin=alertController.textFields?.firstasUITextFieldvarpassword=alertController.textFields?.lastasUITextField}

如果我們想要實現UIAlertView中的委托方法alertViewShouldEnableOtherButton:方法的話可能會有一些復雜。假定我們要讓“登錄”文本框中至少有3個字符才能激活“好的”按鈕。很遺憾的是,在UIAlertController中并沒有相應的委托方法,因此我們需要向“登錄”文本框中添加一個Observer。Observer模式定義對象間的一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴于它的對象都得到通知并被自動更新。我們可以在構造代碼塊中添加如下的代碼片段來實現。

Objective-C版本:

?
1234[alertControlleraddTextFieldWithConfigurationHandler:^(UITextField*textField){...[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(alertTextFieldDidChange:)name:UITextFieldTextDidChangeNotificationobject:textField];}];

swift版本:

?
12345alertController.addTextFieldWithConfigurationHandler{(textField:UITextField!)->Voidin...NSNotificationCenter.defaultCenter().addObserver(self,selector:Selector("alertTextFieldDidChange:"),name:UITextFieldTextDidChangeNotification,object:textField)}

當視圖控制器釋放的時候我們需要移除這個Observer,我們通過在每個按鈕動作的handler代碼塊(還有其他任何可能釋放視圖控制器的地方)中添加合適的代碼來實現它。比如說在okAction這個按鈕動作中:

Objective-C版本:

?
1234UIAlertAction*okAction=[UIAlertActionactionWithTitle:@"好的"style:UIAlertActionStyleDefaulthandler:^(UIAlertAction*action){...[[NSNotificationCenterdefaultCenter]removeObserver:selfname:UITextFieldTextDidChangeNotificationobject:nil];}];

swift版本:

?
12345varokAction=UIAlertAction(title:"好的",style:UIAlertActionStyle.Default){(action:UIAlertAction!)->Voidin...NSNotificationCenter.defaultCenter().removeObserver(self,name:UITextFieldTextDidChangeNotification,object:nil)}

在顯示對話框之前,我們要凍結“好的”按鈕

Objective-C版本:

?
1okAction.enabled=NO;

swift版本:

?
1okAction.enabled=false

接下來,在通知觀察者(notification observer)中,我們需要在激活按鈕狀態前檢查“登錄”文本框的內容。

Objective-C版本:

?
12345678-(void)alertTextFieldDidChange:(NSNotification*)notification{UIAlertController*alertController=(UIAlertController*)self.presentedViewController;if(alertController){UITextField*login=alertController.textFields.firstObject;UIAlertAction*okAction=alertController.actions.lastObject;okAction.enabled=login.text.length>2;}}

swift版本:

?
12345678funcalertTextFieldDidChange(notification:NSNotification){varalertController=self.presentedViewControllerasUIAlertController?if(alertController!=nil){varlogin=alertController!.textFields?.firstasUITextFieldvarokAction=alertController!.actions.lastasUIAlertActionokAction.enabled=countElements(login.text)>2}}

08.png

UIAlertController的登錄和密碼對話框示例

好了,現在對話框的“好的”按鈕被凍結了,除非在“登錄”文本框中輸入3個以上的字符:

上拉菜單

當需要給用戶展示一系列選擇的時候(選擇恐懼癥患者殺手),上拉菜單就能夠派上大用場了。和對話框不同,上拉菜單的展示形式和設備大小有關。在iPhone上(緊縮寬度),上拉菜單從屏幕底部升起。在iPad上(常規寬度),上拉菜單以彈出框的形式展現。

創建上拉菜單的方式和創建對話框的方式非常類似,唯一的區別是它們的形式。

Objective-C版本:

?
1UIAlertController*alertController=[UIAlertControlleralertControllerWithTitle:@"保存或刪除數據"message:@"刪除數據將不可恢復"preferredStyle:UIAlertControllerStyleActionSheet];

swift版本:

?
1varalertController=UIAlertController(title:"保存或刪除數據",message:"刪除數據將不可恢復",preferredStyle:UIAlertControllerStyle.ActionSheet)

添加按鈕動作的方式和對話框相同。

Objective-C版本:

?
123456UIAlertAction*cancelAction=[UIAlertActionactionWithTitle:@"取消"style:UIAlertActionStyleCancelhandler:nil];UIAlertAction*deleteAction=[UIAlertActionactionWithTitle:@"刪除"style:UIAlertActionStyleDestructivehandler:nil];UIAlertAction*archiveAction=[UIAlertActionactionWithTitle:@"保存"style:UIAlertActionStyleDefaulthandler:nil];[alertControlleraddAction:cancelAction];[alertControlleraddAction:deleteAction];[alertControlleraddAction:archiveAction];

swift版本:

?
123456varcancelAction=UIAlertAction(title:"取消",style:UIAlertActionStyle.Cancel,handler:nil)vardeleteAction=UIAlertAction(title:"刪除",style:UIAlertActionStyle.Destructive,handler:nil)vararchiveAction=UIAlertAction(title:"保存",style:UIAlertActionStyle.Default,handler:nil)alertController.addAction(cancelAction)alertController.addAction(deleteAction)alertController.addAction(archiveAction)

您不能在上拉菜單中添加文本框,如果您強行作死添加了文本框,那么就會榮幸地得到一個運行時異常:

* Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Text fields can only be added to an alert controller of style UIAlertControllerStyleAlert’

同樣,簡單的異常說明,我們也不多說了。

接下來我們就可以在iPhone或者其他緊縮寬度的設備上展示了,不出我們所料,運行得很成功。

Objective-C版本:

?
1[selfpresentViewController:alertControlleranimated:YEScompletion:nil];

swift版本:

?
1self.presentViewController(alertController,animated:true,completion:nil)

09.png

iPhone上的上拉菜單效果

如果上拉菜單中有“取消”按鈕的話,那么它永遠都會出現在菜單的底部,不管添加的次序是如何(就是這么任性)。其他的按鈕將會按照添加的次序從上往下依次顯示?!秈OS 用戶界面指南》要求所有的“毀壞”樣式按鈕都必須排名第一(紅榜嘛,很好理解的,對不對?)。

別激動得太早,我們現在還有一個很嚴重的問題,這個問題隱藏得比較深。當我們使用iPad或其他常規寬度的設備時,就會得到一個運行時異常:

Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘UIPopoverPresentationController (<_uialertcontrolleractionsheetregularpresentationcontroller: 0x7fc619588110="">) should have a non-nil sourceView or barButtonItem set before the presentation occurs.’

就如我們之前所說,在常規寬度的設備上,上拉菜單是以彈出框的形式展現。彈出框必須要有一個能夠作為源視圖或者欄按鈕項目的描點(anchor point)。由于在本例中我們是使用了常規的UIButton來觸發上拉菜單的,因此我們就將其作為描點。

在iOS 8中我們不再需要小心翼翼地計算出彈出框的大小,UIAlertController將會根據設備大小自適應彈出框的大小。并且在iPhone或者緊縮寬度的設備中它將會返回nil值。配置該彈出框的代碼如下:

Objective-C版本:

?
123456UIPopoverPresentationController*popover=alertController.popoverPresentationController;if(popover){popover.sourceView=sender;popover.sourceRect=sender.bounds;popover.permittedArrowDirections=UIPopoverArrowDirectionAny;}

swift版本:

?
123456varpopover=alertController.popoverPresentationControllerif(popover!=nil){popover?.sourceView=senderpopover?.sourceRect=sender.boundspopover?.permittedArrowDirections=UIPopoverArrowDirection.Any}

10.png

iPad上的上拉菜單效果

UIPopoverPresentationController類同樣也是在iOS 8中新出現的類,用來替換UIPopoverController的。這個時候上拉菜單是以一個固定在源按鈕上的彈出框的形式顯示的。

要注意UIAlertController在使用彈出框的時候自動移除了取消按鈕。用戶通過點擊彈出框的外圍部分來實現取消操作,因此取消按鈕便不再必需。

釋放對話框控制器

通常情況下,當用戶選中一個動作后對話框控制器將會自行釋放。不過您仍然可以在需要的時候以編程方式釋放它,就像釋放其他視圖控制器一樣。您應當在應用程序轉至后臺運行時移除對話框或者上拉菜單。假定我們正在監聽UIapplicationDidEnterBackgroundNotification通知消息,我們可以在observer中釋放任何顯示出來的視圖控制器。(參考在viewDidLoad方法中設立observer的示例代碼)。

Objective-C版本:

?
12345-(void)didEnterBackground:(NSNotification*)notification{[[NSNotificationCenterdefaultCenter]removeObserver:selfname:UITextFieldTextDidChangeNotificationobject:nil];[self.presentedViewControllerdismissViewControllerAnimated:NOcompletion:nil];}

swift版本:

?
1234funcdidEnterackground(notification:NSNotification){NSNotificationCenter.defaultCenter().removeObserver(self,name:UITextFieldTextDidChangeNotification,object:nil)self.presentedViewController?.dismissViewControllerAnimated(false,completion:nil)}

注意,要保證運行安全我們同樣要確保移除所有的文本框observer。

我們來總結一下

這篇文章比較長,但是希望能夠對您有所幫助。原先的UIAlertView和UIActionSheet類仍然可以在iOS 8中工作得很好,所以沒有必要急于更換代碼(要知道本文用到的許多函數盡在iOS 8中支持)。本文的代碼可以在我的Github主頁上找到,包括了AlertController - ObjC以及AlertController - swift。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国外视频精品毛片| 国产欧洲精品视频| 亚洲精品wwww| 亚洲国产天堂久久综合| 国产主播精品在线| 91啪国产在线| 国产综合在线看| 日韩av黄色在线观看| 久久精彩免费视频| 91免费在线视频网站| 国产日产欧美a一级在线| 狠狠色狠狠色综合日日五| 毛片精品免费在线观看| 日韩在线欧美在线国产在线| 欧美日产国产成人免费图片| 亚洲毛片在线看| 欧美日韩激情视频8区| 国产精品激情av在线播放| 国产精品永久免费| 久久av红桃一区二区小说| 国产不卡av在线免费观看| 欧美性极品xxxx娇小| 91禁国产网站| 亚洲a中文字幕| 亚洲黄一区二区| 中文字幕日韩av电影| 成人激情视频在线播放| 国产mv免费观看入口亚洲| 富二代精品短视频| 福利视频一区二区| 国产999在线观看| 麻豆精品精华液| 日韩福利视频在线观看| 91美女高潮出水| 欧美成人合集magnet| 亚洲一级片在线看| 亚洲国产精品人人爽夜夜爽| 欧美精品做受xxx性少妇| 中文国产亚洲喷潮| 欧美成人午夜免费视在线看片| 精品激情国产视频| 91成人在线视频| 国产在线一区二区三区| 国产精品久久9| 中文字幕亚洲无线码a| 91精品成人久久| 国产精品高清在线观看| 欧美精品videos另类日本| 欧美丰满少妇xxxxx| 国产精品美女视频网站| 91老司机精品视频| 日韩av影片在线观看| 国产成+人+综合+亚洲欧洲| 欧美日韩亚洲激情| 国模极品一区二区三区| 欧美成人激情视频| 免费av一区二区| 亚洲精品福利在线观看| 国产亚洲欧洲高清| 中文字幕欧美精品在线| 欧美日韩国产成人高清视频| 欧美午夜www高清视频| 成人精品一区二区三区电影免费| 亚洲欧美日本精品| 国产剧情日韩欧美| 奇米4444一区二区三区| 成人h视频在线| 福利二区91精品bt7086| 亚洲午夜激情免费视频| 亚洲成人在线视频播放| 91精品国产成人| 国产成人jvid在线播放| 欧美视频在线观看 亚洲欧| 久久中文字幕视频| 成人444kkkk在线观看| 久久精品国产亚洲7777| 国产自产女人91一区在线观看| 久久久人成影片一区二区三区观看| 欧美日韩亚洲天堂| 欧美猛交免费看| 亚洲成人av片在线观看| 久久久久成人精品| 精品国产网站地址| 中文字幕国产精品久久| 亚洲人成网站在线播| 色yeye香蕉凹凸一区二区av| 欧美电影免费观看| 久久影院模特热| 精品国产91久久久久久| 久久天天躁夜夜躁狠狠躁2022| 精品中文字幕在线2019| 影音先锋欧美在线资源| 亚洲系列中文字幕| 欧美最猛性xxxxx亚洲精品| 亚洲福利视频免费观看| 亚洲国产日韩欧美在线99| 欧美视频中文在线看| 91免费精品视频| 26uuu日韩精品一区二区| 亚洲bt天天射| 久久亚洲国产成人| 欧美做爰性生交视频| 欧美日韩成人精品| 国产在线播放不卡| 97免费在线视频| 精品久久久久久久久国产字幕| 91po在线观看91精品国产性色| 久久精品国产久精国产思思| 色综合天天狠天天透天天伊人| 美女性感视频久久久| 国产精品高潮呻吟久久av无限| 国外日韩电影在线观看| 亚洲第一中文字幕在线观看| 在线观看欧美www| 国自产精品手机在线观看视频| 68精品国产免费久久久久久婷婷| 成人久久久久爱| 日韩成人在线视频观看| 在线电影中文日韩| 97国产精品视频人人做人人爱| 91免费国产视频| 亚洲视频在线观看| 国产成人av在线播放| 国产欧美精品xxxx另类| 国产一区二区三区视频免费| 久久青草精品视频免费观看| 尤物九九久久国产精品的分类| 日韩av中文字幕在线播放| 欧美孕妇性xx| 亚洲免费av网址| 亚洲欧美激情一区| 亚洲国产精品成人一区二区| 欧美中文在线免费| 亚洲bt欧美bt日本bt| 亚洲日韩中文字幕| 国产精品第三页| 国产精品www网站| 国产成人+综合亚洲+天堂| 欧美老女人bb| 欧美日韩美女在线观看| 91国偷自产一区二区三区的观看方式| 亚洲二区在线播放视频| 91精品视频免费| 亚洲综合最新在线| 欧美福利小视频| 欧美最猛性xxxxx(亚洲精品)| 国产精品香蕉国产| 亚洲欧美日韩久久久久久| 久久久久国产精品www| 亚洲欧美国产视频| 国产大片精品免费永久看nba| 欧美日韩视频免费播放| 欧美一区二三区| 国产精品jizz在线观看麻豆| 国产精品丝袜白浆摸在线| 欧美精品在线免费| 国产亚洲精品综合一区91| 欧美在线一区二区视频| 91在线视频导航| 欧美激情在线有限公司| 亚洲国产精品久久久久| 日韩在线视频一区| 中文字幕精品一区二区精品| 久久频这里精品99香蕉|