模态视图(转)
轉載請注明出處,原文網址:http://blog.csdn.net/m_changgong/article/details/8127894?作者:張燕廣
模態視圖不是專門的某個類,而是通過視圖控制器的presentViewController方法彈出的視圖,我們稱為模態視圖。
- 模態視圖出現的場景一般是臨時彈出的窗口,譬如:登錄窗口;
- 模態視圖彈出時通過對視圖對象的modalTransitionStyle來設置動畫效果;
- 在彈出的視圖中使用dismissViewControllerAnimated方法關閉窗口。
實現的功能:1)通過彈出一個ModalView(模態視圖),實現多視圖;2)主界面上點擊按鈕彈出Info界面,在該界面上點擊返回,返回到主界面。
關鍵詞:多視圖 MultiView模態視圖?ModalView
1、創建一個Empty Application工程,命名為:MultiView-ModalView,如下圖
2、選中工程中的Group MultiView-ModalView,然后按住CMD(Windows鍵)+N,新建視圖控制器MainViewController,如下圖
3、依照上步操作,新建視圖控制器InfoViewController。
4、編輯MainViewController.xib,添加一個Label和Button,如下圖
5、編輯InfoViewController.xib,添加一個Label和Button,如下圖
6、修改MainViewController.h,如下
[cpp]?view plaincopy- <span?style="font-family:Microsoft?YaHei;font-size:18px;">//??
- //??MainViewController.h??
- //??MultiView-ModalView??
- //??
- //??Created?by?Zhang?Yanguang?on?12-10-26.??
- //??Copyright?(c)?2012年?MyCompanyName.?All?rights?reserved.??
- //??
- ??
- #import?<UIKit/UIKit.h>??
- #import?"InfoViewController.h"??
- @interface?MainViewController?:?UIViewController??
- @property(nonatomic,retain)InfoViewController?*infoViewController;??
- ??
- -(IBAction)showInfoView:(id)sender;??
- @end</span>??
將操作showInfoView與MainViewController.xib中的button的Touch Up Inisde進行關聯。
7、修改MainViewController.m,主要是實現showInfoView方法,如下
?
[cpp]?view plaincopy- <span?style="font-family:Microsoft?YaHei;font-size:18px;">//??
- //??MainViewController.m??
- //??MultiView-ModalView??
- //??
- //??Created?by?Zhang?Yanguang?on?12-10-26.??
- //??Copyright?(c)?2012年?MyCompanyName.?All?rights?reserved.??
- //??
- ??
- #import?"MainViewController.h"??
- ??
- @interface?MainViewController?()??
- ??
- @end??
- ??
- @implementation?MainViewController??
- @synthesize?infoViewController;??
- ??
- -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil??
- {??
- ????self?=?[super?initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];??
- ????if?(self)?{??
- ????????//?Custom?initialization??
- ????}??
- ????return?self;??
- }??
- ??
- -?(void)viewDidLoad??
- {??
- ????[super?viewDidLoad];??
- ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
- ????//設置背景顏色??
- ????self.view.backgroundColor?=?[UIColor?grayColor];??
- }??
- ??
- -(void)dealloc{??
- ????[infoViewController?release];??
- }??
- ??
- -(IBAction)showInfoView:(id)sender{??
- ????if(infoViewController?==?nil){??
- ????????infoViewController?=?[[InfoViewController?alloc]initWithNibName:@"InfoViewController"?bundle:nil];??
- ????????//NSLog(@"infoViewController?is?nil");??
- ????}else{??
- ????????//NSLog(@"infoViewController?is?not?nil");??
- ????}??
- ????infoViewController.modalTransitionStyle?=?UIModalTransitionStyleCoverVertical;??
- ??????
- ????//[self?presentModalViewController:infoViewController?animated:YES];//備注1??
- ????[self?presentViewController:infoViewController?animated:YES?completion:^{//備注2??
- ????????NSLog(@"show?InfoView!");??
- ????}];??
- ??????
- ????//presentedViewController??
- ????NSLog(@"self.presentedViewController=%@",self.presentedViewController);//備注3??
- }??
- ??
- -?(void)viewDidUnload??
- {??
- ????[super?viewDidUnload];??
- ????//?Release?any?retained?subviews?of?the?main?view.??
- ????//?e.g.?self.myOutlet?=?nil;??
- ????infoViewController?=?nil;??
- }??
- ??
- -?(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation??
- {??
- ????return?(interfaceOrientation?==?UIInterfaceOrientationPortrait);??
- }??
- ??
- @end</span>??
?
?
備注1、備注2:備注中的方法已經廢棄,被備注2中的presentViewController代替;參數completion實現一個回調,當MainViewController的viewDidDisappear調用之后,該回調會被調用。
備注3:在MainViewController中調用self.presentedViewController,返回的是由MainViewController?present出的視圖控制器,在這里即是:infoViewController。
8、修改InfoViewController.h,如下
- <span?style="font-family:Microsoft?YaHei;font-size:18px;">//??
- //??InfoViewController.h??
- //??MultiView-ModalView??
- //??
- //??Created?by?Zhang?Yanguang?on?12-10-26.??
- //??Copyright?(c)?2012年?MyCompanyName.?All?rights?reserved.??
- //??
- ??
- #import?<UIKit/UIKit.h>??
- ??
- @interface?InfoViewController?:?UIViewController??
- ??
- -(IBAction)backMainView:(id)sender;??
- @end??
- </span>??
將操作backMainView與InfoViewController.xib中的button的Touch Up Inisde進行關聯。
9、修改InfoViewController.m,主要是實現方法backMainView,如下
[cpp]?view plaincopy- <span?style="font-family:Microsoft?YaHei;font-size:18px;">//??
- //??InfoViewController.m??
- //??MultiView-ModalView??
- //??
- //??Created?by?Zhang?Yanguang?on?12-10-26.??
- //??Copyright?(c)?2012年?MyCompanyName.?All?rights?reserved.??
- //??
- ??
- #import?"InfoViewController.h"??
- ??
- @interface?InfoViewController?()??
- ??
- @end??
- ??
- @implementation?InfoViewController??
- ??
- -?(id)initWithNibName:(NSString?*)nibNameOrNil?bundle:(NSBundle?*)nibBundleOrNil??
- {??
- ????self?=?[super?initWithNibName:nibNameOrNil?bundle:nibBundleOrNil];??
- ????if?(self)?{??
- ????????//?Custom?initialization??
- ????}??
- ????return?self;??
- }??
- ??
- -?(void)viewDidLoad??
- {??
- ????[super?viewDidLoad];??
- ????//?Do?any?additional?setup?after?loading?the?view?from?its?nib.??
- ????//設置背景顏色??
- ????self.view.backgroundColor?=?[UIColor?greenColor];??
- }??
- ??
- -?(void)viewDidUnload??
- {??
- ????[super?viewDidUnload];??
- ????//?Release?any?retained?subviews?of?the?main?view.??
- ????//?e.g.?self.myOutlet?=?nil;??
- }??
- ??
- -(IBAction)backMainView:(id)sender{???
- ????NSLog(@"self.parentViewController=%@",self.parentViewController);??
- ????//[self.parentViewController?dismissViewControllerAnimated:YES?completion:nil];//備注4??
- ??????
- ????/*?
- ?????If?this?view?controller?is?a?child?of?a?containing?view?controller?(e.g.?a?navigation?controller?or?tab?bar?
- ?????controller,)?this?is?the?containing?view?controller.??Note?that?as?of?5.0?this?no?longer?will?return?the?
- ?????presenting?view?controller.?
- ?????*/??
- ????NSLog(@"self.presentedViewController=%@",self.presentedViewController);??
- ????//[self.presentedViewController?dismissViewControllerAnimated:YES?completion:nil];?//備注5??
- ??????
- ????NSLog(@"self.presentingViewController=%@",self.presentingViewController);??
- ????//[self.presentingViewController?dismissViewControllerAnimated:YES?completion:nil];//備注6??
- ??????
- ????//?Dismiss?the?current?modal?child.?Uses?a?vertical?sheet?transition?if?animated.?This?method?has?been?replaced?by?dismissViewControllerAnimated:completion:??
- ????//?It?will?be?DEPRECATED,?plan?accordingly.??
- ????//[self?dismissModalViewControllerAnimated:YES];//備注7??
- ????[self?dismissViewControllerAnimated:YES?completion:nil];//備注8??
- }??
- ??
- -?(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation??
- {??
- ????return?(interfaceOrientation?==?UIInterfaceOrientationPortrait);??
- }??
- ??
- @end</span>??
備注4:不能正常工作,該代碼不能實現返回到MainViewController的功能,因為MainViewController并不是InfoViewController的父視圖控制器(父子試圖控制器以后會講到),該方法的注釋如下:
/*
? If this view controller is a child of a containing view controller (e.g. a navigation controller or tab bar
? controller,) this is the containing view controller.? Note that as of 5.0 this no longer will return the
? presenting view controller.
*/
備注5:不能正常工作,該代碼也不能實現返回到MainViewController的功能,備注3中已解釋過self.presentedViewController,在此處一定返回空。
備注6:可以正常工作,改代碼可以實現返回到MainViewController的功能, self.presentingViewController返回的視圖控制器是指present出當前視圖控制器(即:infoViewController)的視圖控制器,當然是MainViewController。
備注7、8:可以正常工作,改代碼可以實現返回到MainViewController的功能,備注7中的方法已經廢棄,已被備注8中的方法代替;現在要考慮的問題是:為什么[self dismissViewControllerAnimated:YES completion:nil]與[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]實現了同樣的功能?
類UIViewController的dismissViewControllerAnimated方法有一段注釋如下:
The presenting view controller is responsible for dismissing the view controller it presented. If you call this method on the presented view controller itself, it automatically forwards the message to the presenting view controller.
什么意思呢?MainViewController把InforViewController 展示出來了,同樣也要負責把InforViewController退出,如果直接在InforViewController中發出(調用)dismissViewControllerAnimated消息,這個消息會自動轉給MainViewController,所以,在InforViewController中執行[self dismissViewControllerAnimated:YES completion:nil]與[self.presentingViewController dismissViewControllerAnimated:YES completion:nil]兩種調用,效果是一樣的,調用前者就等同于調用后者。建議用后者,更容易理解。
10、編譯、運行,效果如下
轉載于:https://www.cnblogs.com/hereiam/p/3813555.html
總結
- 上一篇: 封银沙为啥被嫌弃
- 下一篇: 东方显圣在佛教里是哪位