当前位置: 移动技术网 > 移动技术>移动开发>IOS > IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理

IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理

2020年07月17日  | 移动技术网移动技术  | 我要评论
1.常用编写代理及实现代理的过程

1、创建基本类

Teacher.h
Teacher.m

Student.h
Student.m

2、在Teacher类中编写代理

声明协议 TeacherDelegete
	申明协议方法
	写作业...
Teacher.h

3、在Teacher类声明中创建代理属性

声明协议 TeacherDelegete
	申明协议方法
	写作业...
Teacher.h
id<TeacherDelegate> delegate

4、在Teacher类实现中执行代理操作

声明协议 TeacherDelegete
	申明协议方法
	写作业...
Teacher.h
id<TeacherDelegate> delegate

Teacher.m
if[self.delegate responseToselector:]{//如果实现了代理方法
	[self.delegate 写作业];//实现代理方法
}

5、在Student类中真正实现协议方法

声明协议 TeacherDelegete
	申明协议方法
	写作业...
Teacher.h
id<TeacherDelegate> delegate

Teacher.m
if[self.delegate responseToselector:]{//如果实现了代理方法
	[self.delegate 写作业];//实现代理方法
}

Student.h<TeacherDelegate>
Student.m
类扩展
合适的位置设置代理
-写作业{
	//写作业的一系列操作
}
2.加载自定义控制器的过程(控制器与安卓中activity比较像)

1、删除viewController.m和main.storyboard
2、配置文件中默认加载stroyboard文件名称删除
3、加载自定义控制器的操作
3.1、在应用程序代理方法(应用加载完毕的方法里面)
3.2、创建窗口,同时指定窗口大小
3.3、创建控制器,设置为窗口的根控制器
3.4、将这个window作为应用程序的主窗口,并且可见

以下代码没有能够在IOS13的模拟器中实现原因是在screenDelegate管理了window(自定义控制器为FRViewController)
控制器FRViewController
FRViewController.h

#import "FRViewController.h"

@interface FRViewController ()

@end

@implementation FRViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
  self.view.backgroundColor=[UIColor grayColor];
}
@end

SceneDelegate.h

#import "SceneDelegate.h"

@interface SceneDelegate ()

@end

@implementation SceneDelegate


- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
  if ([scene isKindOfClass:[UIWindowScene class]]) {
    UIWindowScene* windowScene=(UIWindowScene*)scene;
    UIWindow* window=[[UIWindow alloc]initWithWindowScene:windowScene];
    window.backgroundColor=[UIColor clearColor];
    self.window=window;
    NSLog(@"%s",__FUNCTION__);
    [window makeKeyAndVisible];
  }
}

@end

AppDelegate.m

#import "AppDelegate.h"
#import "FRViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  if (@available(ios 13.0,*)) {
    
  }else{
    //创建窗口并且指定大小
    self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds ];
    //设置窗口的根控制器
    //创建控制器
    FRViewController* myvievController=[[FRViewController alloc]init];
    //设置为窗口的根控制器
    self.window.rootViewController=myvievController;
    //将窗口作为应用程序的主窗口
    [self.window makeKeyAndVisible];
    //[self.window makeKeyWindow];
    //self.window.hidden=NO;
  }
  return YES;

}

@end
3.控制器的加载(懒加载)

控制器view的加载是懒加载
self.view就去加载控制器的view

4.手动创建window
#import "ViewController.h"

@interface ViewController ()
- (IBAction)addwindowBtnClick:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view.
}


- (IBAction)addwindowBtnClick:(id)sender {
  //创建一个红色的window
  UIWindow* redWindow=[[UIWindow alloc]initWithFrame:CGRectMake(20, 60, 200, 200)];
  redWindow.backgroundColor=[UIColor redColor];
  redWindow.hidden=NO;
  [self.view addSubview:redWindow];
  
  //创建一个按钮
  UIButton* btn=[UIButton buttonWithType:UIButtonTypeContactAdd];
  [btn addTarget:self action:@selector(btnclick) forControlEvents:UIControlEventTouchUpInside];
  [redWindow addSubview:btn];
  //什么时候会用到window?
  //对第三方框架,用的比较多,尤其是那种提示类的框架,会用到,主要提示用户耐心等待加载完成
}

-(void)btnclick{
  NSLog(@"点了加号按钮");
}
@end

效果:
在这里插入图片描述
//什么时候会用到window?
//对第三方框架,用的比较多,尤其是那种提示类的框架,会用到,主要提示用户耐心等待加载完成
//加载第三方框架的窗口的时候,尽量使用以下方式

  [[[UIApplication sharedApplication].windows lastObject]addSubview:customWindow];
5.三种加载控制器的方式

1、纯代码
2、storyboard创建控制器
3、通过xib创建控制器

  • 3.1需要先创建自定义控制器类
  • 3.2指定xib文件
    第一种创建xib的方式:纯代码方式
UIViewController* xibvc=[[UIViewController alloc]initWithNibName:@"name" bundle:nil];
  self.window.rootViewController=xibvc;

第二种创建xib的方式:指定类的方式
对xib文件指定class类
在这里插入图片描述

6.多控制器的概念

app中有多个view时,可以用一个大的view去管理1个或多个小view,控制器也类似,可以用一个大控制器去管理多个控制器
如果A控制器管理B、C、D的“父控制器”,BCD则称之为子控制器
为了便于管理控制器,IOS提供了两个比较特殊的控制器

  • UINavigatonController导航控制器
  • UITableController 标签控制器

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch.
  //创建window
  self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
  UINavigationController* nav=[[UINavigationController alloc]init];
  nav.view.backgroundColor=[UIColor grayColor];
  //设置window的根控制
  //创建导航控制器
  self.window.rootViewController=nav;
  //创建3个控制器交给导航控制器管理
  FRRedViewController* redVC=[[FRRedViewController alloc]init];
  FRGreenViewController* greenVC=[[FRGreenViewController alloc]init];
  FRBlueViewController* blueVC=[[FRBlueViewController alloc]init];

  //管理子控制器使用push
  [nav pushViewController:redVC animated:YES];
  [nav pushViewController:greenVC animated:YES];
  [nav pushViewController:blueVC animated:YES];

  
  [self.window makeKeyAndVisible];
  return YES;
}

导航控制器的正确用法
1、导航控制器在显示的时候同时指定一个根控制器
2、在用户执行某些操作的时候才需要跳转,因此在根控制器(主控制器)上有个按钮,当点击这个按钮的时候跳转绿色控制器(子孔子去)
AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch.
  //创建window
  self.window=[[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
  //创建主控制器
  FRGreenViewController* redVC=[[FRGreenViewController alloc]init];
  //创建导航控制器的同时指定主控制器
  UINavigationController* nav=[[UINavigationController alloc]initWithRootViewController:redVC];
  //设置window的根控制
  //创建导航控制器
  self.window.rootViewController=nav;
  
  [self.window makeKeyAndVisible];
  return YES;
}

在红色控制器中创建按钮并拖线,实现方法

#import "FRRedViewController.h"
#import "FRGreenViewController.h"
@interface FRRedViewController ()
- (IBAction)go2GreenVc:(UIButton*)sender;

@end

@implementation FRRedViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
}

- (IBAction)go2GreenVc:(UIButton*)sender {
  //创建绿色控制器
  FRGreenViewController* greenVc=[[FRGreenViewController alloc]init];
  //跳转
  //获取当前控制器的导航控制器
  [self.navigationController pushViewController:greenVc animated:YES];
  //[self.navigationController popViewControllerAnimated:YES];//返回到上一个控制器
  //[self.navigationController popToRootViewControllerAnimated:YES];//返回到根控制器
  //[self.navigationController popToViewController:blueVc animated:YES];//返回到指定控制器

}
@end
7.导航控制器使用注意事项

1、创建控制器的同时指定他的根控制器
2、显示下一个控制器的时候
2.1创建一个要push到的控制器
2.2push的时候,需要获取到当前控制器的导航控制器self.navigationController
3、返回:
3.1返回到上一个控制器: //[self.navigationController popViewControllerAnimated:YES]
3.2返回到根控制器: [self.navigationController popToRootViewControllerAnimated:YES]
3.3返回到指定的控制器:代码如下

NSArray *vcs=self.navigationController.viewControllers;//获取栈内所有控制器的集合(数组)
UIViewController* vc= vcs[1];//获取到指定的控制器
[self.navigationController popToViewController:vc animated:YES];//返回到该指定的控制器

注意:指定控制器必须是已经存在于导航控制器栈内的控制器
导航控制器栈:
作用:就是用来保管导航控制器内所有的子控制器(后进先出,先进后出)
nav.viewControllers

8.使用storyboard管理多个控制器

1、删除原有的ViewController了
2、创建多个navigateViewController,如下图,并分别制定相应的控制器类为
FRRedViewController,FRGeenViewController,FRBlueViewController(红绿蓝),同时拖线各个按钮
第一个为根控制器,右键拖拽到第一个控制器,选rootViewController
在这里插入图片描述
在这里插入图片描述
3、直接正序的跳转(红跳绿,绿跳蓝)
对按钮右键拖线选择show即可,出现箭头
在这里插入图片描述
4、通过代码方式进行指定ViewController的跳转
对拖线的按钮事件方法代码如下

//返回到红色控制器
- (IBAction)back2red:(id)sender {
  [self.navigationController popToRootViewControllerAnimated:YES];
}
@end
//返回到指定控制器
- (IBAction)back2special:(id)sender {
  //获取指定的控制器栈内所有的控制器
  NSArray* viewControllers=self.navigationController.viewControllers;
  //取出特定的控制器
  UIControl* viewcontroller=viewControllers[0];//先进的栈是第一个栈元素,也是根控制器
  //跳转到该控制器
  [self.navigationController popToViewController:viewcontroller animated:YES];
}

效果示意:
在这里插入图片描述

9.添加导航条的item(UIBarButtonItem)

FRRedViewController.m

@implementation FRRedViewController

- (void)viewDidLoad {
    [super viewDidLoad];
#pragma mark ------设置导航控制器的导航栏的内容--------
  //获取当前导航控制器的导航栏
  //self.navigationItem可以获取到导航栏
  self.navigationItem.title=@"红色控制器";
  //设置一个控件
  UIButton* addBtn=[UIButton buttonWithType:UIButtonTypeContactAdd];
  [addBtn addTarget:self action:@selector(addBtnClick) forControlEvents:UIControlEventTouchUpInside];
  self.navigationItem.titleView=addBtn;
  //设置按钮
  //创建一个uibarbutton类型的按钮
  UIBarButtonItem* leftItemButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addBtnClick)];
  //左侧按钮
  self.navigationItem.leftBarButtonItem=leftItemButton;
  UIBarButtonItem* rightItemButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(addBtnClick)];
  //右侧按钮
  self.navigationItem.rightBarButtonItem=rightItemButton;
  //多个按钮
  UIBarButtonItem* otherButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(addBtnClick)];
  NSArray* itemArray=@[leftItemButton,rightItemButton,otherButton];//需要传入一个数组
  self.navigationItem.leftBarButtonItems=itemArray;
  
  //返回按钮
  UIBarButtonItem* backItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(addBtnClick)];
  self.navigationItem.backBarButtonItem=backItem;


}

-(void)addBtnClick{
  NSLog(@"您点击了导航栏标题按钮");
}

@end

效果
在这里插入图片描述
在这里插入图片描述
针对子控制器的返回需要在字控制的文件中实现
FRGreenViewController.m

#import "FRGreenViewController.h"

@interface FRGreenViewController ()
- (IBAction)back2red:(id)sender;

@end

@implementation FRGreenViewController

- (void)viewDidLoad {
    [super viewDidLoad];
  //当这个控制器不是导航控制器的控制器,如果在左侧放置了按钮,那么系统生成的返回按钮就不复存在了
    //放到绿色控制器导航栏的按钮
  UIBarButtonItem* leftButton=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(cameraClick)];
  self.navigationItem.leftBarButtonItem=leftButton;
}

-(void)cameraClick{
  NSLog(@"点击了相机按钮");
  [self.navigationController popToRootViewControllerAnimated:YES];
}
//返回到红色控制器
- (IBAction)back2red:(id)sender {
  [self.navigationController popToRootViewControllerAnimated:YES];
}
@end
10.导航控制器之间的传值问题(通过storyboard segue控制器跳转类)

将红色控制器内的文本框文字传递给绿色控制器导航栏的title
实现FRRedViewController.m中的prepareForSegue方法
FRRedViewController.m
#pragma mark ----导航控制方法-----
//通过storybord拖线的方式实现跳转的时候调用该方法

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
  //先获取文本框内容
  NSString* text= self.redText.text;
  //将文本框内容传递给绿色控制器导航栏的title
  //通过UIStoryBordSegue类跳转
  //identifier  标记
  //sourceViewController  源控制器
  //destinationViewController 目标(目的地)控制器
  
  
  //获取目标控制器
  FRGreenViewController* greenController= segue.destinationViewController;
  greenController.navigationItem.title=text;
  
}

效果:
在这里插入图片描述
在这里插入图片描述

11.控制器view的生命周期

在这里插入图片描述

12.控制器view的加载

在这里插入图片描述

13.内存警告处理

在这里插入图片描述

14.LoadView的过程

在这里插入图片描述

15.UIkit的继承结构

在这里插入图片描述

本文地址:https://blog.csdn.net/weixin_43745804/article/details/107350492

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网