Passing Data between two ViewControlls

İki adet view controller arasında iletişimi sağlayabilmenin iki yolu var. Bunlardan birisi NSNotificationCenter diğeri ise Delegate methodları ile.

Aşağıda bulduğum bağzı linkleri paylaşıyorum. Bugün bununla ilgili bir yazı yazmayı düşünüyorum.

http://www.mysamplecode.com/2012/12/ios-passing-data-between-view-controllers.html

http://stackoverflow.com/questions/12757309/passing-data-using-delegates-between-viewcontrollers-without-any-navigation-cont

https://www.iphonelife.com/blog/31369/unleash-your-inner-app-developer-passing-data-between-controllers

Advertisements

Blocks in iOS

Blocklar ile ilgili detaylı bir yazı yazacağım. Ancak ama kısaca bahsetmem gerekirse belirli ya da karmaşık işlemleri blocklar halinde işlememize yarıyor. Yani methodlar gibi düşünebilirsiniz. Neden kullanılması gerektiğine geldiğimizde ise ne kadar burada teorik olarak söz etsekde uygulanınca anlanıyormuş mantığı ben de yapınca fark ettim ve buraya yazmak istedim.

Parser adında bir class’ım var.

Interface dosyamda kısaca şunlar var.

typedef void(^ParseArrayValues)(NSString *str);
- (void) arrayParser:(NSArray *)arr parser:(ParseArrayValues)parserBlock;

İmplementasyon dosyamda ise aşağıdaki kodlar

- (void)arrayParser:(NSArray *)arr parser:(ParseArrayValues)parserBlock
{
    for(NSString *arrayValue in arr) {
        parserBlock(arrayValue);
    }
}

Şimdi uygulama anında bir dizim var ve ben bu diziyi bloga tanımlayıp değerleri tek tek ayrıştırmasını istiyorum. Bunu yapmak için ;


Parser *parser = [[Parser alloc] init];
NSArray *myArray = [NSArray arrayWithObjects:@"a",@"b",@"c"];
[parser arrayParser:myArray parser:^(NSString *str) {
            NSLog(@"%@ ", str);
}];

Kısacası sürekli bir array’i ayrıştırmak için sürekli for döngüsü yaratmak zorunda değilim. sadece parser dosyamdan faydalanbilirim. Bunun için obje örneği de yaratmayabilirsiniz. Bunun için bir statik method yazılabilir. Ama ben birden çok parser objesini tek bir objede kullandığım için tek bir class yaptım. Bunda hem JSON hem de bu gibi işlemleri yapıyorum.

iOS SQLite ile Database Bağlantısı

iOS işletim sisteminde verileri saklamanın bir çok yolu var. “txt, sqlite, json, xml” gibi belki bilmediğim bir çoğu daha vardır 🙂 Geçen github’da bir framework’e rastladım. Kütüphanenin yaptığı iş SQLite veritabanına bağlanmayı kolaşlaştırması. Kolayca sorgular yapabilir, tablolar üretebilir ve silebiliriz. Aşağıda minik bir demo yaptım bununla ilgili.

ViewController implement dosyasının viewDidLoad methodunun içerisine aşağıdaki kodu yazdım.

NOT : Bunları yapmadan önce frameworkü indirip projenize tanımlamanız gerekiyor. Burdan egodatabase indirip projenize tanımlayabilirsiniz.

Projeye tanımlama : İndirdiğiniz dosyayı xCode’da projenize sağ tıklayarak “Add files to -proje adı” içerisine import ediniz. Sonrasında projenize tıklayıp Build Phases başlığının altında “Link Binary with Libraries” kısmına gelip “+” tuşuna basın, daha sonra arama çubuğuna “libsqlite3” yazark projenize ekleyin.

Son olarak projemiz ARC uyumlu yapmak için “Compile Sources” kısmındaki framework dosyalarımızın hepsine çift tıklayarak çıkan metin alanına “-fno-objc-arc” yazmanız gerekiyor. Daha sonra aşğıdaki kodu istediğiniz gibi kullanabilirsiniz.

EGODatabase *db = [EGODatabase databaseWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/database.sqlite3"]];
    
EGODatabaseResult *dbResult = [db executeQuery:@"CREATE TABLE IF NOT EXISTS KISI ('ID' INTEGER PRIMARY KEY  NOT NULL  UNIQUE , 'ISIM' VARCHAR(50), 'YAS' INTEGER, 'DOGUMTARIHI' INTEGER) " ];
    
    
    // Fill the table
    NSNumber *bornDate = [NSNumber numberWithInt:[NSDate date].timeIntervalSince1970];
    dbResult = [db executeQuery:@"INSERT INTO KISI (ISIM,YAS,DOGUMTARIHI) VALUES(?,?,?)" parameters:@[@"Serhat",[NSNumber numberWithInt:22],bornDate]];
    
    dbResult = [db executeQuery:@"SELECT * FROM KISI"];
    NSLog(@"Kişi döndü : %d ", [dbResult count]);
    
    for(EGODatabaseRow * row in dbResult) {
        NSLog(@"\nisim : %@ , yaşı : %d", [row stringForColumn:@"ISIM"] , [row intForColumn:@"YAS"]);
    }

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.

Sketch useful resources & tips

Bu başlık altında bulduğum, işime yarayan ya da ilerde yaracağını düşündüğüm bir kaç Sketch kaynağı paylaşacağım. Ayrıca sketch ile ilgili mini bir tutoriali bu başlık altında toplayacağım. Şimdilik bir kaç link atayım 🙂

İndirilebilir Sketch templetleri ve kaynak dosyaları;

http://sketchmine.co/

http://www.teehanlax.com/tools/iphone-sketch-app/

http://www.sketchappsources.com/

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…