你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS中的運用啟動道理和嵌套模子開辟示例詳解

iOS中的運用啟動道理和嵌套模子開辟示例詳解

編輯:IOS開發綜合

法式啟動道理和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;
}

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463138.png (320×147)

2)設置聯網指導器的可見性

@property(nonatomic,getter=i.networkActivityIndicatorVisible) BOOL.networkActivityIndicatorVisible;

代碼和後果:

  //設置指導器的聯網動畫
    app.networkActivityIndicatorVisible=YES;

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463231.png (320×159)

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的設置
代碼:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463233.png (696×208)

代碼:

//經由過程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署理來處置這些體系事宜。

感化:當被打斷的時刻,告訴署理進入到後台。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463222.png (687×377)

每次新建完項目,都有個帶有“AppDelegate”字眼的類,它就是UIApplication的署理,NJAppDelegate默許曾經遵照了UIApplicationDelegate協定,曾經是UIApplication的署理。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463289.png (902×378)

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法式啟動道理

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463212.png (716×363)

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文件和項目構造圖

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463235.png (833×587)

解釋:這是一個嵌套模子的示例

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

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615463205.png (320×495)

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中的運用啟動道理和嵌套模子開辟示例詳解】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved