IOS基礎學習筆記四:控制器切換、賦值

一、Modal

Modal方式一:代碼

 1.打開模態控制器

    [self presentViewController:login animated:YES completion:^{NSLog(@"彈出完畢");}];

 2.關閉模態控制器

    [self dismissViewControllerAnimated:YES completion:nil];

Modal方式二:storyboard

storyboard中托出兩個ViewController:ViewController 和 NextViewController

按住CTRL 點擊ViewController 中的button 指向 NextViewController,在彈出中選擇Modal


------------、控制器之間傳值----------------

傳值方式一:直接複雜,缺點 耦合性太高 

例子說明:在Modal,取呈現的控制器(presentingViewController)對象直接賦值

- (IBAction)loginToMain:(id)sender {
    // 1.取出用戶名,並傳回上一個控制器
    NSString *text = self.username.text;
    ViewController *back =(ViewController *)self.presentingViewController;
    back.userName.text=text;
    //[self.delegate loginSuccess:text];
    
    // 2.關閉當前控制器
    [self dismissViewControllerAnimated:YES completion:nil];
}

傳值方式二: 代理 說明:ViewController作爲代理,LoginViewController中定義代理

步驟一:LoginViewController.h中定義協議

@protocol LoginViewControllerDelegate;

@interface LoginViewController : UIViewController
    @property (weak, nonatomic) IBOutlet UITextField *username;
    - (IBAction)back:(id)sender;
    - (IBAction)loginToMain:(id)sender;

    // 代理用weak
@property (nonatomic, weak) id<LoginViewControllerDelegate> delegate;
@end

@protocol LoginViewControllerDelegate <NSObject>
    - (void)loginSuccess:(NSString *)usernameText;
@end


並且 LoginViewController.m 登錄IBAction 用到  [self.delegateloginSuccess:text];


步驟二:ViewController.h繼承協議

@protocol LoginViewControllerDelegate;
@interface ViewController : UIViewController<LoginViewControllerDelegate>
@end

步驟三:ViewController.m chu 綁定代理,並實現接受消息方法loginSucess

  // 初始化控制器
    LoginViewController *login = [[LoginViewController alloc] init];
    login.delegate = self;
    // 彈出登錄界面
    [self presentViewController:login animated:YES completion:^{
        NSLog(@"彈出完畢");
    }];

#pragma mark LoginViewControllerDelegate方法
- (void)loginSuccess:(NSString *)usernameText
{
//    NSLog(@"%@",usernameText);
    self.userName.text=usernameText;
}
步驟四:LoginViewController.m 觸發代理方法

[self.delegateloginSuccess:text];


二、push 用到導航控制器UINavigationController 類似 棧

方式一 代碼:

MJAppDelegate.m中 創建導航控制器,並設置MJViewController爲第一個控制器

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
    
    // 創建導航控制器(並且設置MJViewController是第一個子控制器)
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    //NSLog(@"nav=%@", nav);
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    return YES;
}

  導航控制器掌握:

 1.創建導航控制器

 [[UINavigationController alloc] initWithRootViewController:self.viewController];

 2.棧(棧中所有的子控制器)

 self.navigationController.viewControllers;

 3.將控制器壓入棧中

 [self.navigationController pushViewController:second animated:YES]; 

 4.將控制器從棧中彈出

 1> 將棧頂控制器彈出

 [self.navigationController popViewControllerAnimated:YES];

 2> 回到棧底控制器(根控制器)

 [self.navigationController popToRootViewControllerAnimated:YES];

 3> 回到具體某一個控制器

 [self.navigationController popToViewController:<#(UIViewController *)#> animated:<#(BOOL)#>]; 

 5.導航欄顯示的內容

 1> 棧頂控制器的navigationItem屬性決定了導航欄上面顯示的東西

 2> 導航欄左邊的返回鍵,是由上一個控制器決定

 6.棧頂控制器

 self.navigationController.topViewController

 // 棧頂控制器的navigationItem屬性決定了導航欄上面顯示的東西
    // 導航欄左邊的返回鍵,是由上一個控制器決定
    self.navigationItem.title = @"MJViewController";
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
    
    // 設置下一個界面的返回按鈕
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];

方式二 :storyboard

  // 跳到下一個控制器 (執行對應的線):VIew 對 View拖,push的線;“ogin_success”對於線的identifier

  [selfperformSegueWithIdentifier:@"login_success"sender:nil];

在執行segue之前會調用一個方法

#pragma mark  執行segue之前會先調用一下這個方法
// 可以給下一個控制器傳遞數據
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    //segue.sourceViewController; // 來源控制器
    
    //segue.destinationViewController; // 目的控制器
    
    NSLog(@"%@", segue.sourceViewController);
    NSLog(@"%@", segue.destinationViewController);
}



二、UITabBarController 


 1.UITabbarController的所有子控制器:viewControllers 

 2.UITabbarController可以設置delegate,監聽切換過程

 3.每個標籤顯示的內容由當前子控制器的tabbarItem屬性決定

 self.tabBarItem.title = @"MJView"; // 文字

 self.tabBarItem.badgeValue = @"5"; // 紅色數字

 self.tabBarItem.image // 圖片







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章