2015年07月21日第12天笔记

来源:互联网 发布:数据挖掘 预测算法 编辑:程序博客网 时间:2024/05/16 15:23

零碎知识
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://12345@qq.com"]];打开一个网页资源[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.创建windowself.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];// 2.拿到stotyboardUIStoryboard* 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];

0 0
原创粉丝点击