模态视图实现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
欢迎各位读者指正。如若转载请标明出处。