欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-04-18 09:47:10
1.UIPickerView...
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

效果:
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
//什么时候会用到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类
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理

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
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
3、直接正序的跳转(红跳绿,绿跳蓝)
对按钮右键拖线选择show即可,出现箭头
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
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];
}

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

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

效果
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
IOS开发教程第一季之UI进阶day2合并IOS学习013--App启动过程、多控制器管理
针对子控制器的返回需要在字控制的文件中实现
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;
  
}

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

11.控制器view的生命周期

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

12.控制器view的加载

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

13.内存警告处理

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

14.LoadView的过程

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

15.UIkit的继承结构

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

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