模態視圖present

模態視圖實現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

@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

 

歡迎各位讀者指正。如若轉載請標明出處

相關文章
相關標籤/搜索