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 // 图片







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