法式啟動道理和UIApplication
1、UIApplication
1.簡略引見
(1)UIApplication對象是運用法式的意味,一個UIApplication對象就代表一個運用法式。
(2)每個運用都有本身的UIApplication對象,並且是單例的,假如試圖在法式中新建一個UIApplication對象,那末將報錯提醒。
(3)經由過程[UIApplicationsharedApplication]可以取得這個單例對象
(4) 一個IOS法式啟動後創立的第一個對象就是UIApplication對象,且只要一個(經由過程代碼獲得兩個UIApplication對象,打印地址可以看出地址是雷同的)。
(5)應用UIApplication對象,能停止一些運用級其余操作
2.運用級其余操作示例:
1)設置運用法式圖標右上角的白色提示數字(如QQ新聞的時刻,圖標下面會顯示1,2,3條新信息等。)
@property(nonatomic) NSInteger applicationIconBadgeNumber;
代碼完成和後果:
- (void)viewDidLoad
{
[super viewDidLoad];
//創立並添加一個按鈕
UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 100, 60, 30)];
[btn setTitle:@"按鈕" forState:UIControlStateNormal];
[btn setBackgroundColor:[UIColor brownColor]];
[btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}
-(void)onClick
{
NSLog(@"按鈕點擊事宜");
//毛病,只能有一個獨一的UIApplication對象,不克不及再停止創立
// UIApplication *app=[[UIApplication alloc]init];
//經由過程sharedApplication獲得該法式的UIApplication對象
UIApplication *app=[UIApplication sharedApplication];
app.applicationIconBadgeNumber=123;
}
2)設置聯網指導器的可見性
@property(nonatomic,getter=i.networkActivityIndicatorVisible) BOOL.networkActivityIndicatorVisible;
代碼和後果:
//設置指導器的聯網動畫
app.networkActivityIndicatorVisible=YES;
3)治理狀況欄
從IOS7開端,體系供給了2種治理狀況欄的方法
a.經由過程UIViewController治理(每個UIViewController都可以具有本身分歧的狀況欄).
在IOS7中,默許情形下,狀況欄都是由UIViewController治理的,UIViewController完成以下辦法便可以輕松治理狀況欄的可見性和款式
狀況欄的款式 - (UIStatusBarStyle)preferredStatusBarStyle;
狀況欄的可見性 -(BOOL)prefeXmlRss/ target=_blank class=infotextkey>XmlRss/ target=_blank class=infotextkey>RsstatusBarHidden;
#pragma mark-設置狀況欄的款式
-(UIStatusBarStyle)preferredStatusBarStyle
{
//設置為白色
//return UIStatusBarStyleLightContent;
//默許為黑色
return UIStatusBarStyleDefault;
}
#pragma mark-設置狀況欄能否隱蔽(否)
-(BOOL)prefeXmlRss/ target=_blank class=infotextkey>XmlRss/ target=_blank class=infotextkey>RsstatusBarHidden
{
return NO;
}
b.經由過程UIApplication治理(一個運用法式的狀況欄都由它同一治理)
假如想應用UIApplication來治理狀況欄,起首得修正Info.plist的設置
代碼:
代碼:
//經由過程sharedApplication獲得該法式的UIApplication對象
UIApplication *app=[UIApplication sharedApplication];
app.applicationIconBadgeNumber=123;
//設置指導器的聯網動畫
app.networkActivityIndicatorVisible=YES;
//設置狀況欄的款式
//app.statusBarStyle=UIStatusBarStyleDefault;//默許(黑色)
//設置為白色+動畫後果
[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];
//設置狀況欄能否隱蔽
app.statusBarHidden=YES;
//設置狀況欄能否隱蔽+動畫後果
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
c.彌補
既然兩種都可以對狀況欄停止治理,那末甚麼時刻該用甚麼呢?
假如狀況欄的款式只設置一次,那就用UIApplication來停止治理;
假如狀況欄能否隱蔽,款式紛歧樣那就用掌握器停止治理。
UIApplication來停止治理有額定的利益,可以供給動畫後果。
4)openURL:辦法
UIApplication有個功效非常壯大的openURL:辦法
- (BOOL)openURL:(NSURL*)url;
openURL:辦法的部門功效有
打德律風 UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];
發短信 [app openURL:[NSURLURLWithString:@"sms://10086"]];
發郵件 [app openURL:[NSURLURLWithString:@"mailto://[email protected]"]];
翻開一個網頁資本 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];
翻開其他app法式 openURL辦法,可以翻開其他APP。
URL彌補:
URL:同一資本定位符,用來獨一的表現一個資本。
URL格局:協定頭://主機地址/資本途徑
收集資本:http/ ftp等 表現百度上一張圖片的地址 http://www.百度.com/images/20140603/abc.png
當地資本:file:///users/apple/desktop/abc.png(主機地址省略)
2、UIApplication Delegate
1.簡略解釋
一切的挪動操作體系都有個致命的缺陷:app很輕易遭到打攪。好比一個來電或許鎖屏會招致app進入後台乃至被終止。
還有許多其它相似的情形會招致app遭到攪擾,在app遭到攪擾時,會發生一些體系事宜,這時候UIApplication會告訴它的delegate對象,讓delegate署理來處置這些體系事宜。
感化:當被打斷的時刻,告訴署理進入到後台。
每次新建完項目,都有個帶有“AppDelegate”字眼的類,它就是UIApplication的署理,NJAppDelegate默許曾經遵照了UIApplicationDelegate協定,曾經是UIApplication的署理。
2.署理辦法
#import "YYAppDelegate.h"
@implementation YYAppDelegate
// 當運用法式啟動終了的時刻就會挪用(體系主動挪用)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"didFinishLaunchingWithOptions");
return YES;
}
// 行將掉去運動狀況的時刻挪用(掉去核心, 弗成交互)
- (void)applicationWillResignActive:(UIApplication *)application
{
NSLog(@"ResignActive");
}
// 從新獲得核心(可以或許和用戶交互)
- (void)applicationDidBecomeActive:(UIApplication *)application
{
NSLog(@"BecomeActive");
}
// 運用法式進入後台的時刻挪用
// 普通在該辦法中保留運用法式的數據, 和狀況
- (void)applicationDidEnterBackground:(UIApplication *)application
{
NSLog(@"Background");
}
// 運用法式行將進入前台的時刻挪用
// 普通在該辦法中恢復運用法式的數據,和狀況
- (void)applicationWillEnterForeground:(UIApplication *)application
{
NSLog(@"Foreground");
}
// 運用法式行將被燒毀的時刻會挪用該辦法
// 留意:假如運用法式處於掛起狀況的時刻沒法挪用該辦法
- (void)applicationWillTerminate:(UIApplication *)application
{
}
// 運用法式吸收到內存正告的時刻就會挪用
// 普通在該辦法中釋放失落不須要的內存
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
NSLog(@"MemoryWarning");
}
@end
運用法式普通有五個狀況:官方文檔app.states
3、法式啟動道理
UIApplicationMain
main函數中履行了一個UIApplicationMain這個函數
intUIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
argc、argv:直接傳遞給UIApplicationMain停止相干處置便可
principalClassName:指定運用法式類名(app的意味),該類必需是UIApplication(或子類)。假如為nil,則用UIApplication類作為默許值
delegateClassName:指定運用法式的署理類,該類必需遵照UIApplicationDelegate協定
UIApplicationMain函數會依據principalClassName創立UIApplication對象,依據delegateClassName創立一個delegate對象,並將該delegate對象賦值給UIApplication對象中的delegate屬性
接著會樹立運用法式的Main Runloop(事宜輪回),停止事宜的處置(起首會在法式終了後挪用delegate對象的application:didFinishLaunchingWithOptions:辦法)
法式正常加入時UIApplicationMain函數才前往
#import <UIKit/UIKit.h>
#import "YYAppDelegate.h"
int main(int argc, char * argv[])
{
@autoreleasepool {
// return UIApplicationMain(argc, argv, nil, NSStringFromClass([YYAppDelegate class]));
// return UIApplicationMain(argc, argv, @"UIApplication", NSStringFromClass([YYAppDelegate class]));
/*
argc: 體系或許用戶傳入的參數個數
argv: 體系或許用戶傳入的現實參數
1.依據傳入的第三個參數創立UIApplication對象
2.依據傳入的第四個發生創立UIApplication對象的署理
3.設置方才創立出來的署理對象為UIApplication的署理
4.開啟一個事宜輪回
*/
return UIApplicationMain(argc, argv, @"UIApplication", @"YYAppDelegate");
}
}
體系進口的代碼和參數解釋:
argc:體系或許用戶傳入的參數
argv:體系或用戶傳入的現實參數
1.依據傳入的第三個參數,創立UIApplication對象
2.依據傳入的第四個發生創立UIApplication對象的署理
3.設置方才創立出來的署理對象為UIApplication的署理
4.開啟一個事宜輪回(可以懂得為外面是一個逝世輪回)這個時光輪回是一個隊列(先輩先出)先添加出來的先處置
ios法式啟動道理
4、法式啟動的完全進程
1.main函數
2.UIApplicationMain
* 創立UIApplication對象
* 創立UIApplication的delegate對象
3.delegate對象開端處置(監聽)體系事宜(沒有storyboard)
* 法式啟動終了的時刻, 就會挪用署理的application:didFinishLaunchingWithOptions:辦法
* 在application:didFinishLaunchingWithOptions:中創立UIWindow
* 創立和設置UIWindow的rootViewController
* 顯示窗口
3.依據Info.plist取得最重要storyboard的文件名,加載最重要的storyboard(有storyboard)
* 創立UIWindow
* 創立和設置UIWindow的rootViewController
* 顯示窗口
應用嵌套模子完成的一個簡略汽車圖標展現法式
1、plist文件和項目構造圖
解釋:這是一個嵌套模子的示例
2、代碼示例:
YYcarsgroup.h文件代碼:
//
// YYcarsgroup.h
// 07-汽車展現(高等)
//
// Created by apple on 14-5-28.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface YYcarsgroup : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,strong)NSArray *cars;
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)carsgroupWithDict:(NSDictionary *)dict;
@end
YYcarsgroup.m文件代碼:
//
// YYcarsgroup.m
// 07-汽車展現(高等)
//
// Created by apple on 14-5-28.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYcarsgroup.h"
#import "YYcars.h"
@implementation YYcarsgroup
-(instancetype)initWithDict:(NSDictionary *)dict
{
if (self=[super init]) {
//嵌套的字典轉模子
self.title=dict[@"title"];
//留意
NSArray *dictcars=dict[@"cars"];
//像上面如許寫可以進步機能
NSMutableArray *arrayM=[NSMutableArray arrayWithCapacity:dictcars.count];
for (NSDictionary *dict in dictcars) {
YYcars *yycars=[[YYcars alloc]initWithDict:dict];
[arrayM addObject:yycars];
}
// 賦值存儲模子的數組給屬性
self.cars=arrayM;
}
return self;
}
+(instancetype)carsgroupWithDict:(NSDictionary *)dict
{
return [[self alloc]initWithDict:dict];
}
@end
YYcars.h文件
//
// YYcars.h
// 07-汽車展現(高等)
//
// Created by apple on 14-5-28.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface YYcars : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
-(instancetype)initWithDict:(NSDictionary *)dict;
+(instancetype)carsWithDict:(NSDictionary *)dict;
@end
YYcars.m文件
//
// YYcars.m
// 07-汽車展現(高等)
//
// Created by apple on 14-5-28.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYcars.h"
@implementation YYcars
-(instancetype)initWithDict:(NSDictionary *)dict
{
if (self=[super init]) {
self.name=dict[@"name"];
self.icon=dict[@"icon"];
}
return self;
}
+(instancetype)carsWithDict:(NSDictionary *)dict
{
return [[self alloc]initWithDict:dict];
}
@end
YYViewController.m文件
//
// YYViewController.m
// 07-汽車展現(高等)
//
// Created by apple on 14-5-28.
// Copyright (c) 2014年 itcase. All rights reserved.
//
#import "YYViewController.h"
#import "YYcarsgroup.h"
#import "YYcars.h"
@interface YYViewController ()<UITableViewDataSource>
@property (strong, nonatomic) IBOutlet UITableView *tableview;
@property(nonatomic,strong) NSArray *car;
@end
@implementation YYViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableview.rowHeight=60.f;
self.tableview.dataSource=self;
NSLog(@"%d",self.car.count);
}
#pragma mark- 完成懶加載
//1.從包中讀取數據
//2.字典轉模子
//3.前往cars
-(NSArray *)car
{
if (_car==nil) {
NSString *fullpath= [[NSBundle mainBundle]pathForResource:@"cars_total.plist" ofType:nil];
NSArray *arrayM=[NSArray arrayWithContentsOfFile:fullpath];
NSMutableArray *carsarray=[NSMutableArray array];
for (NSDictionary *dict in arrayM) {
YYcarsgroup *carsgroup=[YYcarsgroup carsgroupWithDict:dict];
[carsarray addObject:carsgroup];
}
_car=[carsarray copy];
}
return _car;
}
#pragma mark- 完成tableview的數據展現
//1.設置數據源,遵照協定
//2.前往組
//3.前往行
//4.每組每行對應的數據
//4.1去緩存中去取cell
//4.2若沒有,則創立cell,並蓋印
//4.3設置cell的數據
//4.4前往cell
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return self.car.count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
YYcarsgroup *carsgroup=self.car[section];
return carsgroup.cars.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier=@"car";
//4.1去緩存中去取cell
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
//4.2若沒有,則創立cell,並蓋印
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
//4.3設置cell的數據
//設置對應的組
YYcarsgroup *carsgroup=self.car[indexPath.section];
//設置對應的行
YYcars *yycars=carsgroup.cars[indexPath.row];
cell.imageView.image=[UIImage imageNamed:yycars.icon];
cell.textLabel.text=yycars.name;
//4.4前往cell
return cell;
}
//設置每組的題目
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
YYcarsgroup *carsgroup=self.car[section];
return carsgroup.title;
}
//設置索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
//應用kvc掏出一切的題目
NSArray *title=[self.car valueForKeyPath:@"title"];
return title;
}
//隱蔽狀況欄
-(BOOL)prefeXmlRss/ target=_blank class=infotextkey>RsstatusBarHidden
{
return YES;
}
@end
完成後果:
3、留意點
1.設置索引
代碼以下:
//設置索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
//應用kvc掏出一切的題目
NSArray *title=[self.car valueForKeyPath:@"title"];
return title;
}
2.cell的機能優化
代碼以下:
static NSString *identifier=@"car";
//4.1去緩存中去取cell
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
//4.2若沒有,則創立cell,並蓋印
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
【iOS中的運用啟動道理和嵌套模子開辟示例詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!