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 查看本文章
![](/qrcode.jpg)
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中 弹出模态窗口