ios 視圖控制器和導航模式

控制器切換方式:
model 是所有控制器擁有的權(quán)益,只要是控制器都可以modal出其他控制器
push 是導航控制器及其子控制器的專權(quán),只有它們才能調(diào)用push方法
Present Modally 模態(tài)類型的過渡
View Controllers 標簽導航

一驯击、模態(tài)視圖

  • 目的 模態(tài)視圖主要是為了完成次要任務
  • 特點 以模態(tài)窗口的形式管理視圖弥激,當前視圖關閉前其他視圖上的內(nèi)容無法操作未辆。
  • 顯示方式 默認從屏幕下方滑出
  • 模態(tài)視圖控制器 并非專門的類,可以是其他控制器的子類,負責主要視圖的控制器為主控制器,與模態(tài)控制器為父子關系扯躺。
  • 相關方法 在ViewController類中

-presentViewController:animated:completion //呈現(xiàn)模態(tài)視圖
-dismissViewControllerAnimated:complation //關閉模態(tài)視圖

登錄.png
注冊.png
#import "ViewController.h"
#import "RegisterViewController.h"

@interface ViewController ()
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    CGRect screen = [[UIScreen mainScreen] bounds];
    self.navigationItem.title = @"登錄";
    
    /// 1.添加用戶ID:標簽
    UILabel* labelId = [[UILabel alloc] initWithFrame:CGRectMake(59,115, 80, 21)];
    labelId.text = @"用戶ID:";
    [self.view addSubview:labelId];
    
    /// 2.添加用戶ID TextField
    UITextField* textFieldId = [[UITextField alloc] initWithFrame:CGRectMake(141, 106, 200, 30)];
    textFieldId.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:textFieldId];
    
    /// 3.添加密碼:標簽
    UILabel* labelPwd = [[UILabel alloc] initWithFrame:CGRectMake(76, 178, 80, 21)];
    labelPwd.text = @"密碼:";
    [self.view addSubview:labelPwd];
    
    /// 4.添加密碼 TextField
    UITextField* textFieldPwd = [[UITextField alloc] initWithFrame:CGRectMake(141, 169, 200, 30)];
    textFieldPwd.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:textFieldPwd];
    
    /// 5.添加 登錄按鈕
    UIButton* buttonLogin = [UIButton buttonWithType:UIButtonTypeSystem];
    buttonLogin.frame = CGRectMake((screen.size.width - 30)/2, 231, 50, 30);
    [buttonLogin setTitle:@"登錄" forState:UIControlStateNormal];
    [self.view addSubview:buttonLogin];
    
    /// 6.添加 注冊按鈕
    UIButton* buttonReg = [UIButton buttonWithType:UIButtonTypeSystem];
    buttonReg.frame = CGRectMake((screen.size.width - 30)/2, 294, 50, 30);
    [buttonReg setTitle:@"注冊" forState:UIControlStateNormal];
    [buttonReg addTarget:self action:@selector(onClick:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:buttonReg];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registerCompletion:) name:@"RegisterCompletionNotification" object:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)onClick:(id)sender {
    RegisterViewController* registerViewController = [[RegisterViewController alloc] init];
    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:registerViewController];
   
    [self presentViewController:navigationController animated:TRUE completion:nil];
}
-(void)registerCompletion:(NSNotification*)notification {  
    NSDictionary *theData = [notification userInfo];
    NSString *username = theData[@"username"];
    NSLog(@"username = %@",username);
}

@end
#import "RegisterViewController.h"

@interface RegisterViewController ()
@property (strong, nonatomic) UITextField *txtUsername;
@end

@implementation RegisterViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.navigationItem.title = @"注冊";
    
    UIBarButtonItem *saveButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                       UIBarButtonSystemItemSave target:self action:@selector(save:)];
    
    UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:
                                         UIBarButtonSystemItemCancel target:self action:@selector(cancel:)];
    
    self.navigationItem.rightBarButtonItem = saveButtonItem;
    self.navigationItem.leftBarButtonItem = cancelButtonItem;
      
    /// 1.添加用戶ID:標簽
    UILabel* labelId = [[UILabel alloc] initWithFrame:CGRectMake(35, 187, 85, 21)];
    labelId.text = @"用戶ID:";
    [self.view addSubview:labelId];
    
    /// 2.添加Username TextField
    self.txtUsername = [[UITextField alloc] initWithFrame:CGRectMake(145, 178, 131, 30)];
    self.txtUsername.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:self.txtUsername];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)save:(id)sender {  
    [self dismissViewControllerAnimated:TRUE completion:^{    
        NSLog(@"點擊Save按鈕,關閉模態(tài)視圖");   
        NSDictionary *dataDict = @{@"username" : self.txtUsername.text};    
        [[NSNotificationCenter defaultCenter] postNotificationName:@"RegisterCompletionNotification" object:nil userInfo:dataDict];
    }];   
}
- (void)cancel:(id)sender { 
    [self dismissViewControllerAnimated:TRUE completion:^{
        NSLog(@"點擊Cancel按鈕蝎困,關閉模態(tài)視圖");
    }];    
}

@end

PS:Interface Builder實現(xiàn)時录语,過渡方式選擇Present Modally 模態(tài)類型的過渡,同時需要操作的控制器需要嵌入到一個導航控制器禾乘,故事版中選擇ViewController ->Editor ->Embed ->Navigation Controller 钦无。

二、平鋪導航

一般用于簡單的扁平化信息(信息之間沒有從屬的層次關系)瀏覽盖袭,

正在更新失暂。。鳄虱。弟塞。

三、標簽導航 (UITabBarController)

  • 特點 以平行的方式管理視圖拙已,各個視圖之間往往關系并不大决记,每個加入到UITabBarController的視圖都會進行初始化即使當前不顯示在界面上,相對比較占用內(nèi)存倍踪。
  • 概述 UITabBarController是Apple專門為了利用頁簽切換視圖而設計的系宫,在這個視圖控制器中有一個UITabBar控件索昂,用戶通過點擊tabBar進行視圖切換。我們知道在UIViewController內(nèi)部有一個視圖扩借,一旦創(chuàng)建了UIViewController之后默認就會顯示這個視圖椒惨,但是UITabBarController本身并不會顯示任何視圖,如果要顯示視圖則必須設置其viewControllers屬性(它默認顯示viewControllers[0])潮罪。這個屬性是一個數(shù)組康谆,它維護了所有UITabBarController的子視圖。為了盡可能減少視圖之間的耦合嫉到,所有的UITabBarController的子視圖的相關標題沃暗、圖標等信息均由子視圖自己控制,UITabBarController僅僅作為一個容器存在何恶。
  • 總結(jié)
    1> UITabBarController會一次性初始化所有子控制器孽锥,但是默認只加載第一個控制器視圖,其他視圖控制器只初始化默認不會加載,為了能夠?qū)⑵渌涌刂破饕舱o@示在Tab bar中我們訪問了每個子視圖控制器的視圖以便調(diào)用其視圖加載方法(viewDidLoad);當然细层,既然會調(diào)用子視圖的初始化方法惜辑,當然也可以將視圖控制器的tabBarItem屬性設置放到init方法中設置,如此則不用再遍歷其視圖屬性了今艺。
    2> 每個視圖控制器都有一個tabBarController屬性韵丑,通過它可以訪問所在的UITabBarController爵卒,而且對于UITabBarController的直接子視圖其tabBarController等于parentViewController虚缎。
    3> 每個視圖控制器都有一個tabBarItem屬性,通過它控制視圖在UITabBarController的tabBar中的顯示钓株。
    4> tabBarItem的image屬性必須是png格式(建議大小32*32)并且打開alpha通道否則無法正常顯示实牡。

四、樹形結(jié)構(gòu)導航

  • 目的 導航視圖(UINavigationController)和表視圖(UITableView)結(jié)合使用轴合,用于構(gòu)建有從屬關系的導航创坞。
  • 特點
    a. UINavigationController 以棧的方式管理視圖,各個視圖的切換就是壓棧和出棧操作受葛,出棧后的視圖會立即銷毀题涨。UINavigationController是一個導航控制器,它用來組織有層次關系的視圖总滩,在UINavigationController中子控制器以棧的形式存儲纲堵,只有在棧頂?shù)目刂破髂軌蝻@示在界面中,一旦一個子控制器出棧則會被銷毀闰渔。UINavigationController默認也不會顯示任何視圖(這個控制器自身的UIView不會顯示)席函,它必須有一個根控制器rootViewController,而且這個根控制器不會像其他子控制器一樣被銷毀冈涧。
  • 總結(jié)

1> UINavigationController默認顯示一個根控制器茂附,這個根視圖必須指定(前面我們說過UINavigationController和UITabBarController類似僅僅作為導航容器正蛙,本身并不會顯示視圖),通過根控制器導航到其他下一級子視圖营曼。
2> 在子視圖中可以通過navigationController訪問導航控制器乒验,同時可以通過navigationController的childViewControllers獲得當前棧中所有的子視圖(注意每一個出棧的子視圖都會被銷毀)。
3> UINavigationController導航是通過上方導航欄進行的(類似的UITabBarController是通過下方UITabBar進行導航)溶推,每個放到UINavigationController棧中的子視圖都會顯示一個導航欄徊件,可以通過子控制器(包括根控制器)的navigationItem訪問這個導航欄,修改其左右兩邊的按鈕內(nèi)容蒜危。
4> 默認情況下除了根控制器之外的其他子控制器左側(cè)都會在導航欄左側(cè)顯示返回按鈕虱痕,點擊可以返回上一級視圖,同時按鈕標題默認為上一級視圖的標題,可以通過backBarButtonItem修改辐赞。下一級子視圖左側(cè)返回按鈕上的標題的顯示優(yōu)先級為: 導航欄返回按鈕backBarButtonItem的標題(注意不能直接給backBarButtonItem的標題賦值部翘,只能重新給backBarButtonItem賦值)、導航欄navigationItem的標題响委,視圖控制器標題新思。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赘风,隨后出現(xiàn)的幾起案子夹囚,更是在濱河造成了極大的恐慌,老刑警劉巖邀窃,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荸哟,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞬捕,警方通過查閱死者的電腦和手機鞍历,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肪虎,“玉大人劣砍,你說我怎么就攤上這事∩染龋” “怎么了刑枝?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長迅腔。 經(jīng)常有香客問我装畅,道長,這世上最難降的妖魔是什么钾挟? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任洁灵,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徽千。我一直安慰自己苫费,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布双抽。 她就那樣靜靜地躺著百框,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牍汹。 梳的紋絲不亂的頭發(fā)上铐维,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音慎菲,去河邊找鬼嫁蛇。 笑死,一個胖子當著我的面吹牛露该,可吹牛的內(nèi)容都是我干的睬棚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼解幼,長吁一口氣:“原來是場噩夢啊……” “哼抑党!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起撵摆,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤底靠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后特铝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體暑中,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年苟呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了痒芝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俐筋。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牵素,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澄者,到底是詐尸還是另有隱情笆呆,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布粱挡,位于F島的核電站赠幕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏询筏。R本人自食惡果不足惜榕堰,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逆屡,春花似錦圾旨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至莺治,卻和暖如春廓鞠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谣旁。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工床佳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榄审。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓夕土,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瘟判。 傳聞我的和親對象是個殘疾皇子怨绣,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容