標籤:
最後:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >
main.storyboard
BeyondViewController.h
//// BeyondViewController.h// 16_控制器切換方式1_Modal_通過代碼方式//// Created by beyond on 14-7-30.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import <UIKit/UIKit.h>@interface BeyondViewController : UIViewController// 提示歡迎誰誰誰@property (weak, nonatomic) IBOutlet UILabel *welcomeLabel;@property (weak, nonatomic) IBOutlet UIButton *wantLoginBtn;@property (weak, nonatomic) IBOutlet UIButton *wantLogoutBtn;// 點擊BeyondViewController介面上的登入button,切換到BeyondLoginViewController.h進行輸入password帳號登入- (IBAction)wantLogin:(UIButton *)sender;- (IBAction)wantLogout:(UIButton *)sender;@end
BeyondViewController.m
//// BeyondViewController.m// 16_控制器切換方式1_Modal_通過代碼方式//// Created by beyond on 14-7-30.// Copyright (c) 2014年 com.beyond. All rights reserved./* 控制器切換的3種方式: 1,modal (模態對話方塊,新的控制器從底部往上展開,遮住後面的控制器)(很多其它能夠參看 羅雲彬的<琢石成器—Windows環境下32位組合語言程式設計>第5.4章 對話方塊) 通過代碼實現切換 通過storyboard實現切換 2,push 通過UINavigationController管理的棧實現 從右往左邊展開,彈出新的控制器(處於棧頂), 涉及內容主要有: 參數的傳遞 導覽列的標題定製 跳轉前的驗證,典型如登入跳轉前的client校正 3,UITabbarController 以平行的方式是管理子視圖控制器 4,自己定義容器,相似抽屜效果(右滑,彈出左側側邊欄) */#import "BeyondViewController.h"#import "BeyondLoginViewController.h"@interface BeyondViewController ()<BeyondLoginViewControllerDelegate,UIActionSheetDelegate>@end@implementation BeyondViewController- (void)viewDidLoad{ [super viewDidLoad];}// 點擊BeyondViewController介面上的登入按鈕,切換到BeyondLoginViewController.h進行輸入password帳號登入- (IBAction)wantLogin:(UIButton *)sender { // 想通過代碼以Modal的方式,切換到BeyondLoginViewController控制器,就必須建立執行個體對象,耦合性太強~ BeyondLoginViewController *loginViewCtrl = [[BeyondLoginViewController alloc]init]; // 設定loginViewCtrl的代理 為當前控制器,由於,在下一個控制器(loginViewCtrl)中,使用者輸入完使用者名稱和password之後,會調用代理 的doSomethingWithUsername方法,給它的代理對象(即當前控制器)發訊息,參數 就是要傳遞過來的使用者名稱~ loginViewCtrl.delegate = self; // 關鍵,代碼,全部控制器都有該方法,展現 [self presentViewController:loginViewCtrl animated:YES completion:^{ NSLog(@"BeyondLogin控制器--出現了"); }];}// 實現下一個控制器中代理方法,由於在下一個控制器(loginViewCtrl)中,使用者輸入完使用者名稱和password之後,會調用代理 的doSomethingWithUsername方法,給它的代理對象(即當前控制器)發訊息,參數 就是要傳遞過來的使用者名稱~- (void)doSomethingWithLoginName:(NSString *)username{ username = [NSString stringWithFormat:@"歡迎回來:%@",username]; _welcomeLabel.text = username; // 禁用登入按鈕 _wantLoginBtn.enabled = NO; _wantLogoutBtn.enabled = YES;}- (IBAction)wantLogout:(UIButton *)sender{ UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"確定登出嗎?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"確定" otherButtonTitles:nil, nil]; [actionSheet showInView:self.view];}#pragma mark - actionSheet的代理 方法- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ NSLog(@"按鈕索引:%d",buttonIndex); // 確定登出 索引是 0 if (buttonIndex == 0) { // 登出 _wantLoginBtn.enabled = YES; _wantLogoutBtn.enabled = NO; _welcomeLabel.text = @""; } // 取消 索引是 1 doNothing }@end
協議
BeyondLoginViewControllerDelegate.h
//// BeyondLoginViewControllerDelegate.h// 16_控制器切換方式1_Modal//// Created by beyond on 14-7-30.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import <Foundation/Foundation.h>@protocol BeyondLoginViewControllerDelegate <NSObject>- (void) doSomethingWithLoginName:(NSString *)username;@end
BeyondLoginViewController.xib
BeyondLoginViewController.h
//// BeyondLoginViewController.h// 16_控制器切換方式1_Modal//// Created by beyond on 14-7-30.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import <UIKit/UIKit.h>#import "BeyondLoginViewControllerDelegate.h"@interface BeyondLoginViewController : UIViewController// id類型的代理 (weak弱引用),調用代理 的方法,將本控制器中使用者輸入的姓名,通過參數傳遞給 代理 ,供其使用@property (nonatomic,weak) id <BeyondLoginViewControllerDelegate> delegate;@property (weak, nonatomic) IBOutlet UITextField *username;@property (weak, nonatomic) IBOutlet UITextField *password;// 向server提交username與password- (IBAction)submit:(UIButton *)sender;// 點擊返回button,返回到前一個控制器- (IBAction)backToHome:(UIBarButtonItem *)sender;@end
BeyondLoginViewController.m
//// BeyondLoginViewController.m// 16_控制器切換方式1_Modal//// Created by beyond on 14-7-30.// Copyright (c) 2014年 com.beyond. All rights reserved.//#import "BeyondLoginViewController.h"#import "BeyondViewController.h"#import "BeyondLoginViewControllerDelegate.h"@interface BeyondLoginViewController ()@end@implementation BeyondLoginViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{ self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self;}- (void)viewDidLoad{ [super viewDidLoad]; // 設定password框 為星號 _password.secureTextEntry = YES;}// 點擊返回button,返回到前一個控制器- (IBAction)backToHome:(UIBarButtonItem *)sender{ // 關鍵代碼,關閉自身這個modal模態對話方塊 [self dismissViewControllerAnimated:YES completion:^{ NSLog(@"BeyondLogin控制器,消失了"); }];}// 向server提交使用者名稱和password- (IBAction)submit:(UIButton *)sender { // 如同 JS 表單驗證 if (_username.text.length == 0 || _password.text.length == 0) { // <#(id<UIActionSheetDelegate>)#> UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"請輸入使用者名稱和password" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"紅色警告" otherButtonTitles:@"其它button", nil]; // 如同toast,手動顯示 [actionSheet showInView:self.view]; // 直接返回 return; } // 傳遞資料 給上一個控制器 /* // 方式1,耦合性太強,直接得到彈出自己的那一個(上一個)控制器 BeyondViewController *preVC = (BeyondViewController *)self.presentingViewController; // 這樣就能夠設定上一個控制 器的Label了 preVC.welcomeLabel.text = _username.text; [self dismissViewControllerAnimated:YES completion:nil]; */ // 方式2,使用代理 ,調用代理 的方法,並將當前控制器的輸入的使用者名稱,作為參數,傳遞給代理的這種方法裡,供代理去使用 [self.delegate doSomethingWithLoginName:_username.text]; [self dismissViewControllerAnimated:YES completion:nil];}@end
Modal模態對話方塊--------通過storyboard方式實現
著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。
iOS_16_開關控制器_modal_代碼方法