罕見的項目文件引見
1、項目文件構造表示圖
2、文件引見
1.products文件夾:重要用於mac電腦開辟的可履行文件,IOS開辟用不到這個文件
2.frameworks文件夾重要用來放依附的框架
3.test文件夾是用來做單位測試的
4.經常使用的文件夾(項目稱號文件夾)
(1)XXXinfo.plist文件(在該項目中為 01-罕見文件-Info.plist)
1)簡略解釋
是設置裝備擺設文件,該文件對工程做一些運轉期的設置裝備擺設,異常主要,不克不及刪除。
在舊版本xcode創立的工程中,這個設置裝備擺設文件的名字就叫做info.plist。
留意:是以在載入本身預備的plist文件的時刻,不要以info定名。
2)設置裝備擺設文件的屬性引見:
bundle display name:
運用法式顯示稱號。假如要修正桌面上顯示的文件稱號,只需修正此處便可以了。(須要先刪除原始的法式,然後清空一下工程,由於法式有緩存)
bundle identifer:
獨一標識符(獨一的標識著一個運用法式,為了包管法式的獨一性,平日把域名倒過去寫)
Bundle versions string, short和bundle versions
兩個都用來表現運用法式的版本,後面的版本是正式的版本,前面的為外部版本,即公司外部開辟的版本。請求提醒:上傳app的時刻,前面更新的版本必需比之前的版本年夜。
main storyboard file base name
最重要的storyboard
有兩種方法修正plist設置裝備擺設文件:
第一種方法即在如圖所示的界面臨設置裝備擺設信息停止修正。
第二種方法直接點擊工程,可以經由過程可視化界面停止設置。
彌補解釋:
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、請求
請求完成上面一個小的運用法式。
2、一步步對代碼停止優化
留意:在開辟進程中,優化的進程是一步一步停止的。(假如一小我要吃五個包子能力吃飽,那末他能否直接吃第五個,後面四個不消吃就飽了?)
1.完成根本請求的代碼(應用了字典轉模子和xib連線)
(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,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
完成後果:
4.彌補解釋
View的封裝思緒
(1) 假如一個view外部的子控件比擬多,普通會斟酌自界說一個view,把它外部子控件的創立屏障起來,不讓外界關懷
(2) 外界可以傳入對應的模子數據給view,view拿到模子數據後給外部的子控件設置對應的數據
3、mvc機制簡略解釋
解釋:
(1)在開辟進程中,作為掌握器處置的量級應當很輕,不應費心的不費心。調和好模子和視圖就ok了,要學會當一個好老板。
(2)三個部門各司其職,數據模子只擔任數據的處置,視圖部門只擔任把拿到的數據停止顯示,兩個部門都是主動的,期待著年夜管家掌握器的調遣。
(3)在OC中,假如視圖和數據模子之間有通道,那掌握器能否處於掉控狀況呢?
【iOS開辟中罕見的項目文件與MVC構造優化思緒解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!