ios UIViewController 使用总结

1. 通过代码 实现控制器操作

1.1. 自定义根控制器: 
iOS开发之Xcode11: 删除默认Main.storyBoard、自定义根控制器:https://blog.csdn.net/shifang07/article/details/104682190

SceneDelegate.m:

 - (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
     self.window = [[UIWindow alloc] initWithWindowScene:(UIWindowScene *)scene];
        AViewController *rootVc = [[AViewController alloc]init];
       // rootVc.view.backgroundColor = [UIColor purpleColor];
        rootVc.title = @"scene";
    BViewController* bCtorller=[[BViewController alloc] init];
    //  指定导航控制的根控制器
        UINavigationController *rootNav = [[UINavigationController alloc]initWithRootViewController:rootVc];
    // 设置根控制器导航控制
        [self.window setRootViewController:rootNav];
        [self.window makeKeyAndVisible];
}

导航控制器:导航栏 一般 是 44,IOS 控制也是栈的结构, 入栈、弹出是出栈

1.2. 导航控制器api: 

 //1. 跳入下一个控制器
    BViewController* bController= [[BViewController alloc] init];
    [self.navigationController pushViewController:bController animated: YES];

 //2. 返回之前控制器: 
     // 返回导航控制器的根控制器
 //   [self.navigationController popToRootViewControllerAnimated:YES];
    
    // 返回上一级控制器
 //   [self.navigationController popViewControllerAnimated:YES];
    
    // 返回到指定控制   控制器已经在栈中了
    //  self.navigationController.viewControllers  导航控制器中所有控制器
    AViewController* aCtroller = self.navigationController.viewControllers[0];
    
    [self.navigationController popToViewController:aCtroller animated:YES];

1.3.导航栏属性 api:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 设置导航栏title
    self.navigationItem.title=@"B控制器";
    // 添加导航栏 右侧按钮
    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addClick)
                                        ];
   //  self.navigationItem.leftBarButtonItem
    // 默认是有拖拽返回功能, 自己手动设置leftBarButtonItem 那么没有了
}

-(void) addClick{
    NSLog(@"%@",@"addClick");
}

1.4.控制器生命周期: 

   -(void)loadView{ } :      加载View
   -(void)viewDidLoad :   View 加载完毕
- (void)viewWillAppear:(BOOL)animated{}: View即将显示
-(void)viewDidAppear:(BOOL)animated :  view 显示完成
-(void)viewWillDisappear:(BOOL)animated: view 即将消失
-(void)viewDidDisappear:(BOOL)animated: view 确定消失

重写的时候记得调用父类的构造方法: 
-(void)viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:<#animated#>]
}

2. 通过storyboard 加载传值

segue类型: 
 1. segue 自动类型
    不做任何逻辑直接跳转
 2. 手动类型 
    如果需要做逻辑判断
** 如何拖线,按照 control 键,拖过来,选择show 

segue  自动类型案例: 点击按钮直接跳入目标控制器

2.1.  拖入 导航控制到storyboard 、 指定导航控制器 根控制器

 2.2. 通过  拖线 实现控制器 跳转, 右键,选择 action,   show 

扫描二维码关注公众号,回复: 12683657 查看本文章

3.   UIBarButtonItem 直接拖入即可 , title 导航栏双击即可编辑 

4.    通过stroyboard 传值

// 在执行 拖线 跳转之前会 执行调用 一个该 方法
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    //  @property(nonatomic,copy) NSString* name; 设置属性即可
    AViewController* controller= segue.destinationViewController;
    controller.name=@"hello b";
}

segue  手动类型案例: 跳入 控制器可以做逻辑判断,跳入不同控制器

1. 牵线,导航控制器传递

2. 设置 segue id  用于 区分 A , B控制器 

3.   根据逻辑控制器判断

- (IBAction)nextPage:(id)sender {
   // bconcat
    //1.  根据 segue 跳入 控制器
    BOOL flag= true;
    if(flag){
        [self performSegueWithIdentifier:@"aconcat" sender:@"hello" ];
    }else{
        
    }
}

4.  拦截设置 代理 传值

 //2.  在执行 拖线 跳转之前会 执行调用 一个该 方法
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    //  @property(nonatomic,copy) NSString* name; 设置属性即可
    
    UIViewController* targetVC= segue.destinationViewController;
    // 设置代理,传值
    if([targetVC isKindOfClass:[AViewController class]]){
        NSLog(@"%@",@"属于A的类型");
        AViewController* aConroller= (AViewController*)targetVC;
        aConroller.name=@"hello A";
        aConroller.delegate=self;
    }
}

 B 控制器 ,跳入的控制器

AViewController.h


#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@class AViewController;

@protocol ViewToAViewDelegate <NSObject>

-(void) viewToAView : (AViewController *) aView withArgus:(NSString*) result;


@end

@interface AViewController : UIViewController

@property(nonatomic,copy) NSString* name;

@property(nonatomic,weak) id<ViewToAViewDelegate> delegate;

@end

NS_ASSUME_NONNULL_END

AViewController.m

#import "AViewController.h"

@interface AViewController ()

@end

@implementation AViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"传递过来的值是:%@",self.name);
}


- (IBAction)backto:(id)sender {
    
    if([self.delegate respondsToSelector:@selector(viewToAView:withArgus:)]){
        [self.delegate viewToAView:self withArgus:@"xiaoming"];
    }
    
    [self.navigationController popViewControllerAnimated:YES];
}



@end

A 控制器 获取传递值 ,实现协议 

#import "ViewController.h"
#import "AViewController.h"

@interface ViewController ()< ViewToAViewDelegate>
@property (weak, nonatomic) IBOutlet UITextField *textName;

@end

@implementation ViewController

 //2.  在执行 拖线 跳转之前会 执行调用 一个该 方法
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    //  @property(nonatomic,copy) NSString* name; 设置属性即可
    
    UIViewController* targetVC= segue.destinationViewController;
    // 设置代理,传值
    if([targetVC isKindOfClass:[AViewController class]]){
        NSLog(@"%@",@"属于A的类型");
        AViewController* aConroller= (AViewController*)targetVC;
        aConroller.name=@"hello A";
        aConroller.delegate=self;
    }
}


// B 控制器传递回来, 回调
-(void)viewToAView:(AViewController *)aView withArgus:(NSString *)result{
    NSLog(@"代理回传:%@",result);
    
}


- (void)viewDidLoad {
    [super viewDidLoad];
}

-(void)dealloc{
  // 移除通知
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}


- (IBAction)nextPage:(id)sender {
   // bconcat
    //1.  根据 segue 跳入 控制器
    BOOL flag= true;
    if(flag){
        [self performSegueWithIdentifier:@"aconcat" sender:@"hello" ];
    }else{
        
    }
}


@end

3.  ios 模态窗口:

3. 1. 通过代码实现

A控制器

//A控制器 点击弹出 模态窗口 B
- (IBAction)showModel:(id)sender {
    ModelController* modelVc= [[ModelController alloc] init];
    UINavigationController* nav= [[UINavigationController alloc] initWithRootViewController:modelVc];
   
    [self presentViewController:nav animated:YES completion:^{
        
    }];
}
//  关闭可以在模态窗口B中
//  也可以在 A 控制器中
-(void) dismissClick{
    [self dismissViewControllerAnimated:YES completion:^{
         
     }];
}

B控制器,模态出来的窗口

- (void)viewDidLoad {
    [super viewDidLoad];
   
    // 设置返回bar
    self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(backClose)
        ];
    
       
}
// 关闭模态窗口
-(void)backClose{
    [self dismissViewControllerAnimated:YES completion:^{
        
    }];

}
// 关闭模态窗口
- (IBAction)dismissView:(id)sender {
    
    [self dismissViewControllerAnimated:YES completion:^{
        
    }];
}

3.2. 在  storyboard中 弹出模态窗口

猜你喜欢

转载自blog.csdn.net/dreams_deng/article/details/106496397