你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開辟中罕見的項目文件與MVC構造優化思緒解析

iOS開辟中罕見的項目文件與MVC構造優化思緒解析

編輯:IOS開發綜合

罕見的項目文件引見
1、項目文件構造表示圖

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615464173.png (262×488)

2、文件引見

1.products文件夾:重要用於mac電腦開辟的可履行文件,IOS開辟用不到這個文件
2.frameworks文件夾重要用來放依附的框架
3.test文件夾是用來做單位測試的
4.經常使用的文件夾(項目稱號文件夾)
(1)XXXinfo.plist文件(在該項目中為  01-罕見文件-Info.plist)
1)簡略解釋
是設置裝備擺設文件,該文件對工程做一些運轉期的設置裝備擺設,異常主要,不克不及刪除。
在舊版本xcode創立的工程中,這個設置裝備擺設文件的名字就叫做info.plist。
留意:是以在載入本身預備的plist文件的時刻,不要以info定名。
 
2)設置裝備擺設文件的屬性引見:

2015122193357627.png (939×448)

bundle display name:
運用法式顯示稱號。假如要修正桌面上顯示的文件稱號,只需修正此處便可以了。(須要先刪除原始的法式,然後清空一下工程,由於法式有緩存)
bundle identifer:
獨一標識符(獨一的標識著一個運用法式,為了包管法式的獨一性,平日把域名倒過去寫)
Bundle versions string, short和bundle versions
 兩個都用來表現運用法式的版本,後面的版本是正式的版本,前面的為外部版本,即公司外部開辟的版本。請求提醒:上傳app的時刻,前面更新的版本必需比之前的版本年夜。
main storyboard file base name
最重要的storyboard
 
有兩種方法修正plist設置裝備擺設文件:
第一種方法即在如圖所示的界面臨設置裝備擺設信息停止修正。
第二種方法直接點擊工程,可以經由過程可視化界面停止設置。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615464127.png (809×590)

彌補解釋:
a.運用法式支撐的扭轉偏向。四個偏向,垂直-不支撐倒置-左-右(最多只支撐三個偏向)
b.plist文件翻開以後是XmlRss/ target=_blank class=infotextkey>Xml文件。和字典一樣,是經由過程鍵值對的情勢來保留數據。在XmlRss/ target=_blank class=infotextkey>Xml文件中,添加了CF前綴
 
 (2)pch文件(在該項目中為  01-罕見文件-Prefix.pch)
1)簡略解釋
保留的內容可以或許被項目中的其他一切原文件同享。
平日情形下宏文件的處置,須要添加import導入頭文件。今後可以把這個宏界說在這個文件中,不再須要導入頭文件
 
2)運用場景:
1.用來界說一些全局的宏,
2.用來導入一些全局都能用到的頭文件。
3.用來自界說NSlog,很消費資本。(簡直是最消費的),在宣布的時刻要把一切的打印都去失落。
(彌補:在開辟中,分為兩個階段。
一是開辟調試階段,須要打印log調試法式,假如法式處於調試階段,體系會為我們界說一個稱號叫做DEBUG的宏。
二是宣布階段:不須要打印log,由於log很占用資本,而且用戶看不懂log,假如法式處置宣布階段,會去除這個宏。
豈非在宣布的時刻要一個一個把NSlog都正文失落?然後在開辟第二版,第三版的時刻,又要把一切正文失落的NSlog都翻開?
關於這個成績,在.pch文件中自界說NSlog便可以很好的處理。)
 
 3)自界說NSlog
在做開辟的時刻可以先翻開pch文件,看看公司中有無自界說NSlog。

// __OBJC__這個宏,在一切的.m和.mm文件中默許就界說了這個宏
#ifdef __OBJC__
// 假如這個全局的頭文件或許宏只須要在.m或許.mm文件中應用,
// 請把該頭文件或宏寫到#ifdef __OBJC__ 中
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>

#ifdef DEBUG
#define NJLog(...) NSLog(__VA_ARGS__)
#else
#define NJLog(...)
#endif

#endif

解釋:…指吸收可變參數

彌補:
_OBJC_這個宏,在一切的.m和.mm文件中,都默許包括了這個宏,就默許會編譯上面那兩句
前提編譯語句,假如有這個宏,就編譯上面的語句。

    #import <UIKit/UIKit.h>

    #import <Foundation/Foundation.h>

假如這個全局的頭文件或許宏,只須要在.m或.mm文件中應用,請把該文件或宏寫到#ifdef_ODBC_頂用。
留意點:建議寫在前提編譯外面(留意#endif)
infoplist.strings的文件,跟info.plist文件的當地化相干

從代碼的慢慢優化看MVC

1、請求

請求完成上面一個小的運用法式。

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615464100.png (649×338)

2、一步步對代碼停止優化

留意:在開辟進程中,優化的進程是一步一步停止的。(假如一小我要吃五個包子能力吃飽,那末他能否直接吃第五個,後面四個不消吃就飽了?)

1.完成根本請求的代碼(應用了字典轉模子和xib連線)

(1)文件構造

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615464138.png (264×419)

(2)重要代碼

  字典轉模子部門:

 YYappInfo.h頭文件

//
//  YYappInfo.h
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface YYappInfo : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
@property(nonatomic,strong,readonly)UIImage *img;

-(instancetype)initWithDict:(NSDictionary *)dict;
/**工場辦法*/
+(instancetype)appInfoWithDict:(NSDictionary *)dict;
@end

YYappInfo.m文件

//
//  YYappInfo.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYappInfo.h"
@interface YYappInfo()
{
    UIImage *_img;
}
@end
@implementation YYappInfo
-(instancetype)initWithDict:(NSDictionary *)dict
{
    if (self=[super init]) {
        self.name=dict[@"name"];
        self.icon=dict[@"icon"];
    }
    return self;
}

+(instancetype)appInfoWithDict:(NSDictionary *)dict
{
    return [[self alloc]initWithDict:dict];
}

-(UIImage *)img
{
    _img=[UIImage imageNamed:self.icon];
    return _img;
}
@end

xib部門(YYappInfoView.h文件):

注:(xib視圖和YYappInfoView停止了聯系關系,三個屬性均停止了連線) 

//
//  YYappInfoView.h
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface YYappInfoView : UIView
@property (strong, nonatomic) IBOutlet UIImageView *appInfoViewimg;

@property (strong ,nonatomic) IBOutlet UILabel *appInfoViewlab;
@property (strong, nonatomic) IBOutlet UIButton *appInfoViewbtn;

@end

重要功效完成部門:

YYViewController.m文件

//
//  YYViewController.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYappInfo.h"
#import "YYappInfoView.h"

@interface YYViewController ()
@property(nonatomic,strong)NSArray *apps;
@end


//開辟思緒
//1.加載plist文件(字典轉模子供給接口)
//2.應用xib文件完成單個的view
//3.盤算坐標,應用for輪回把view展示到界面上
//4.優化代碼
@implementation YYViewController

//get辦法,懶加載
-(NSArray *)apps
{
    if (!_apps) {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
        NSArray * arrayM = [NSArray arrayWithContentsOfFile:path];
       
        NSMutableArray *appinfoarray=[NSMutableArray array];
        for (NSDictionary *dict in arrayM) {
            [appinfoarray addObject:[YYappInfo appInfoWithDict:dict]];
        }
        _apps = appinfoarray;
    }
    return _apps;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%d",self.apps.count);
   
    int totalloc = 3;
    CGFloat appviewW = 80;
    CGFloat appviewH = 90;
    CGFloat margin = (self.view.frame.size.width-totalloc*appviewW)/(totalloc+1);
   
    int count=self.apps.count;
    for (int i = 0; i < count; i++) {
        int row = i/totalloc;
        int loc = i%totalloc;
       
        CGFloat appviewX = margin + (margin + appviewW) * loc;
        CGFloat appviewY =  margin + (margin + appviewH) * row;
       
          YYappInfo *appinfo=self.apps[i];
       
        //拿出xib中的數據
        NSArray *arryM=[[NSBundle mainBundle]loadNibNamed:@"appInfoxib" owner:nil options:nil];
        YYappInfoView *appinfoview=[arryM firstObject];
        //設置地位
        appinfoview.frame=CGRectMake(appviewX, appviewY, appviewW, appviewH);
        //設置值
        appinfoview.appInfoViewimg.image=appinfo.img;
        appinfoview.appInfoViewlab.text=appinfo.name;
        //添加到視圖
        appinfoview.appInfoViewbtn.tag=i;
        [appinfoview.appInfoViewbtn addTarget:self action:@selector(Click:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:appinfoview];
    }
}
-(void)Click:(UIButton *)btn
{
    btn.enabled=NO;
    YYappInfo *appinfo=self.apps[btn.tag];
    UILabel *lab=[[UILabel alloc]initWithFrame:CGRectMake(60, 450, 200, 20)];
    [lab setBackgroundColor:[UIColor lightGrayColor]];
    [lab setTextAlignment:NSTextAlignmentCenter];
    [lab setText:[NSString stringWithFormat:@"%@勝利下載",appinfo.name]];
    [self.view addSubview:lab];
   
    lab.alpha=1.0;
    [UIView animateWithDuration:2.0 animations:^{
        lab.alpha=0;
    }completion:^(BOOL finished) {
        [lab removeFromSuperview];
    }];
}
@end

2.對1停止優化(把數據出現部門封裝到視圖)

解釋:在1的基本上尋覓還會有那些可以優化的部門

1)改良思緒:

(1)1中主文件的66~67行對控件屬性的設置可否拿到視圖中停止?

(2)1中61~62行是從xib文件中讀守信息的操作,且和主掌握器沒有甚麼太年夜的聯系關系,可否把它也封裝到視圖中停止?

(3)當上述兩個步調完成後,主文件69行今後的按鈕操作和按鈕單擊事宜就顯得很突兀,放在主掌握器中曾經不再適合,能否可以把它放到視圖中停止處置

2)依照上述思緒優化後的代碼以下:

  優化視圖,在視圖部門之對外供給一個接口,把數據的處置封裝在外部

YYappInfoView.h文件代碼:

//
//  YYappInfoView.h
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <UIKit/UIKit.h>
@class YYappInfo;
@interface YYappInfoView : UIView

//讀取
//+(instancetype)appInfoView;
//只對外開放一個數據接口
+(instancetype)appInfoViewWithappInfo:(YYappInfo *)appinfo;
@end

YYappInfoView.m文件代碼

解釋:該文件中的屬性和click等均已做了連線的操作。

//
//  YYappInfoView.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYappInfoView.h"
#import "YYappInfo.h"
//公有擴大,把屬性拿出去
@interface YYappInfoView ()
@property (strong, nonatomic) IBOutlet UIImageView *appInfoViewimg;
@property (strong ,nonatomic) IBOutlet UILabel *appInfoViewlab;
@property (strong, nonatomic) IBOutlet UIButton *appInfoViewbtn;
@property(strong,nonatomic)YYappInfo *appinfo;

@end


@implementation YYappInfoView

+(instancetype)appInfoView
{
    NSArray *arryM=[[NSBundle mainBundle]loadNibNamed:@"appInfoxib" owner:nil options:nil];
    YYappInfoView *appinfoview=[arryM firstObject];
    return appinfoview;
}

+(instancetype)appInfoViewWithappInfo:(YYappInfo *)appinfo
{
    YYappInfoView *appInfoView=[self appInfoView];
    appInfoView.appinfo=appinfo;
    return appInfoView;
}

-(void)setAppinfo:(YYappInfo *)appinfoc
{
    //這裡必定要記載變更
    _appinfo=appinfoc;
    self.appInfoViewimg.image=appinfoc.img;
    self.appInfoViewlab.text=appinfoc.name;
}
- (IBAction)Click {
   
    self.appInfoViewbtn.enabled=NO;
    //YYappInfo *appinfo=self.apps[];
   
    YYappInfo *appinfo=self.appinfo;
    UILabel *lab=[[UILabel alloc]initWithFrame:CGRectMake(60, 450, 200, 20)];
    [lab setBackgroundColor:[UIColor lightGrayColor]];
    [lab setTextAlignment:NSTextAlignmentCenter];
    [lab setText:[NSString stringWithFormat:@"%@勝利下載",appinfo.name]];
    //把lab添加到父視圖(即view中)
    [self.superview addSubview:lab];
   
    lab.alpha=1.0;
    [UIView animateWithDuration:2.0 animations:^{
        lab.alpha=0;
    }completion:^(BOOL finished) {
        [lab removeFromSuperview];
    }];
}


@end

優化後的主掌握器部門

YYViewController.m文件代碼

//
//  YYViewController.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYappInfo.h"
#import "YYappInfoView.h"

@interface YYViewController ()
@property(nonatomic,strong)NSArray *apps;
@end


@implementation YYViewController

-(NSArray *)apps
{
    if (!_apps) {
        NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
        NSArray * arrayM = [NSArray arrayWithContentsOfFile:path];
       
        NSMutableArray *appinfoarray=[NSMutableArray array];
        for (NSDictionary *dict in arrayM) {
            [appinfoarray addObject:[YYappInfo appInfoWithDict:dict]];
        }
        _apps = appinfoarray;
    }
    return _apps;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%d",self.apps.count);
   
    int totalloc = 3;
    CGFloat appviewW = 80;
    CGFloat appviewH = 90;
    CGFloat margin = (self.view.frame.size.width-totalloc*appviewW)/(totalloc+1);
   
    int count=self.apps.count;
    for (int i = 0; i < count; i++) {
        int row = i/totalloc;
        int loc = i%totalloc;
       
        CGFloat appviewX = margin + (margin + appviewW) * loc;
        CGFloat appviewY =  margin + (margin + appviewH) * row;
       
        /*思緒:
         要到達的後果 appinfoview.appinfo=appinfo;
        優化後即釀成  appinfoview.appinfo=self.apps[i];
        要停止下面代碼的操作,須要在視圖中新增長一個appinfo類的屬性,如許數據——》視圖的轉換便可以不須要在主掌握器中完成,讓法式構造了如指掌
         */
        YYappInfo *appinfo=self.apps[i];
        YYappInfoView *appinfoview=[YYappInfoView appInfoViewWithappInfo:appinfo];
        //設置地位
        appinfoview.frame=CGRectMake(appviewX, appviewY, appviewW, appviewH);
        //添加
        [self.view addSubview:appinfoview];
    }
}
@end

3.對2進一步優化(把數據處置部門拿到模子中去停止)

(1)思緒:把字典轉模子部門的數據處置操作,拿到模子中行止理,如許外界不須要再關懷數據處置的外部細節。

(2)優化後的代碼以下

YYappInfo.h文件中向外開放一個接口,前往一個處置好的數組。

//
//  YYappInfo.h
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface YYappInfo : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *icon;
@property(nonatomic,strong)UIImage *img;

-(instancetype)initWithDict:(NSDictionary *)dict;
/**工場辦法*/
+(instancetype)appInfoWithDict:(NSDictionary *)dict;
+(NSArray *)appinfoarray;
@end

YYappInfo.m文件中的數據處置

//
//  YYappInfo.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYappInfo.h"
@interface YYappInfo()
@end


@implementation YYappInfo
-(instancetype)initWithDict:(NSDictionary *)dict
{
    if (self=[super init]) {
        self.name=dict[@"name"];
        self.icon=dict[@"icon"];
    }
    return self;
}

+(instancetype)appInfoWithDict:(NSDictionary *)dict
{
    return [[self alloc]initWithDict:dict];
}

-(UIImage *)img
{
    _img=[UIImage imageNamed:self.icon];
    return _img;
}

//把數據處置部門拿到模子中來處置
+(NSArray *)appinfoarray
{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];
    NSArray * arrayM = [NSArray arrayWithContentsOfFile:path];
   
    NSMutableArray *appinfoarray=[NSMutableArray array];
    for (NSDictionary *dict in arrayM) {
        [appinfoarray addObject:[YYappInfo appInfoWithDict:dict]];
    }
    return appinfoarray;
}
@end

主掌握器中不再須要關懷數據處置的外部細節

YYViewController.m文件如今只是擔任模子和視圖之間的調和任務了,怎樣樣?差不多了吧。

//
//  YYViewController.m
//  12-視圖改良(1)
//
//  Created by apple on 14-5-25.
//  Copyright (c) 2014年 itcase. All rights reserved.
//

#import "YYViewController.h"
#import "YYappInfo.h"
#import "YYappInfoView.h"

@interface YYViewController ()
@property(nonatomic,strong)NSArray *apps;
@end



@implementation YYViewController

-(NSArray *)apps
{
    if (!_apps) {
        _apps=[YYappInfo appinfoarray];
    }
    return _apps;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    int totalloc = 3;
    CGFloat appviewW = 80;
    CGFloat appviewH = 90;
    CGFloat margin = (self.view.frame.size.width-totalloc*appviewW)/(totalloc+1);
   
    int count=self.apps.count;
    for (int i = 0; i < count; i++) {
       
        int row = i/totalloc;
        int loc = i%totalloc;
       
        CGFloat appviewX = margin + (margin + appviewW) * loc;
        CGFloat appviewY =  margin + (margin + appviewH) * row;
       
        YYappInfo *appinfo=self.apps[i];
        YYappInfoView *appinfoview=[YYappInfoView appInfoViewWithappInfo:appinfo];
        appinfoview.frame=CGRectMake(appviewX, appviewY, appviewW, appviewH);
        [self.view addSubview:appinfoview];
    }
}
@end

完成後果:

https://www.ios5.online/ios/UploadFiles_8070/201703/2017031615464193.png (640×960)

4.彌補解釋

 View的封裝思緒

(1) 假如一個view外部的子控件比擬多,普通會斟酌自界說一個view,把它外部子控件的創立屏障起來,不讓外界關懷

(2) 外界可以傳入對應的模子數據給view,view拿到模子數據後給外部的子控件設置對應的數據

3、mvc機制簡略解釋

2015122193639452.png (589×357)

解釋:

(1)在開辟進程中,作為掌握器處置的量級應當很輕,不應費心的不費心。調和好模子和視圖就ok了,要學會當一個好老板。

(2)三個部門各司其職,數據模子只擔任數據的處置,視圖部門只擔任把拿到的數據停止顯示,兩個部門都是主動的,期待著年夜管家掌握器的調遣。

(3)在OC中,假如視圖和數據模子之間有通道,那掌握器能否處於掉控狀況呢?

【iOS開辟中罕見的項目文件與MVC構造優化思緒解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

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