模態視圖實現html
對於UIViewController跳到另外一個視圖的時候,有push和present兩種方式。可是須要注意的是,pushViewController這個方法,是UINavigationController和其子類纔有的方法,普通的控制器是沒有的。 因此用得時候通常是某個NavigationController pushViewcontroller或者self.navigationController pushViewController。接下來只看模態視圖。api
效果是present到另外一個界面的時候,輸入帳號和密碼,點擊OK以後返回(dismissViewControllerAnimated),紀錄present次數。效果圖以下ide
代碼以下:使用Main.storyboard動畫
新建一個NewViewController.h/.m文件。atom
1 @property(nonatomic,strong)UITextField *MyTextField;//帳號輸入spa
2 @property(nonatomic,strong)UITextField *MyTextField2;//密碼輸入 code
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 4 [self createNewController]; 5 [self createTextField]; 6 } 7 8 //建立createNewController 9 - (void)createNewController{ 10 self.view.backgroundColor = [UIColor orangeColor]; 11 UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 12 backButton.frame = CGRectMake(100, 200, 40, 40); 13 14 [backButton setTitle:@"OK" forState:UIControlStateNormal]; 15 [backButton setTitleColor:[UIColor greenColor] forState:UIControlStateHighlighted]; 16 17 //添加button事件 18 [backButton addTarget:self action: 19 @selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; 20 [self.view addSubview:backButton]; 21 } 22 23 - (void)buttonAction:(UIButton *)button{ 24 //關閉模態視圖 25 [self dismissViewControllerAnimated:YES completion:^{ 26 NSLog(@"back over"); 27 28 29 }]; 30 } 31 //建立new中的textField 32 - (void)createTextField{ 33 //--MyTextField 34 _MyTextField = [[UITextField alloc] init]; 35 _MyTextField.frame = CGRectMake(100, 100, 100, 30); 36 _MyTextField.backgroundColor = [UIColor whiteColor]; 37 //首字母不大寫 38 _MyTextField.autocapitalizationType = NO; 39 _MyTextField.borderStyle = UITextBorderStyleRoundedRect; 40 _MyTextField.placeholder = @"請輸入帳號"; 41 _MyTextField.clearButtonMode = UITextFieldViewModeAlways; 42 [self.view addSubview:_MyTextField]; 43 44 //---label1 45 UILabel* label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 40, 30)]; 46 label1.text = @"帳號"; 47 [self.view addSubview:label1]; 48 49 //--MyTextField 50 _MyTextField2 = [[UITextField alloc] init]; 51 _MyTextField2.frame = CGRectMake(100, 140, 100, 30); 52 _MyTextField2.backgroundColor = [UIColor whiteColor]; 53 _MyTextField2.autocapitalizationType = NO; 54 //設置樣式 55 _MyTextField2.borderStyle = UITextBorderStyleRoundedRect; 56 _MyTextField2.placeholder = @"請輸入密碼"; 57 //清除方式 58 _MyTextField2.clearButtonMode = UITextFieldViewModeAlways; 59 //隱藏密碼 60 _MyTextField2.secureTextEntry = YES; 61 [self.view addSubview:_MyTextField2]; 62 63 //---label1 64 UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(20, 140, 40, 30)]; 65 label2.text = @"密碼"; 66 [self.view addSubview:label2]; 67 }
在viewController.h中的代碼書寫以下:是拖動的控件生成的代碼orm
1 @property (weak, nonatomic) IBOutlet UILabel *numLabel; htm
2 @property (weak, nonatomic) IBOutlet UILabel *MyLabel; 對象
3 @property (weak, nonatomic) IBOutlet UILabel *MyLabel2;
1 @interface ViewController () 2 { 3 NewViewController *_newVC; 4 } 5 6 @end 7 8 @implementation ViewController 9 //將NewViewController信息傳遞 10 - (void)setNewVC:(NewViewController *)newVC{ 11 _newVC = newVC; 12 } 13 14 - (void)viewDidLoad { 15 [super viewDidLoad]; 16 17 } 18 19 //視圖將要顯示 20 - (void)viewWillAppear:(BOOL)animated{ 21 // 必須在第一行寫 22 [super viewWillAppear:animated]; 23 // 顯示 輸入的帳號 和密碼 24 _MyLabel.text = _newVC.MyTextField.text; 25 _MyLabel2.text = _newVC.MyTextField2.text; 26 } 27 28 - (IBAction)presentAction:(UIButton *)sender { 29 //建立視圖,視圖重用原理 30 _newVC = [[NewViewController alloc] init]; 31 if (!_newVC) {
32 _newVC = [[NewViewController alloc] init];
33 }
34 //設置動畫樣式 35 _newVC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 36 //彈出模態視圖 37 [self presentViewController:_newVC animated:YES completion:^{ 38 NSLog(@"彈出完畢"); 39 int num = [self.numLabel.text intValue]; 40 num ++; 41 NSString *numStr = [NSString stringWithFormat:@"%d",num]; 42 self.numLabel.text = numStr; 43 }]; 44 }
以上是一個present的簡單實現。其中比較重要的部分就是傳值的方法,重寫了NewVC的set方法。這就跟MVC模式相差無幾了。
具體的文字描述以下:
1、最普通的視圖控制器UIViewContoller
一個普通的視圖控制器通常只有模態跳轉的功能,這個方法是全部視圖控制器對象均可以用的,而實現這種功能,有兩種方法。
一、經過方法 - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion跳轉
相信不少人都用過這個方法,他是全部視圖控制器對象都有的成員方法。基本絕大部分狀況下,這個成員方法均可以正常使用,不過有些時候可能會使用失敗,失敗通常的緣由都是,同一個視圖控制器,在同一個時間,只能present一個另外的視圖控制器,若是當前的VC已經present了,再次present一個VC時,就會提示失敗,若是想繼續present,就必須將原來present的控制器dismiss。
控制器還有兩個只讀屬性:presentedViewController和presentingViewController,他們分別是被present的控制器和正在presenting的控制器。好比說, 控制器A和B,[A presentViewController B animated:YES completion:nil]; 那麼A相對於B就是presentingViewController,B相對於A是presentedViewController,即這個時候
B.presentingViewController = A;
A.presentedViewController = B;
這兩個屬性,在有些時候,用起來是很方便的。好比說,如今有個C界面,C界面被顯示出來,可能有兩種狀況,一是modal出來的,另一種是push出來的,這時候就能夠經過當前界面對象的presentingViewController屬性來判斷到底屬於哪一種狀況,若是是nil,表示是UINavigationController對象push過來的,若是不是則是modal過來的。
二、經過方法 - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender跳轉
若是代碼要用這種方式,首先要建立一個UIStoryboardSegue對象,並給初始化相應的值。
UIStoryboardSegue對象,提供了 跳轉源界面,跳轉目的界面,以及一個identifier也就是上面的identifier了,相信這麼一說你們就知道這個類是幹嗎的了。
這種方法同時也支持UINavigationController的跳轉,不過跳轉的模式爲push了,它只能在當前視圖控制器是UINavigationController時才能用。
注:文字解釋部分源自http://www.mamicode.com/info-detail-469709.html
歡迎各位讀者指正。如若轉載請標明出處。