1. 程式人生 > >iOS常用的封裝方法

iOS常用的封裝方法

  做開發也有一段時間了,看了好多大神的程式碼,總體感覺他們寫的程式碼簡潔,好看,然而在對比下我寫的程式碼,混亂,無序,簡直不堪入目啊!

                總體來說大神們的程式碼封裝的都比較好,對一個專案要重複用到的程式碼他們都會封裝起來,這樣用起來的時候也比較方便,也不用重複的去寫這段程式碼了!

               下面是我在開發中封裝到的一些經常使用的一些方法,如有寫錯的地方或者大家有更好的方法,還請大家給我提出來,大家一起學習!謝謝!

1.常用控制元件方法的封裝:

#import <Foundation/Foundation.h>

#import <UIKit/UIKit.h>

@interface MyUtil : NSObject

//建立標籤的方法

+ (UILabel *)createLabelFrame:(CGRect)frame text:(NSString *)text textColor:(UIColor *)textColor textAlignment:(NSTextAlignment)textAlignment numberOfLines:(NSInteger)numberOfLines;

+ (UILabel *)createLabelFrame:(CGRect)frame text:(NSString *)text color:(UIColor *)textColor;

//建立按鈕的方法

+ (UIButton *)createBtnFrame:(CGRect)frame title:(NSString *)title bgImageName:(NSString *)bgImageName target:(id)target action:(SEL)action;

//建立圖片檢視的方法

+ (UIImageView *)createImageViewFrame:(CGRect)frame imageName:(NSString *)imageName;

//型別的英文轉化成中文

+ (NSString *)transferCateName:(NSString *)name;

@end

方法的實現:

#import"MyUtil.h"

@implementation MyUtil

+(UILabel *)createLabelFrame:(CGRect)frame text:(NSString *)text textColor:(UIColor *)textColor textAlignment:(NSTextAlignment)textAlignment numberOfLines:(NSInteger)numberOfLines

{

    UILabel *label = [[UILabelallocinitWithFrame:frame];

    label.text = text;

    label.textAlignment = textAlignment;

    label.textColor = textColor;

    label.numberOfLines = numberOfLines;

    return label;

}

+(UILabel *)createLabelFrame:(CGRect)frame text:(NSString *)text color:(UIColor *)textColor

{

    return [selfcreateLabelFrame:frame text:texttextColor:textColortextAlignment:NSTextAlignmentCenternumberOfLines:1];

}

+(UIButton *)createBtnFrame:(CGRect)frame title:(NSString *)title bgImageName:(NSString *)bgImageName target:(id)target action:(SEL)action

{

    UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeCustom];

    btn.frame = frame;

    [btnsetTitle:title forState:UIControlStateNormal];

    [btnsetTitleColor:[UIColorblackColorforState:UIControlStateNormal];

    [btnsetBackgroundImage:[UIImageimageNamed:bgImageName] forState:UIControlStateNormal];

    [btnaddTarget:target action:actionforControlEvents:UIControlEventTouchUpInside];

    return btn;

}

+(UIImageView *)createImageViewFrame:(CGRect)frame imageName:(NSString *)imageName

{

    UIImageView *imageView = [[UIImageViewallocinitWithFrame:frame];

    imageView.image = [UIImageimageNamed:imageName];

    return imageView;

}

+ (NSString *)transferCateName:(NSString *)name

{

    if ([name isEqualToString:@"Business"]) {

       return @"商業";

    }elseif ([name isEqualToString:@"Weather"]) {

       return @"天氣";

    }elseif ([name isEqualToString:@"Tool"]) {

       return @"工具";

    }elseif ([name isEqualToString:@"Travel"]) {

       return @"旅行";

    }elseif ([name isEqualToString:@"Sports"]) {

       return @"體育";

    }elseif ([name isEqualToString:@"Social"]) {

       return @"社交";

    }elseif ([name isEqualToString:@"Refer"]) {

       return @"參考";

    }elseif ([name isEqualToString:@"Ability"]) {

       return @"效率";

    }elseif ([name isEqualToString:@"Photography"]) {

       return @"攝影";

    }elseif ([name isEqualToString:@"News"]) {

       return @"新聞";

    }elseif ([name isEqualToString:@"Gps"]) {

       return @"導航";

    }elseif ([name isEqualToString:@"Music"]) {

       return @"音樂";

    }elseif ([name isEqualToString:@"Life"]) {

       return @"生活";

    }elseif ([name isEqualToString:@"Health"]) {

       return @"健康";

    }elseif ([name isEqualToString:@"Finance"]) {

       return @"財務";

    }elseif ([name isEqualToString:@"Pastime"]) {

       return @"娛樂";

    }elseif ([name isEqualToString:@"Education"]) {

       return @"教育";

    }elseif ([name isEqualToString:@"Book"]) {

       return @"書籍";

    }elseif ([name isEqualToString:@"Medical"]) {

       return @"醫療";

    }elseif ([name isEqualToString:@"Catalogs"]) {

       return @"商品指南";

    }elseif ([name isEqualToString:@"FoodDrink"]) {

       return @"美食";

    }elseif ([name isEqualToString:@"Game"]) {

       return @"遊戲";

    }elseif([name isEqualToString:@"All"]){

       return @"全部";

    }

    return nil;

}

@end

2.裁剪圖片方法的封裝:

- (UIImage*)clipImage:(UIImage*)bigImage inRect:(CGRect)rect

{

   CGImageRef imageRef =CGImageCreateWithImageInRect(bigImage.CGImage, rect);

   UIImage *image = [UIImageimageWithCGImage:imageRef];

   return image;

}

實現方法:

            //建立圖片顯示

            CGRect frame =CGRectMake(100*j,100*i, 100,100);

            UIImage *tmpImage = [selfclipImage:image inRect:frame];

3.封裝的下載方法:

#import <Foundation/Foundation.h>

@classMyDownloader;

@protocol MyDownloaderDelegate <NSObject>

- (void)downloadFail:(MyDownloader *)downloader error:(NSError *)error;

- (void)downloadFinish:(MyDownloader *)downloader;

@end

@interface MyDownloader :NSObject<NSURLConnectionDelegate,NSURLConnectionDataDelegate>

- (void)downloadWithURLString:(NSString *)urlString;

@property (nonatomic,readonly)NSData *receiveData;

@property (nonatomic,assign)NSInteger type;

@property (nonatomic,weak)id<MyDownloaderDelegate> delegate;

@end

實現方法:

#import "MyDownloader.h"

@implementation MyDownloader

{

    NSURLConnection *_conn;

    NSMutableData *_receiveData;

}

-(instancetype)init

{

    self = [superinit];

    if (self) {

        _receiveData = [NSMutableDatadata];

    }

    returnself;

}

-(void)downloadWithURLString:(NSString *)urlString

{

    NSURL *url = [NSURLURLWithString:urlString];

    NSURLRequest *request = [NSURLRequestrequestWithURL:url];

    _conn = [NSURLConnectionconnectionWithRequest:request delegate:self];

}

#pragma mark - NSURLConnection代理

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    [self.delegatedownloadFail:selferror:error];

}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    [_receiveDatasetLength:0];

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    [_receiveDataappendData:data];

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    [self.delegatedownloadFinish:self];

}

4.block封裝的下載方法:

#import <Foundation/Foundation.h>

typedefvoid (^FINISHBLOCK)(NSData *receiveData);

typedefvoid (^FAILBLOCK)(NSError *error);

@interface MyDownloader :NSObject<NSURLConnectionDataDelegate,NSURLConnectionDelegate>

{

    NSMutableData *_receiveData;

    NSURLConnection *_conn;

    //下載成功結束

    //void (^_myFinishBlock)(NSData *data);

    FINISHBLOCK _myFinishBlock;

    //下載失敗時呼叫

    //void (^_myFailBlock)(NSError *error);

    FAILBLOCK _myFailBlock;

}

//下載的方法

/*

 @param urlString:下載的字串連結

 @param finishBlock:下載成功時呼叫的程式碼塊

 @param failBlock:下載失敗時呼叫的程式碼塊

 */

/*

- (void)downloadWithURLString:(NSString *)urlString

                       finish:(void (^) (NSData *receiveData))finishBlock

                         fail:(void (^)(NSError *error))failBlock;

 */

- (void)downloadWithURLString:(NSString *)urlString

                       finish:(FINISHBLOCK)finishBlock

                         fail:(FAILBLOCK)failBlock;

@end

實現方法:

#import "MyDownloader.h"

@implementation MyDownloader

-(instancetype)init

{

    if (self = [superinit]) {

        _receiveData = [NSMutableDatadata];

    }

    returnself;

}

-(void)downloadWithURLString:(NSString *)urlString finish:(void (^)(NSData *))finishBlock fail:(void (^)(NSError *))failBlock

{

    if (_myFinishBlock != finishBlock) {

        _myFinishBlock = finishBlock;

    }

    if (_myFailBlock != failBlock) {

        _myFailBlock = failBlock;

    }

    //下載

    NSURL *url = [NSURLURLWithString:urlString];

    NSURLRequest *request = [NSURLRequestrequestWithURL:url];

    _conn = [NSURLConnectionconnectionWithRequest:request delegate:self];

}

#pragma mark - NSURLConnection代理

-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{

    if (_myFailBlock) {

        _myFailBlock(error);

    }

}

-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    [_receiveDatasetLength:0];

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

    [_receiveDataappendData:data];

}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection

{

    if (_myFinishBlock) {

        _myFinishBlock(_receiveData);

    }

}

@end



5.資料庫的封裝:

#import <Foundation/Foundation.h>

#import "UserModel.h"

@interface DBManager :NSObject

+ (DBManager *)sharedManager;

//

- (void)addUserModel:(UserModel *)model;

//

- (void)deleteUserWithUserId:(int)userId;

//

//根據userId修改資料(userId是不變化的)

- (void)updateUserModel:(UserModel *)model userId:(int)userId;

//

- (NSArray *)searchAllUsers;

@end

實現方法:

#import "DBManager.h"

#import "FMDatabase.h"

/*

使用資料庫時

 1.匯入fmdatabase第三方庫

 2.匯入系統libsqlite3.dylib

 3.fmdatabase不支援ARC,五個.m檔案新增-fno-objc-arc

 */

@implementation DBManager

{

    //資料庫檔案的關聯物件

    FMDatabase *_dataBase;

}

+(DBManager *)sharedManager

{

    staticDBManager *manager = nil;

    @synchronized(self){

        if (manager ==nil) {

            manager = [[DBManagerallocinit];

        }

    }

    return manager;

}

-(instancetype)init

{

    if (self = [superinit]) {

        //建立資料庫檔案操作物件

        [selfcreateDatabase];

    }

    returnself;

}

- (void)createDatabase

{

    //資料庫檔案的路徑

    NSString *path = [NSHomeDirectory()stringByAppendingPathComponent:@"Documents/user.sqlite"];

    NSLog(@"%@",path);

    //1、初始化FMDataBase物件

    _dataBase = [[FMDatabaseallocinitWithPath:path];

    //2、開啟資料庫

    BOOL isOpen = [_dataBaseopen];

    if (isOpen) {

        //3、建立表格

        //NSData -> blob

        //int -> integer

        //NSString -> varchar(255)

        //if not exists:如果表格不存在,建立表格

        //存在就不建立

        //主鍵:primary key,值唯一,不能重複

        //主鍵自動增長:autoincrement

        NSString *createSql =@"create table if not exists user (userId integer primary key autoincrement, userName varchar(255), age integer,headImage blob)";

        BOOL ret = [_dataBaseexecuteUpdate:createSql];

        if (ret) {

            NSLog(@"表格建立成功");

        }else{

            NSLog(@"%@",_dataBase.lastErrorMessage);

        }

    }else{

        NSLog(@"資料庫開啟失敗");

    }

}

//判斷是否存在

- (BOOL)isExists:(NSString *)userName

{

    NSString *sql =@"select * from user where userName = ?";

    FMResultSet *rs = [_dataBaseexecuteQuery:sql, userName];

    if ([rsnext]) {

        returnYES;

    }

    returnNO;

}

//增加一條記錄

-(void)addUserModel:(UserModel *)model

{

    //判斷使用者名稱是否存在

    BOOL isExists = [selfisExists:model.userName];

    if (isExists) {

        NSLog(@"使用者名稱已存在");

        return;

    }

    //?是佔位符,表示要傳一個值

    NSString *insertSql =@"insert into user (userName, age, headImage) values (?, ? ,?)";

    //圖片轉換成二進位制

    NSData *imageData =UIImagePNGRepresentation(model.headImage);

    BOOL ret = [_dataBaseexecuteUpdate:insertSql,model.userName,@(model.age), imageData];

    if (!ret) {

        NSLog(@"%@",_dataBase.lastErrorMessage);

    }

}

//查詢

-(NSArray *)searchAllUsers

{

    NSString *selectSql =@"select * from user";

    FMResultSet *rs = [_dataBaseexecuteQuery:selectSql];

    NSMutableArray *array = [NSMutableArrayarray];

    while ([rsnext]) {

        UserModel *model = [[UserModelallocinit];

        model.userId = [rsintForColumn:@"userId"];

        model.userName = [rsstringForColumn:@"userName"];

        model.age = [rsintForColumn:@"age"];

        NSData *data = [rsdataForColumn:@"headImage"];

        model.headImage = [UIImageimageWithData:data];

        [array addObject:model];

    }

    return array;

}

//刪除

-(void)deleteUserWithUserId:(int)userId

{

    NSString *deleteSql =@"delete from user where userId=?";

    BOOL ret = [_dataBaseexecuteUpdate:deleteSql, @(userId)];

    if (!ret) {

        NSLog(@"%@",_dataBase.lastErrorMessage);

    }

}

//修改

-(void)updateUserModel:(UserModel *)model userId:(int)userId

{

    NSString *sql =@"update user set userName=?, age=?, headImage=? where userId=?";

    //圖片轉換成二進位制資料

    NSData *data =UIImagePNGRepresentation(model.headImage);

    BOOL ret = [_dataBaseexecuteUpdate:sql, model.userName,@(model.age), data,@(userId)];

    if (!ret) {

        NSLog(@"%@",_dataBase.lastErrorMessage);

    }

}

@end

6.UIAlertController的封裝方法:

- (void)createAlertViewText:(NSString *)text
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"溫馨提示" message:text preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"確定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        
    }];
    [alertController addAction:okAction];
    [alertController addAction:cancelAction];
    [self presentViewController:alertController animated:YES completion:nil];
}

實現方法:

- (void)searchBtnClick
{
    [_licenseNumber resignFirstResponder];
    _dp.hidden = YES;
    _lineView.hidden = YES;
    _endBtn.hidden = YES;
    _showOrHidden = YES;
    NSMutableArray *licens = ((AppDelegate *)[UIApplication sharedApplication].delegate).licen;
    for (int i=0; i<licens.count; i++) {
        
        if ([_licenseNumber.text isEqualToString: licens[i]]) {
            [self createData];
        }
    }
    if ([_licenseNumber.text  isEqual: @""])
    {
        [self createAlertViewText:@"車牌號不能為空"];
    }


    if ([_dateBtn.titleLabel.text  isEqual: @"查詢日期"])
    {
        [self createAlertViewText:@"請選擇日期"];
    }


}

相關推薦

iOS常用數學方法

(1)向上取整  extern float ceilf(float); extern double ceil(double); extern long double ceill(long double); 示例: ceilf(3.9)=4 ceilf(3.1)=4 ceilf(

iOS 常用函式方法

rand() —-隨機數 abs() / labs() —-整數絕對值 fabs() / fabsf() / fabsl() —-浮點數絕對值 floor() / floorf() / floorl() —-向下取整 ceil() / ceilf() /

iOS常用封裝方法

  做開發也有一段時間了,看了好多大神的程式碼,總體感覺他們寫的程式碼簡潔,好看,然而在對比下我寫的程式碼,混亂,無序,簡直不堪入目啊!                 總體來說大神們的程式碼封裝的都比較好,對一個專案要重複用到的程式碼他們都會封裝起來,這樣用起來的時候也比較方便,也不用重複的去寫這段程

web前端常用封裝方法

1、放大鏡 //頁面載入完畢後執行 window.onload = function () { var oDemo = document.getElementById('demo'); var oMark = documen

ios 常用的一些方法和注意點 componentsSeparatedByString componentsJoinedByString以及NSURl和NSURLComponents

將string字串轉換為array陣列  NSArray  *array = [Str componentsSeparatedByString:@","]; 注意://componentsSeparatedByString 這個方法有一個bug 當被切割的字串是 @“”

iOS常用方法——一個好用的獲取導航欄高度和Tabbar高度的分類

開發中經常需要知道導航欄(系統)的高度和Tabbar的高度,一般是用來計算在ViewController中的位置和高度,我們可以寫一個UIVIewController的分類,這樣在呼叫的時候就很方便。程式碼如下: #import "UIViewController+MYViewCon

iOS常用方法——UIWebView全屏顯示的實現

專案中載入webView,導航欄由web端做的話,客戶端就需要隱藏掉導航欄。這個時候顯示出來的頁面,在頂部會出現狀態列為空白的問題。底部也會多出空白,即: - (void)viewDidLoad { [super viewDidLoad]; // Do any add

web前端,常用js方法封裝

搜尋總結了一些前端日常開發中,常用的一些方法封裝 var myJs = { /* * 格式化日期 * @param dt 日期物件 * @returns {string} 返回值是格式化的字串日期 */ getDate

vue專案常用方法封裝

vue全家桶構建專案過程中,需要經常呼叫一些方法,比如axios的請求,下面就將經常用的方法進行封裝 import Vue from 'vue' import axios from 'axios' import qs from 'qs' import Route

iOS 常用的儲存圖片的兩個方法

第一種、就是儲存到系統相簿中,這個也是最簡單的,當然使用者想要訪問系統相簿也是需要許可權的,需要使用者同意。 在Plist檔案加入下面的鍵值對就可以了 key : Privacy - Photo Library Usage Description          val

iOS常用方法——WKWebView與h5互動的實現

隨著前端開發的強大,原生與h5的互動用的也越來越多。 為什麼選用WKWebView,我們可以做一個對比,同一個web頁面,用UIWebView載入和用WKWebView來載入,記憶體佔用情況很容易看出來,回到原生頁面之後,UIWebView對應的記憶體也不會降

iOS常用設計模式——工廠方法(簡單工廠模式,工廠方法模式, 抽象工廠模式)

1. 簡單工廠模式 如何理解簡單工廠,工廠方法, 抽象工廠三種設計模式? 簡單工廠的生活場景,賣早點的小攤販,他給你提供包子,饅頭,地溝油烙的煎餅等,小販是一個工廠,它生產包子,饅頭,地溝油烙的煎餅。該場景對應的UML圖如下所示: 圖1:簡單工廠模式UML圖 簡單

常用js方法封裝

常用js方法封裝 var myJs = { /* * 格式化日期 * @param dt 日期物件 * @returns {string} 返回值是格式化的字串日期 */ getDates: function(dt) {

iOS [UIApplication sharedApplication] openURL等常用方法使用例如:打電話、定位等

1、打電話 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://電話號碼"]]; 2、發簡訊 [[UIApplication sharedApplication] openURL

IOS常用延遲呼叫,後臺呼叫,主執行緒呼叫方法

/延遲呼叫 [selfperformSelector:@selector(doSomeThing:) withObject:nilafterDelay:1.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int

iOS開發中一些常用方法

1.壓縮圖片#pragma mark 處理圖片 - (void)useImage:(UIImage *)image { NSLog(@"with-----%f heught-----%f",image.size.width,image.size.height);

iOS常用的兩種延時的方法

     //1     [selfperformSelector:@selector(obj:) withObject:@"可傳引數"afterDelay:3]; //2 程式碼直接bl

JavaScript常用工具方法封裝

typeof turn spin between radi change flex ret first 因為工作中經常用到這些方法,所有便把這些方法進行了總結。 JavaScript 1. type 類型判斷 isString (o) { //是否字符串 retu

iOS常用方法——WKWebView快取清理的實現

WKWebView是iOS8之後出現的,相較於UIWebView,WKWebView佔用的記憶體更小,還有一些其他的優化。但是如果我們不去主動清理webView產生的快取,兩者都會存在快取這個問題。比如說一個網頁改了一些內容,如果不清理快取,可能很長一段時間我們

前端進階技術:JavaScript 和 CSS 常用工具方法封裝教程!

www splay replace hasclass flow none oot ngs 蘋果手機 因為工作中經常用到這些方法,所有便把這些方法進行了總結,希望能對大家有幫助。提醒大家一點,學習前端,基礎真的很重要,切勿急於求成! JavaScript type 類型判