2015年07月21日第12天笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yu_4074/article/details/46977463

零碎知识
1.新建-Other-PCH文件
2.作用:导入常用的头文件;
3.乱码转中文的文件类在素材里
4.关联PCH:点击项目 Buiset栏 搜header 改写PCH的路径(拖到终端得到路径)这样写是全路径,不能跨平台
5.另一种方法:随便输入一个字符编译下,然后输入相对路径编译;就可以跨平台了或跨项目了
6.pch第二点作用:导入常用的宏如定义屏幕的宽高
7.NSLog损耗性能:要一下全部删除:写在PCH里
8.在选择模拟器哪里找—edit came–选择debug和发布模式 测试7
2015年07月20日18:11:30
一、利用PCH文件引用项目中的常用文件
1.新建pch文件
2.写如下代码

#import "AppDelegate.h"//引入常用的头文件
#define ABC 10//导入常用的宏
#ifdef DEBUG //引入自定义的控制台输出

#define HMLog(...) NSLog(__VA_ARGS__);
#else
#define HMLog(...) 
#endif

3.以上写的代码只对oc文件有效,当出现C文件时
要用以下代码括一下啊

#ifdef __OBJC__
...
#endif

4.修改路径
步骤:项目→BuildSettings→搜索PrefixHeader→修改路径(绝对路径)
验证:编译验证
5.切换调试和发布运行模式:在运行/停止旁的图标(Edit Scheme)→ Run → info → Build Configuration → Debug/release
6.为了适应其他人电脑的项目用相对路径 方法如下
直接写:自己所在的文件夹/自己
二、UIApplication常用属性
1.获取UIApplication的单例对象
UIApplication *app = [UIApplication sharedApplication];
2.宏的命名规范两种书写方式:
如属性(username)
1)USER_NAME
2)kUserName
3.设置提醒数字

#define kios8 [[UIDevice currentDevice].systemVersion floatValue]>= 8.0

//判断用户手机的版本

if(kios8)
{
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
    [app registerUserNotificationSettings:setting];
}
app.applicationIconBadgeNumber = 100;

4.设置网络指示器
app.networkActivityIndicatorVisible = YES;
5.设置状态栏的样式和可见性

// 状态栏交给Application管理
View controller-based status bar appearance  =  NO 
注意:iOS6使用Application管理
iOS 7 8使用控制器管理

// 控制器管理
状态栏的样式
- (UIStatusBarStyle)preferredStatusBarStyle;
状态栏的可见性
- (BOOL)prefersStatusBarHidden;

// UIApplication管理
// 通过application来设置状态栏的可见性
// app.statusBarHidden = YES;
// [app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

// 通过application来设置状态栏的样式
// app.statusBarStyle = UIStatusBarStyleLightContent;
// [app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];

6.UIApplication有个功能十分强大的openURL:方法
- (BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有

打电话
UIApplication *app = [UIApplication sharedApplication];
[app openURL:[NSURL URLWithString:@"tel://10086"]];

发短信
[app openURL:[NSURL URLWithString:@"sms://10086"]];

发邮件
[app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];

打开一个网页资源
[app openURL:[NSURL URLWithString:@"http://ios.itcast.cn"]];

打开其他app程序
三、ApplicationDelegate代理
为什么要引入这个代理
答:所有移动操作系统都有个致命的弱点:app很容易受到干扰。受到干扰时,会产生一些系统事件,这时app会通知它的delegate对象,让delegate代理来处理这些系统事件。
但是有两个问题
1)为什么app自己不能处理这些系统事件
2)app让代理处理事件系统的时候,它自己在干什么?
// 程序第一次加载完毕

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

// 程序已经进入后台
// 保存数据
- (void)applicationDidEnterBackground:(UIApplication*)application

// 程序将要进入前台
// 恢复数据
- (void)applicationWillEnterForeground:(UIApplication*)application

// 程序将要失去焦点 - 不能交互
- (void)applicationWillResignActive:(UIApplication*)application

// 程序已经获取焦点 - 可以交互
- (void)applicationDidBecomeActive:(UIApplication*)application

// 程序挂了
// 注意:1.用户主动关闭 2.系统因为内存不够关闭了程序
- (void)applicationWillTerminate:(UIApplication*)application

// 程序接收到内存警告
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

四、程序启动的完整过程
1.main函数

2.UIApplicationMain
* 创建UIApplication对象
* 创建UIApplication的delegate对象
* 绑定

3.delegate对象开始处理(监听)系统事件

4.加载info.plist

5.(有storyboard)
* 加载最主要的storyboard
* 创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口

6.(没有storyboard)
* 创建和设置UIWindow的rootViewController
* 显示窗口
五、UIWindow的引入
理论分析
1)UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow

2)iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了

3)一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow

4)也就说,没有UIWindow,就看不见任何UI界面

代码分析
1.Main.storyboard封装了UIWindow的创建显示过程代码,所以要研究它,先删除自动生成的Main.storyboard,到app代理去创建这个过程。
2.在代理方法:didFinishLaunchingWithOptions(验证创建过程)
创建window
self.window = [[UIVindow] alloc] initWithFram:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
创建控制器
HMViewController *vc = [[HMViewController alloc] init];
方式1
[self.window addSubview:vc.view];
方式2
self.window.rootViewController = vc;
[self.window setRootViewController:vc];//推荐
[self.window makeKeyAndVisible];
2.设置多个主窗口,真正的主窗口是最后一个创建的那个

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window1 = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

//设置主窗口
[self.window makeKeyWindow];
[self.window1 makeKeyWindow];
//获取所有的窗口
NSArray *array = [UIApplication sharedApplication].windows;
//获取主窗口
UIWindow *win = [UIApplication sharedApplication].keyWindow;
3.可以创建不同大小的window,并各自添加不同的控件

//self.window1 = [[UIVindow alloc] initWithFrame:CGRectMake(100,100,200,200)];
self.window1.backgroundColor = [UIColor orangeColor];
[UITextField *text = [UITextField alloc] initWithFrame:CGRectMake(20,0,100,40)];
text.borderStyle = UITextBorderStyleRoundedRect;
[self.window addSubview:text];
[self.window1 makeKeyAndVisible];
NSLog(@"%@",text.window);

六、控制器的多种创建方式
在didFinishLaunchingWithOptions
1)直接:HMViewController *vc = [[HMViewController] alloc] init];
2)用Storyboard:

首先:创建一个storyborad对象
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Test" bundle:nil];
创建箭头所指向的控制器:HMViewController *vc = [sb instantiateViewController];
创建指定标识的控制器:HMViewController *vc = [sb instantiateViewControllerWithIndentifier:@"Testid"];

3)用xib 但是要连线 File‘s Owner 设置控制器类文件
XibViewController *vc = [[XibViewController alloc] initWithNibName:@“XibViewController” bundle:nil];

self.window.rootViewController = vc;
七、模拟没有sb的项目是为了证实原来的那个自动生成的mainsb隐藏了什么动作
模拟之前:先删掉mainsb和对应的类控制器

// 1.创建window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.拿到stotyboard
UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// 3.拿到箭头所指向的控制器
ViewController* vc = [sb instantiateInitialViewController];
// 4.设置根控制器
self.window.rootViewController = vc;
// 让window显示
[self.window makeKeyAndVisible];

一个Main隐藏了这些代码…
八、控制器View的多种创建方式

// 1.没有同名xib情况下(不用sb 和 xib) alloc init
// 默认的view 是透明的
// CZViewController* vc = [[CZViewController alloc] init];

// 2.通过 storyboard 创建
// 默认的view 就是 sb 的view
// UIStoryboard* sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
// CZViewController* vc = [sb instantiateInitialViewController];

// 3.有指定xib情况下创建
// 默认加载的时 files owner的view的连线的view
//    CZViewController* vc = [[CZViewController alloc] initWithNibName:@"Test" bundle:nil];

// 4.有同名xib情况
// 默认加载的时 files owner的view的连线的view
// 但是创建的时候 不用使用 initwithnibname的方法
// CZViewController* vc = [[CZViewController alloc] init];

// 5.有同名去掉controll的情况
// 优先级会比 有同名 xib 的情况高
// CZViewController* vc = [[CZViewController alloc] init];

// 6.loadView
// 写在控制器中 用来重写控制器的view 

关键点:优先级loadView>storyboard>nibName>xib

结论:
1>创建xib的时候,勾选创建
2>alloc init 创建的控制器view是透明的
3>通过sb加载的view和sb描述的一样
4>重写控制器的loadView不会去加载sb,但是一定得有自定义语句,否则会造成死循环
原因:当控制器view没有创建的时候的就会调用loadView去创建控制器view,若没有创建语句,self.view 就不能获得控制器view,就会调用loadView去创建,形成死循环

2015年07月21日18:31:56
一、导航控制器的简单使用 在app代理方法:didFinishLaunchingWithOptions
1、用UIViewController初始化导航控制器

UIViewController *vc1 = [[UIViewController] alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewContrl:vc1];

2.设置window的根控制器为导航控制器
self.window.rootViewController = nav;//导航控制器继承自UIViewController
3.向导航控制器添加view控制器 压栈 (重点)
[nav pushViwController:vc2 animated:NO];
4.获取栈中的子控制器
NSArray *array = nav.viewControllers;
NSArray *array1 = nav.childViewControllers;
区别:
nav.viewControllers = @[vc1,vc2];
nav.childViewControllers = @[vc1,vc2];//错误 这个属性是只读的
5.显示UIview
[self.window makeKeyAndVisible];
6.输出导航条
NSLog(@”%@”,nav.navigationBar);
二、导航控制器的小例子分析
功能分析
1.三个页面跳转
2.第一个页面的导航栏的设置(标题,左边,右边)
3.返回item的设置
代码分析(去掉Main.storyboard设置,新建window)
1.三个页面对应三个控制器三个xib
2.第一个页面的压入在app代理方法:didFinishLaunchingWithOptions
1)新建窗口
self.window = [[[UIWindow alloc] init] initWithFrame:UIScreen mainScreen].bounds];
2)创建子控制器
OneViewController *one = [[OneViewConroller alloc] init];
3)用子控制器初始化导航控制器

UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:one];

4)用导航控制器设置窗口根控制器
self.window.rootViewController = nav;
5)显示视图
[self.window makeKeyAndVisible]
6)返回
return YES;
3.丰满各个子控制器视图
app代理方法:didFinishLaunchingWithOptions执行完后就来执行根控制器的viewDidLoad方法
第一个跳转页面
1)xib设计:标题 跳转按钮
2)实现类:viewDidLoad方法
[super viewDidLoad];
self.title = @”导航栏标题”;
self.navigationItem.title = @”同上”;
自定义返回到这个页面的返回item

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@“返回” style:UIBarButtonItemStylePlain target:nil action:nil];

self.navigationItem.backBarButtonItem = item;

自定义左边的按钮
self.navigationItem.rightBarButtonItem = item1;
self.navigationItem.rightBarButtonItems = @[item1,item2];

自定义标题视图

self.navigationItem.titleView = [[UIview alloc] init];

自定义标题字体样式

NSDictionary* attr = @{NSFontAttributeName:[UIFont systemFontOfSize:10],NSForegroundColorAttributeName:[UIColor redColor]};
[self.navigationController.navigationBar setTitleTextAtrributes:attr];

设置右边bar字体颜色

[self.navigationController.navigationBar setTintColor:[UIColor redColor]];

设置bar背景颜色
[self.navigationController.navigatioBar setBackgroundColor:[UIColor redColor]];

设置barTintColor

[self.navigationController.navigationBar setBarTintColor:[UIColor redColor]];

设置背景是否半透明化(高斯模糊)
self.navigationController.navigationBar.translucent = NO;

给bar左边设置一个原始图片

UIImage* image = [UIImage imageNamed:@"set"];
image = [image imageWithRenderingMode:UIImageRenderingModelAlwaysOriginal];
UIBarButtonItem *item5 = [[UIBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStylePlain target:nil aciton:nil];

self.navigationItem.leftBarButtonItem = item5;

3)按钮的触发事件的处理

-(IBAction)jump2one:(id)sender
{
    UINavigationController *nav = self.navigationController;//获取导航控制器
    TwoViewController *vc = [[TwoViewController alloc] init];//创建跳转目标
    [nav pushViewController:vc animated:YES];//压栈 跳转
}

第二个跳转页面
1)UI设计:标题 按钮
2)按钮的触发事件的处理 同上
第三个跳转页面
1)UI设计:标题 返回到上一个 回到第n个返 返回第一个的按钮
2)返回到上一个按钮的事件处理

-(IBAction)back:(id)sender
{
    //navigationController是UIView对象的一个UINavigationController属性
    UINavigationController *nav = self.navigationController;
    [nav popViewControllerAnimated:YES];
}

3)返回到第n个的事件处理
[nav popToViewController:nav.viewControllers[i] animated:YES];
4)返回第一个的事件处理
[nav popToRootViewControllerAnimated:YES];

猜你喜欢

转载自blog.csdn.net/yu_4074/article/details/46977463