Debug casting class


id DebugCastCpp(id sourceClass, Class cl)
{
	if (sourceClass != nil)
	{
		if (![sourceClass isKindOfClass: cl])
		{
            NSLog(@"%@", [NSString stringWithFormat: @"The cast is invalid (%@ to %@)", [sourceClass class], cl]);
			@throw [NSException exceptionWithName:@"CastException" reason: [NSString stringWithFormat: @"The cast is invalid (%@ to %@)", [sourceClass class], cl] userInfo:nil];
		}
	}
	
	return sourceClass;
}



Advertisements

Reverse NSString with Objective-C

Objective-C ensure you more possibilities when you’re manipulating existing objects like NSArray, NSString, NSDictionary etc. Some API functions can be done less code and some other snippets really mess.

Here is the reverse string block code

NSString *myString = @"abcdefghijklmnopqrstuvwxyz";
NSMutableString *reversedString = [NSMutableString stringWithCapacity:[myString length]];

[myString enumerateSubstringsInRange:NSMakeRange(0,[myString length]) 
                             options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences)
                          usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                            [reversedString appendString:substring];
                        }];

Before I learn reverse string block syntax I was doing this iterate trough all exist string length and after the range this string I was add these reversed string in a mutable array. Here is the my old approach

// first retrieve the text of textField1
NSString *myString = textField1.text;
NSMutableString *reversedString = [NSMutableString string];
NSInteger charIndex = [myString length];
while (myString && charIndex > 0) {
    charIndex--;
    NSRange subStrRange = NSMakeRange(charIndex, 1);
    [reversedString appendString:[myString substringWithRange:subStrRange]];
}

Scale to fill for UIColor pattern UIImage

Sometimes we need to scale to fill our images to fit in certain image view. This code snippet easly do this. I definitely recommend to you use UIImage category for this. So that you don’t repeat same code again and again.

 
+ (UIImage *)fitImageWithView:(UIView *)view imageName:(NSString *)imageName {
    
    if(imageName.length < 1) {
        [NSException raise:@"There is no image name." format:@"Image name is : %@", imageName];
    }
    
    UIImage *img = nil;
    
    UIGraphicsBeginImageContext(view.frame.size);
    [[UIImage imageNamed:imageName] drawInRect:view.bounds];
    img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return img;
}

Quick tip: Import necessary classes in a single file

When we working on a project and it has lot of class where doing same job we don’t need to import these classes again and again. Instead we need to a model class. Declare these classes in a single model class and use this class when necessary.

UserModel.h – Implementation file

#import "UserInformation.h"
#import "UserProducts.h"
#import "UserFriendList.h"

After that we should declare this model in our “Prefix” file.

#ifdef __OBJC__
     #import "UserModel.h"
#endif

Public functions

In Objective-C some APIs may wish to  expose own helper functions publicly. For concern and state procedures. Functions are great way to encapsulate like these behaviours. If you think they’re really useful, it may be worth making them available globally.

Interface File:

typedef NS_ENUM(NSUInteger, UserState) {
    UserState_Active,
    UserState_Deactive,
    UserState_SuperUser,
    UserState_Admin,
    UserState_Moderator
};

extern NSString *NSStringFromUserState(UserState state);

Implematation File

NSString *NSStringFromUserState(UserState state) {
    
    switch (state) {
        case UserState_Admin: return @"Admin";
        case UserState_Moderator: return @"Moderator";
        case UserState_SuperUser: return @"Super User";
        case UserState_Active: return @"Active User";
        case UserState_Deactive: return @"De-active User";
        default:return nil;
    }
    return nil;
}

iOS Block-code with Property

Yeni yıla girdik malum. Benim normalde de tüm yılım bilgisayar başında geçtiği için yeni yıla da bilgisayarım ile kod yazarak girdim 🙂 Pişman mıyım. Tabii amsterdam’da yılbaşı kutlamak ya da başka bir yerde çılgınca eğlenip yılbaşı kutlamak daha cazip geliyor. Ancak kendi koyduğum hedefler doğrultusunda çok çalışmam gerek. Şimdiden kendime 2015 yılı öğrenme takvimi gibi bir şey hazırladım 🙂

Neyse konuya gelelim. Block-code Objectvice-C’de en çok kullandığım özelliklerden birisi. Çok severim. Hem kullanırlığı kolay hem OO(Object Oriented) yapısına oldukça musait. Şimdi;

Interface dosyamızın hemen üstüne bir type-definition yani typedef oluşturuyoruz;

typedef void(^DoSomething)(void);

Daha sonra interface dosyamızda property olarak tanımlayabiliriz.

@property (nonatomic, copy) DoSomething somethingBlock;

Implementasyon dosyamızda “.m” istediğimiz işlemleri gerçekleştirebiliyoruz. Ben sadece NSLog ile bir şeyler yazdırdım. Tabii objemizin instantie edilmiş olması gerekiyor.


SomeClass *class = [[self alloc] init];

class.somethingBlock = ^{
        NSLog(@"Hello new year!!");
    };

Şimdi kullanmak istediğimiz sınıfımdızda dot syntax yaparak kullanbiliriz.


SomeClass *class = [[SomeClass alloc] init];
class.somethingBlock();

NSFileManager with CoreData

Appstore’daki neredeyse tüm uygulamaların (%70 civarında) Core Data’dan faydalanmaktadır. Core Data basitçe ifade etmek gerekise bir object graph. Core Data’da kaydettiğimiz tüm verileri kullanıcının cihazındaki belirli klasörlere kayıt ederiz. (NSUserDirectory, NSTemporaryDirectory, NSDocumentDirectory) gibi. Ben aşağıdaki örnekte basitçe .txt dosyası kayıt etmeyi okumayı ve silmeyi gösterdim.


/*
        Create .txt files and write some text into it.
     */
    
    // called NSFileManager singleton instance
    NSFileManager *fileManager = [NSFileManager defaultManager];
    
    // get temp directory path
    NSString *tempDirectoryPath = NSTemporaryDirectory();
    
    // getting directory
    NSURL *tempDirectory = [NSURL fileURLWithPath:tempDirectoryPath];
    
    // create new string and loop through
    for(int i = 0; i < 6; i++) {
        
        // new string
        NSString *newString = [NSString stringWithFormat:@"I am string number %d", i];
        
        // create .txt file
        NSURL *saveURL = [tempDirectory URLByAppendingPathComponent:[NSString stringWithFormat:@"string_%d.txt", i]];
        
        // write the text and save it to .txt file.
        [newString writeToURL:saveURL atomically:YES encoding:NSUTF8StringEncoding error:nil];
    }
    
    /*
        Get all .txt files
     */
    
    // get all .txt file
    NSArray *directoryList = [fileManager contentsOfDirectoryAtURL:tempDirectory
                                        includingPropertiesForKeys:nil
                                                           options:NSDirectoryEnumerationSkipsHiddenFiles
                                                             error:nil];
    // to see which file was written to directory!
    for(NSURL *url in directoryList) {
        NSLog(@"url : %@",url);
    }
    
    
    /*
     
        Create new directory to document directory
     */
    
    // Create document directory
    NSURL *documentDirectory = [fileManager URLForDirectory:NSDocumentDirectory
                                                   inDomain:NSUserDomainMask
                                          appropriateForURL:nil
                                                     create:NO
                                                      error:nil];
    
    // creating folders
    NSURL *bigFolder    = [documentDirectory URLByAppendingPathComponent:@"big_folder" isDirectory:YES];
    NSURL *littleFolder = [documentDirectory URLByAppendingPathComponent:@"little_folder" isDirectory:YES];
    
    // create big folder
    [fileManager createDirectoryAtURL:bigFolder withIntermediateDirectories:NO attributes:nil error:nil];
    // create little folder
    [fileManager createDirectoryAtURL:littleFolder withIntermediateDirectories:NO attributes:nil error:nil];
    
    
    // move to item specified target.
    for(int i = 0; i < 6; i++) {
        
        NSURL *desitnationURL;
        NSString *fileName = [NSString stringWithFormat:@"string_%d.txt",i];
        
        NSURL *targetItem = [tempDirectory URLByAppendingPathComponent:fileName isDirectory:NO];
        
        if(i % 2 == 0) {
            desitnationURL = bigFolder;
        } else {
            desitnationURL = littleFolder;
        }
        
        desitnationURL = [desitnationURL URLByAppendingPathComponent:fileName isDirectory:NO];
        
        [fileManager moveItemAtURL:targetItem toURL:desitnationURL error:nil];
    }
    
    /*
        Delete directory
     */
    
    // delete directory
    [fileManager removeItemAtURL:littleFolder error:nil];
    

Daha sonra açıklamalarını da yazacağım ve silinmemesini istediğiniz klasörleri nasıl koruma altına alacağınızı da başka bir yazıya bırakacağım.

iOS present view controller

Navigationcontroller’ların haricinde kullanıcılara pop-up tarzı veriler sunmak için “presentViewController:animated:completion:” metodunu kullanabiliriz. Kullanımı kolay ve özelleştirilebilir.
PresentViewController modal türünde olduğu için istediğiniz gibi transition ayarlamaları verebiliyorsunuz.
 

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
    UIModalTransitionStyle ease = UIModalTransitionStyleCrossDissolve;
    self.detailVC = (DetailViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"DetailVC"];
    self.detailVC.modalTransitionStyle = ease;
}

- (IBAction)doAction:(id)sender
{
    [self presentViewController:self.detailVC animated:YES completion:nil];
}

iOS WriteToFile Hatası

iOS cihazın Document Directorysine bir şeyler yazmak istediğimde aşağıdaki gibi bir hata dönderdi bana.

file error The operation couldn’t be completed. (Cocoa error 4.)

biraz googleda araştırmaını yaptığımda aşağıdaki kodun sorunumu çözdüğünü gördüm.


- (NSURL *)applicationDocumentsDirectory {
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
                                                   inDomains:NSUserDomainMask] lastObject];
}

Kodun kullanımı ise ;

NSString *path = [[self applicationDocumentsDirectory].path stringByAppendingString:@"denemeler.txt"];

Daha sonra istediğiniz gibi yazma,okuma işlemini yapabilirsiniz.

Searching Directory with NSFileManager

iOS programlama yaparken belirli ufak dataları .plist gibi dosyalarda saklamak isteyebiliriz. Bunun için spesifik bir kaç işlem yapmamız gerekir. Bunu her seferinde tekrarlamamak için aşağıda ufak bir method yaptım. Daha derli toplu olduğunu düşünüyorum. Commetler ile açıklamaya çalıştım.


/*
    Main task this method is basically search apporiate directory and append my "plist" file to that directory.
*/
- (NSString *) pathForFileInDocumentDirectory:(NSString *)filename
{
    return [[self documentPath] stringByAppendingPathComponent:filename];
}

#pragma mark - File Management:

// Search directory if program find specific directory then return.
- (NSString *) documentPath
{
    NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [docs objectAtIndex:0];
}

Kullanımı ise anlayacağınız üzere ;

[self pathForFileInDocumentDirectory:ALARM_FILENAME];

“ALARM_FILENAME” NSString türünde bir string değeri return ediyor. Bunu #define şeklinde classınızın üst kısmında belirtebilirsiniz…