欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

iOS開發(fā)中常見的項(xiàng)目文件與MVC結(jié)構(gòu)優(yōu)化思路解析

 更新時(shí)間:2015年12月21日 09:38:06   作者:文頂頂  
這篇文章主要介紹了iOS開發(fā)中常見的項(xiàng)目文件與MVC結(jié)構(gòu)優(yōu)化思路解析,示例代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下

常見的項(xiàng)目文件介紹
一、項(xiàng)目文件結(jié)構(gòu)示意圖

2015122193326513.png (262×488)

二、文件介紹

1.products文件夾:主要用于mac電腦開發(fā)的可執(zhí)行文件,ios開發(fā)用不到這個(gè)文件
2.frameworks文件夾主要用來(lái)放依賴的框架
3.test文件夾是用來(lái)做單元測(cè)試的
4.常用的文件夾(項(xiàng)目名稱文件夾)
(1)XXXinfo.plist文件(在該項(xiàng)目中為  01-常見文件-Info.plist)
1)簡(jiǎn)單說(shuō)明
是配置文件,該文件對(duì)工程做一些運(yùn)行期的配置,非常重要,不能刪除。
在舊版本xcode創(chuàng)建的工程中,這個(gè)配置文件的名字就叫做info.plist。
注意:因此在載入自己準(zhǔn)備的plist文件的時(shí)候,不要以info命名。
 
2)配置文件的屬性介紹:

2015122193357627.png (939×448)

bundle display name:
應(yīng)用程序顯示名稱。如果要修改桌面上顯示的文件名稱,只要修改此處就可以了。(需要先刪除原始的程序,然后清空一下工程,因?yàn)槌绦蛴芯彺妫?br /> bundle identifer:
唯一標(biāo)識(shí)符(唯一的標(biāo)識(shí)著一個(gè)應(yīng)用程序,為了保證程序的唯一性,通常把域名倒過(guò)來(lái)寫)
Bundle versions string, short和bundle versions
 兩個(gè)都用來(lái)表示應(yīng)用程序的版本,前面的版本是正式的版本,后面的為內(nèi)部版本,即公司內(nèi)部開發(fā)的版本。要求提示:上傳app的時(shí)候,后面更新的版本必須比之前的版本大。
main storyboard file base name
最主要的storyboard
 
有兩種方式修改plist配置文件:
第一種方式即在如圖所示的界面對(duì)配置信息進(jìn)行修改。
第二種方式直接點(diǎn)擊工程,可以通過(guò)可視化界面進(jìn)行設(shè)置。

2015122193423949.png (809×590)

補(bǔ)充說(shuō)明:
a.應(yīng)用程序支持的旋轉(zhuǎn)方向。四個(gè)方向,垂直-不支持顛倒-左-右(最多只支持三個(gè)方向)
b.plist文件打開之后是xml文件。和字典一樣,是通過(guò)鍵值對(duì)的形式來(lái)保存數(shù)據(jù)。在xml文件中,添加了CF前綴
 
 (2)pch文件(在該項(xiàng)目中為  01-常見文件-Prefix.pch)
1)簡(jiǎn)單說(shuō)明
保存的內(nèi)容能夠被項(xiàng)目中的其他所有原文件共享。
通常情況下宏文件的處理,需要添加import導(dǎo)入頭文件。以后可以把這個(gè)宏定義在這個(gè)文件中,不再需要導(dǎo)入頭文件
 
2)應(yīng)用場(chǎng)景:
1.用來(lái)定義一些全局的宏,
2.用來(lái)導(dǎo)入一些全局都能用到的頭文件。
3.用來(lái)自定義NSlog,很消耗資源。(幾乎是最消耗的),在發(fā)布的時(shí)候要把所有的打印都去掉。
(補(bǔ)充:在開發(fā)中,分為兩個(gè)階段。
一是開發(fā)調(diào)試階段,需要打印log調(diào)試程序,如果程序處于調(diào)試階段,系統(tǒng)會(huì)為我們定義一個(gè)名稱叫做DEBUG的宏。
二是發(fā)布階段:不需要打印log,因?yàn)閘og很占用資源,并且用戶看不懂log,如果程序處理發(fā)布階段,會(huì)去除這個(gè)宏。
難道在發(fā)布的時(shí)候要一個(gè)一個(gè)把NSlog都注釋掉?然后在開發(fā)第二版,第三版的時(shí)候,又要把所有注釋掉的NSlog都打開?
對(duì)于這個(gè)問(wèn)題,在.pch文件中自定義NSlog就可以很好的解決。)
 
 3)自定義NSlog
在做開發(fā)的時(shí)候可以先打開pch文件,看看公司中有沒有自定義NSlog。

復(fù)制代碼 代碼如下:

// __OBJC__這個(gè)宏,在所有的.m和.mm文件中默認(rèn)就定義了這個(gè)宏
#ifdef __OBJC__
// 如果這個(gè)全局的頭文件或者宏只需要在.m或者.mm文件中使用,
// 請(qǐng)把該頭文件或宏寫到#ifdef __OBJC__ 中
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>

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

#endif


說(shuō)明:…指接收可變參數(shù)

補(bǔ)充:
_OBJC_這個(gè)宏,在所有的.m和.mm文件中,都默認(rèn)包含了這個(gè)宏,就默認(rèn)會(huì)編譯下面那兩句
條件編譯語(yǔ)句,如果有這個(gè)宏,就編譯下面的語(yǔ)句。

復(fù)制代碼 代碼如下:

    #import <UIKit/UIKit.h>

    #import <Foundation/Foundation.h>


如果這個(gè)全局的頭文件或者宏,只需要在.m或.mm文件中使用,請(qǐng)把該文件或宏寫到#ifdef_ODBC_中用。
注意點(diǎn):建議寫在條件編譯里面(注意#endif)
infoplist.strings的文件,跟info.plist文件的本地化相關(guān)

從代碼的逐步優(yōu)化看MVC

一、要求

要求完成下面一個(gè)小的應(yīng)用程序。

2015122193456923.png (649×338)

二、一步步對(duì)代碼進(jìn)行優(yōu)化

注意:在開發(fā)過(guò)程中,優(yōu)化的過(guò)程是一步一步進(jìn)行的。(如果一個(gè)人要吃五個(gè)包子才能吃飽,那么他是否直接吃第五個(gè),前面四個(gè)不用吃就飽了?)

1.完成基本要求的代碼(使用了字典轉(zhuǎn)模型和xib連線)

(1)文件結(jié)構(gòu)

2015122193514667.png (264×419)

(2)主要代碼

  字典轉(zhuǎn)模型部分:

 YYappInfo.h頭文件

復(fù)制代碼 代碼如下:

//
//  YYappInfo.h
//  12-視圖改進(jìn)(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文件
復(fù)制代碼 代碼如下:

//
//  YYappInfo.m
//  12-視圖改進(jìn)(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進(jìn)行了關(guān)聯(lián),三個(gè)屬性均進(jìn)行了連線) 

復(fù)制代碼 代碼如下:

//
//  YYappInfoView.h
//  12-視圖改進(jìn)(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


主要功能實(shí)現(xiàn)部分:

YYViewController.m文件

復(fù)制代碼 代碼如下:

//
//  YYViewController.m
//  12-視圖改進(jìn)(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


復(fù)制代碼 代碼如下:

//開發(fā)思路
//1.加載plist文件(字典轉(zhuǎn)模型提供接口)
//2.使用xib文件完成單個(gè)的view
//3.計(jì)算坐標(biāo),使用for循環(huán)把view展現(xiàn)到界面上
//4.優(yōu)化代碼
@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中的數(shù)據(jù)
        NSArray *arryM=[[NSBundle mainBundle]loadNibNamed:@"appInfoxib" owner:nil options:nil];
        YYappInfoView *appinfoview=[arryM firstObject];
        //設(shè)置位置
        appinfoview.frame=CGRectMake(appviewX, appviewY, appviewW, appviewH);
        //設(shè)置值
        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.對(duì)1進(jìn)行優(yōu)化(把數(shù)據(jù)呈現(xiàn)部分封裝到視圖)

說(shuō)明:在1的基礎(chǔ)上尋找還會(huì)有那些可以優(yōu)化的部分

1)改進(jìn)思路:

(1)1中主文件的66~67行對(duì)控件屬性的設(shè)置能否拿到視圖中進(jìn)行?

(2)1中61~62行是從xib文件中讀取信息的操作,且和主控制器沒有什么太大的關(guān)聯(lián),能否把它也封裝到視圖中進(jìn)行?

(3)當(dāng)上述兩個(gè)步驟完成后,主文件69行以后的按鈕操作和按鈕單擊事件就顯得很突兀,放在主控制器中已經(jīng)不再合適,是否可以把它放到視圖中進(jìn)行處理

2)按照上述思路優(yōu)化后的代碼如下:

  優(yōu)化視圖,在視圖部分之對(duì)外提供一個(gè)接口,把數(shù)據(jù)的處理封裝在內(nèi)部

YYappInfoView.h文件代碼:

復(fù)制代碼 代碼如下:

//
//  YYappInfoView.h
//  12-視圖改進(jìn)(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;
//只對(duì)外開放一個(gè)數(shù)據(jù)接口
+(instancetype)appInfoViewWithappInfo:(YYappInfo *)appinfo;
@end


YYappInfoView.m文件代碼

說(shuō)明:該文件中的屬性和click等均已做了連線的操作。

復(fù)制代碼 代碼如下:

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

#import "YYappInfoView.h"
#import "YYappInfo.h"
//私有擴(kuò)展,把屬性拿進(jìn)來(lái)
@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


復(fù)制代碼 代碼如下:

@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


優(yōu)化后的主控制器部分

YYViewController.m文件代碼

復(fù)制代碼 代碼如下:

//
//  YYViewController.m
//  12-視圖改進(jìn)(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


復(fù)制代碼 代碼如下:

@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;
       
        /*思路:
         要達(dá)到的效果 appinfoview.appinfo=appinfo;
        優(yōu)化后即變成  appinfoview.appinfo=self.apps[i];
        要進(jìn)行上面代碼的操作,需要在視圖中新增加一個(gè)appinfo類的屬性,這樣數(shù)據(jù)——》視圖的轉(zhuǎn)換即可以不需要在主控制器中完成,讓程序結(jié)構(gòu)一目了然
         */
        YYappInfo *appinfo=self.apps[i];
        YYappInfoView *appinfoview=[YYappInfoView appInfoViewWithappInfo:appinfo];
        //設(shè)置位置
        appinfoview.frame=CGRectMake(appviewX, appviewY, appviewW, appviewH);
        //添加
        [self.view addSubview:appinfoview];
    }
}
@end


3.對(duì)2進(jìn)一步優(yōu)化(把數(shù)據(jù)處理部分拿到模型中去進(jìn)行)

(1)思路:把字典轉(zhuǎn)模型部分的數(shù)據(jù)處理操作,拿到模型中去處理,這樣外界不需要再關(guān)心數(shù)據(jù)處理的內(nèi)部細(xì)節(jié)。

(2)優(yōu)化后的代碼如下

YYappInfo.h文件中向外開放一個(gè)接口,返回一個(gè)處理好的數(shù)組。

復(fù)制代碼 代碼如下:

//
//  YYappInfo.h
//  12-視圖改進(jìn)(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文件中的數(shù)據(jù)處理

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

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


復(fù)制代碼 代碼如下:

@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;
}

//把數(shù)據(jù)處理部分拿到模型中來(lái)處理
+(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


主控制器中不再需要關(guān)心數(shù)據(jù)處理的內(nèi)部細(xì)節(jié)

YYViewController.m文件現(xiàn)在只是負(fù)責(zé)模型和視圖之間的協(xié)調(diào)工作了,怎么樣?差不多了吧。

復(fù)制代碼 代碼如下:

//
//  YYViewController.m
//  12-視圖改進(jìn)(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


復(fù)制代碼 代碼如下:

@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


實(shí)現(xiàn)效果:

2015122193552422.png (640×960)

4.補(bǔ)充說(shuō)明

 View的封裝思路

(1) 如果一個(gè)view內(nèi)部的子控件比較多,一般會(huì)考慮自定義一個(gè)view,把它內(nèi)部子控件的創(chuàng)建屏蔽起來(lái),不讓外界關(guān)心

(2) 外界可以傳入對(duì)應(yīng)的模型數(shù)據(jù)給view,view拿到模型數(shù)據(jù)后給內(nèi)部的子控件設(shè)置對(duì)應(yīng)的數(shù)據(jù)

三、mvc機(jī)制簡(jiǎn)單說(shuō)明

2015122193639452.png (589×357)

說(shuō)明:

(1)在開發(fā)過(guò)程中,作為控制器處理的量級(jí)應(yīng)該很輕,不該操心的不操心。協(xié)調(diào)好模型和視圖就ok了,要學(xué)會(huì)當(dāng)一個(gè)好老板。

(2)三個(gè)部分各司其職,數(shù)據(jù)模型只負(fù)責(zé)數(shù)據(jù)的處理,視圖部分只負(fù)責(zé)把拿到的數(shù)據(jù)進(jìn)行顯示,兩個(gè)部分都是被動(dòng)的,等待著大管家控制器的調(diào)遣。

(3)在OC中,如果視圖和數(shù)據(jù)模型之間有通道,那控制器是否處于失控狀態(tài)呢?

相關(guān)文章

  • iOS中導(dǎo)航欄的基本使用匯總

    iOS中導(dǎo)航欄的基本使用匯總

    導(dǎo)航欄作為iOS開發(fā)的一大空控件來(lái)說(shuō),是非常的重要這篇文章主要給大家介紹了關(guān)于iOS中導(dǎo)航欄的基本使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決辦法(去掉15px空白間距)

    ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決

    這篇文章主要介紹了ios8 UITableView設(shè)置 setSeparatorInset UIEdgeInsetsZero不起作用的解決辦法(去掉15px空白間距)的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • iOS實(shí)現(xiàn)UIButton的拖拽功能

    iOS實(shí)現(xiàn)UIButton的拖拽功能

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)UIButton的拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 談?wù)刋Code9的新變化

    談?wù)刋Code9的新變化

    這篇文章主要介紹了談?wù)刋Code9的新變化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • iOS中GCD定時(shí)器詳解

    iOS中GCD定時(shí)器詳解

    ?CADisplayLink、NSTimer是基于RunLoop機(jī)制的,如果RunLoop的任務(wù)過(guò)于繁重,有可能會(huì)導(dǎo)致前兩個(gè)定時(shí)器不準(zhǔn)時(shí),這篇文章主要介紹了iOS中GCD定時(shí)器的相關(guān)知識(shí),需要的朋友可以參考下
    2013-02-02
  • IOS-MVC層讀取服務(wù)器接口JSON數(shù)據(jù)

    IOS-MVC層讀取服務(wù)器接口JSON數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了IOS-MVC層讀取服務(wù)器接口JSON數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • iOS tableView實(shí)現(xiàn)頂部圖片拉伸效果

    iOS tableView實(shí)現(xiàn)頂部圖片拉伸效果

    這篇文章主要為大家詳細(xì)介紹了iOS tableView實(shí)現(xiàn)頂部圖片拉伸效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 詳解IOS四種保存數(shù)據(jù)的方式

    詳解IOS四種保存數(shù)據(jù)的方式

    本篇文章主要介紹了OS四種保存數(shù)據(jù)的方式,現(xiàn)在分享給大家,也給大家做個(gè)參考。感興趣的小伙伴們可以參考一下。
    2016-11-11
  • iOS支付寶、微信、銀聯(lián)支付集成封裝調(diào)用(上)

    iOS支付寶、微信、銀聯(lián)支付集成封裝調(diào)用(上)

    本篇文章給大家分享了iOS支付寶、微信、銀聯(lián)支付集成封裝調(diào)用的相關(guān)代碼和實(shí)例,有興趣的朋友學(xué)習(xí)下。
    2018-04-04
  • 談?wù)刬OS中的幾種鎖

    談?wù)刬OS中的幾種鎖

    這篇文章主要介紹了談?wù)刬OS中的幾種鎖,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-11-11

最新評(píng)論