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 

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

 

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