IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
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
上一篇: 刚刚被破格提拔的经理亲戚
下一篇: 狗子不但睡了你的床