1. 程式人生 > >2015年07月21日第12天筆記

2015年07月21日第12天筆記

零碎知識
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];