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