Objective-C utility class using C functions in iOS

24 / Nov / 2015 by Abhayam Rastogi 0 comments

Introduction

Like C, I would like to use C functions in  Objective-C class so i could use C functions anywhere anytime without using class name.

Defining function: Function definition in C programming language is as follows −

return_type function_name(parameter list)
{
    body of the function
}

In Objective-C, you can create a Objective-C class having NSObject superclass.

I am creating a CommonFunctions.h & CommonFunctions.m as given below:

Header File (CommonFunctions.h)

#import <UIKit/UIKit.h>

#pragma mark - NSUserDefaults

void saveDataWithKey(id data,NSString *key);
id dataWithKey(NSString *key);

#pragma mark - Notification

void removeNotification(id sender);
void postNotification(NSString *name, id object);
void addNotification(NSString *name, id sender,SEL selector,id object);

#pragma mark - NSFileManager

BOOL isFileExist(NSString* path);
void removePath(NSString* path);
void createDirectory(NSString* path);
BOOL isDirectoryExist(NSString* path);

#pragma mark - String

// function to check empty or null string
BOOL nonEmptyString(NSString *string);

#pragma mark - Custom

void customBackButtonForController(id controller);
void startShake (UIView* view);
void shakeEnded (NSString * animationID, BOOL finished, void *context);
void showAlert (NSString * title,NSString * message);
//Function to calculate height for label according to text at runtime
CGSize dynamicHeightForLabel(NSString *text,float width, UIFont *font);

 

Implementation File (CommonFunctions.m)

#import "CommonFunctions.h"

#pragma mark - NSUserDefaults

void saveDataWithKey(id data,NSString *key){

    NSData *data_ = [NSKeyedArchiver archivedDataWithRootObject:data];
    [[NSUserDefaults standardUserDefaults] setObject:data_ forKey:key];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

id dataWithKey(NSString *key){

    NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
    if(!data)
        return nil;
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

#pragma mark - Notification

void removeNotification(id sender){
    [[NSNotificationCenter defaultCenter] removeObserver:sender];
}
void postNotification(NSString *name, id object){
    [[NSNotificationCenter defaultCenter] postNotificationName:name object:object];
}
void addNotification(NSString *name, id sender,SEL selector,id object){
    [[NSNotificationCenter defaultCenter] addObserver:sender 
                                             selector:selector 
                                                 name:name 
                                               object:object];
}

#pragma mark - NSFileManager

BOOL isFileExist(NSString* path){

    return  [[NSFileManager defaultManager] fileExistsAtPath:path];
}

void removePath(NSString* path){

    [[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}

void createDirectory(NSString* path){

    [[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
}

BOOL isDirectoryExist(NSString* path){

    BOOL is = NO;
    if([[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&is])
        return YES;
    return NO;
}

#pragma mark- String

BOOL nonEmptyString(NSString *string){
  if (string == (id)[NSNull null] || string.length == 0){
        return NO;
    }else{
        NSMutableString *inputString = [NSMutableString stringWithString:string];
        [inputString replaceOccurrencesOfString:@" " 
                                     withString:@"" 
                                        options:NSCaseInsensitiveSearch 
                                          range:NSMakeRange(0, [string length])];
        
        if(inputString.length == 0)
            return NO;
        return YES;
    }

}    

#pragma mark- Custom

void startShake (UIView* view){

    CGAffineTransform leftShake = CGAffineTransformMakeTranslation(-5, 0);
    CGAffineTransform rightShake = CGAffineTransformMakeTranslation(0, 0);
    
    view.transform = leftShake;  // starting point
    
    [UIView beginAnimations:@"shake_button" context:(__bridge void *)(view)];
    [UIView setAnimationRepeatAutoreverses:YES]; // important
    [UIView setAnimationRepeatCount:3];
    [UIView setAnimationDuration:0.06];
    
    shakeEnded(@"shake_button", YES, (__bridge void *)(view));
    view.transform = rightShake; // end here & auto-reverse
    [UIView commitAnimations];
}

void shakeEnded (NSString * animationID, BOOL finished, void *context){

    if (finished) {
        UIView* item = (__bridge UIView *)context;
        item.transform = CGAffineTransformIdentity;
    }
}

void showAlert (NSString * title,NSString * message){

    UIAlertView *alerView = [[UIAlertView alloc]initWithTitle:title 
                                                      message:message 
                                                     delegate:nil 
                                            cancelButtonTitle:nil 
                                            otherButtonTitles:@"Ok", nil];
    [alerView show];
}

void customBackButtonForController (UIViewController *controller){
    
    UIButton *customBackBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    customBackBtn.frame = CGRectMake(0, 0, 22, 22);
    BUTTONIMAGE(customBackBtn, "backArrow");
    BUTTON_ADD_TARGET(customBackBtn,controller,backBtnAciton:);
    UIBarButtonItem *leftBarBtnItem = [[UIBarButtonItem alloc] initWithCustomView:customBackBtn];
    [controller.navigationItem setLeftBarButtonItem:leftBarBtnItem animated:YES];
}

CGSize dynamicHeightForLabel(NSString *text,float width, UIFont *font){
   
    CGSize constrainedSize = CGSizeMake(width, CGFLOAT_MAX);
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:font,
    NSFontAttributeName,nil];
    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:text
    attributes:attributesDictionary];
    CGRect requiredHeight = [string boundingRectWithSize:constrainedSize
    options:NSStringDrawingUsesLineFragmentOrigin context:nil];
    
    if (requiredHeight.size.width > width) {
        requiredHeight = CGRectMake(0, 0, width, requiredHeight.size.height);
    }
    return requiredHeight.size;
}

How to call CommonFunctions.h methods

Simple like other Objective-C class import “CommonFunctions.h” class in required controller or views and access methods by calling method name directly.

Example:

#import "CommonFunctions.h"

NSString *string = @"string";

if(notEmptyString(string)){
  NSLog(@"string is not empty");
}else{
  NSLog(@"string is empty or null");
}

 

Download

You can download the CommonFunctions.h & CommonFunctions.m from here.

FOUND THIS USEFUL? SHARE IT

Leave a Reply

Your email address will not be published. Required fields are marked *