iOS Check if string empty?

Evet kısa bir code-snippet paylaşacağım. Daha sonra bunun üzerine bir kaç bir şey daha ekleyeceğim. Şimdi yeni öğrendiğim ve bu konu üzerine geçmiş soru işaretlerim olduğu için daha detaylı bir arama ile blog yazısı paylaşacağım. Ama aşağıdaki kod basit olarak bir NSString değerinin boş olup olmadığını kontrol ediyor. Bunun için bir macro yapılabilir.

#define allTrim( object ) [object stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet] ]

Daha sonra kodda bunu kontrol edebilmek için;

NSString *emptyString = @"   ";

if ( [allTrim( emptyString ) length] == 0 ) NSLog(@"Is empty!");

Kod iki şekilde de çalışabilir isterseniz @”” şekilde de deneyebilirsiniz.

Ayrıca aşağıdaki kaynakları da kontrol edebilirsiniz.

http://blog.wilshipley.com/2005/10/pimp-my-code-interlude-free-code.html

http://stackoverflow.com/questions/899209/how-do-i-test-if-a-string-is-empty-in-objective-c

iOS TextView Prefix

Yaptığımız projelerin bazı noktalarında text girdilerine ön ek “prefix” koymak isteyebiliriz. Bu telefon kodu olabilir, “Sayın” gibi ifadeler de kullanabiliriz. Kullandığımız bu ön eklerin silinmemesi için “UITextField” sınıfının “UITextViewDelegate” delege methodlarından olan “textView:shouldChangeTextInRange:replacementText” methodunu kullanarak yapabiliriz.

Yapmamız gereken ilk olarak önceki metin ile sonraki metinleri birleştirmek. Daha sonra bu birleşimi bir NSString değişkeni içerisinde tutup daha sonra if-else koşulu ile eklediğimiz ön ek metin değerin uzunluğunu kontrol edip eğer birleştirilen metin belirtiğimiz ön ek metinin uzunluğundan küçük ise ön ekimizin silinmesini engelliyoruz. Bunu aşağıdaki kod ile yapabilirsiniz;

Prefix “Ön Ek” değerimiz

static NSString *const PREFIX_TEXT = @"Merhaba, ";

TextView’ımıza ekleceğimiz ön eki giriyoruz.

myTextView.text = PREFIX_TEXT;

Daha sonra delege metodumuzla kontrolleri sağlıyoruz.



- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    
    // Eski text değeriyle yenisini birleştiriyoruz...
    NSString *combinedText = [textView.text stringByReplacingCharactersInRange:range withString:text];
    
    // Eğer kullanıcı 4. karakterlerden sonraki karakterleri silmek istiyorsa bir prefix oluşturuyoruz
    // daha sonra text'in başına ön ek koyuyoruz.
    if(combinedText.length < 4) {
        textView.text = PREFIX_TEXT;
        return NO;
    }
    else if(![[textView.text substringToIndex:4] isEqualToString:[combinedText substringToIndex:4]]) {
        return NO;
    }
    
    return YES;
    
}

iOS Table Empty View

Listeleme gerektiren ya da ekleme – çıkarma yaptığımız Table View bölümlerinde eğer listelenecek herhangi bir içerik olmadığını göstermek istiyorsak iki yolu var. Birisi Alert View kullanmak ikincisi de table view’a direk mesaj yazmak. İkincisi her zaman terciğim. Ancak genelde table listesinin hücresine(cell) yazmayı tercih ediyordum. Bu da bir çok gereksiz koşul koymamı sağlıyordu. Bugün daha güzelini keşfettim. Table listesinin üzerine başka bir view eklemek ve dolu-boş koşuna göre göster-gizle yapmak. Kulağa mantıklı geliyor değil mi ? Yani “Talk is cheap show me your code.” diyenlerdenseniz aşağıya göz atabilirsiniz.
viewDidLoad:


- (void)viewDidLoad {
    [super viewDidLoad];

    // Global declared 'noMatchedView'
    noMatchedView = [[UIView alloc] initWithFrame:self.view.frame];
    noMatchedView.backgroundColor = [UIColor whiteColor];
    
    noMatchedLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 320)];
    noMatchedLabel.font = [UIFont boldSystemFontOfSize:18];
    noMatchedLabel.numberOfLines = 1;
    noMatchedLabel.shadowColor = [UIColor lightTextColor];
    noMatchedLabel.textColor = [UIColor darkGrayColor];
    noMatchedLabel.shadowOffset = CGSizeMake(0, 1);
    noMatchedLabel.backgroundColor = [UIColor clearColor];
    noMatchedLabel.text = @"Takas edeceğiniz ürününüz yok.";
    noMatchedLabel.textAlignment = NSTextAlignmentCenter;
    noMatchedView.hidden = YES;
    [noMatchedView addSubview:noMatchedLabel];
    [self.tableView insertSubview:noMatchedView belowSubview:self.tableView];
}

daha sonra tableView:numberOfRowsInSection delegate metodunda göster-gizle işlemini yapabiliriz.


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
    if(self.items.count == 0) {
        self.tableView.separatorColor = [UIColor clearColor];
        noMatchedView.hidden = NO;
    } else {
        noMatchedView.hidden = YES;
    }
    return self.items.count;
}

Ayrıca aşağıdaki hazır ve gayet güzel olan TableView / CollectionView ile uyumlu bir kütüphane var.
https://github.com/dzenbot/DZNEmptyDataSet

My iOS Development Arsenal

Bu yazımda iOS development yaparken geliştirme sürecimi kısaltan ya da güzelleştiren bir kaç eklentiden bahsedeceğim.

KSImageNamed
Programatik olarak oluşturuduğunuz UIImage sınıfına Asset dosyanızda bulunan .png ya da .jpg formatındaki resimleri önizlemenizi sağlıyor. Sadece [UIImage imageNamed:]; şeklinde çalışıyor.

https://github.com/ksuther/KSImageNamed-Xcode

Color Sense for Xcode
UIColor ile oluşturduğumuz renkleri hem önizlememizi hem de RBG şeklinde ayarlamamızı sağlıyor. Ayrıca rengi belirledikten sonra renge tıklayıp Color Picker bile açabiliyorsunuz. Oradan seçtiğiniz herhangi bir renk direk olarak RGB şekilde kodunu otamatik olarak kendisi yazıyor.

https://github.com/omz/ColorSense-for-Xcode

FLEX Inspector
Spark ve Reveal Inspector gibi ios uygulamanızın herhangi bir view’ını seçmenizi üzerinde herhangi bir property varsa görmenizi sağlıyor. FLEX ve DCIntrospect’in faydası diğer desktop inspectorlerdeki gibi Build Phareses’da fazladan işlem yapmanız gerekmiyor.

https://github.com/Flipboard/FLEX

DCIntrospect
Buda FLEX gibi bir inspector alternatik olsun diye paylaştım.

https://github.com/domesticcatsoftware/DCIntrospect

Simple Writing to iOS Document directory

Başlıktan da anlaşıldığı üzere basit bir şekilde iOS işletim sistemine .txt formatında veri yazımını kısa bir şekilde anlatmak istiyorum. Daha sonra detaylandıracağım.

 
NSString *simpleHelloWorld = @"Hello world!";
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *dirPath = [paths firstObject];
    NSString *path = [dirPath stringByAppendingPathComponent:@"my_file.txt"];
    NSError *err;
    BOOL isSuccess = [simpleHelloWorld writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&err];
    
    if(isSuccess) {
        NSLog(@"Success!");
    } else {
        NSLog(@"Failed!");
    }
    
 /* Reading */
    NSString *str = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&err];
    NSLog(@"%@",str);

ilk olarak yukarıda paths kısmında iOS işletim sisteminin dizinlerini elde ediyoruz. Burada bize verilenler sırasıyla “NSDocumentDirectory,NSLibraryDirectory,NSCachedDirectory,NSTemproryDirectory” burada bizim yazma ve okuma işlemini yapacağımız dizin “NSDocumentDirectory” olacaktır. Daha sonra kullanacağımız dizini alıyoruz “firstObject” diyerek bu array’deki 0 indeksine denk geliyor. Daha sonra kullanmak istediğimiz dosyayı diske yazıyoruz. Bunu da “stringByAppendingPathComponent” ile yapıyoruz. Bundan sonra okuma ve yazma işlemini yapıyoruz. İşlemin başarılı olup olmadığını kontrol edebilmek için bir BOOL değeri oluşturup dosyayı yazıyoruz. Daha sonra da if sorgusu ile durumunu kontrol ediyoruz. Yazıkdan sonra da istediğimiz sınıfda bu dosyayı okuyabiliriz.

ScrollViewController ile sayfalar arası geçiş

Scroll view çok kullanışlı bir iOS componenti diyebiliriz. ScrollView iOS arayüzünün hemen hemen her yerinde kullanılıyor. “iPhone’nun ana ekranındaki şifre alanında, TableViewController’ın listeleme alanında, Menülerin listelendiği alanda bile ScrollView kullanılıyor.” Ben de ufak da olsa storyboard kullanarak nasıl yapıldığını hem kendim anlayıp hem de blog da paylaşayım istedim.

İlk olarak yapmamız gereken proje oluşturmak, sonrasında viewcontroller’ımızın içine “Object Library” den bir adet ScrollView tutup ViewControllerımıza atmak. Daha sonrasında “Connection Inspector” den delegate’i bizim ViewControllera vermek kalıyor. Bundan sonraki işlemler de ScrollView’in içinde kullancağımız viewcontrollerı oluşturmak.

Yine aynı Object Library’den iki tane ViewController sürükleyip storyboard’a bırakın. Daha sonra bunlara sınıf oluşturun. “Ben FirstViewController ve SecondViewController” yaptım. Bir tane de button oluşturup yine ilk ViewControllerımızın görünür bir yerine atın. Butona tıklayarak bir action oluşturun. Daha sonra sayfa gelişlerinde kullnacağız. Main ViewController sınıfımıza “bu ViewController.m” anlamına geliyor. Girelim ve “viewDidload” satırına aşağıdaki kodları ekleyelim.

Uygulamada scrollview, firstvc ve secondvc bunları çekmek içinde mainStoryboard özelliği oluşturduk.

@property (weak, nonatomic) IBOutlet UIScrollView *scrollVC;
@property (nonatomic,strong) FirstViewController *firstVC;
@property (nonatomic,strong) SecondViewController *secondVC;
@property (nonatomic,strong) UIStoryboard *mainStoryboard;

Lazy Instantiation en sevdiğim 😀 ViewControllarımızı kolayca oluşturuyoruz!


-(FirstViewController *)firstVC
{
    if(!_firstVC) {
        _firstVC = [_mainStoryboard instantiateViewControllerWithIdentifier:@"FirstViewController"];
    }
    
    return _firstVC;
}

- (SecondViewController *)secondVC
{
    if(!_secondVC) {
        _secondVC = [_mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    }
    
    return _secondVC;
}

ViewDidLoad gerekli işlemleri yaptığımız kod bloğu.


    self.mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
    CGRect frame;
    frame.origin.x = self.scrollVC.frame.size.width * 2;
    frame.origin.y = 0;
    frame.size = self.scrollVC.frame.size;

    self.scrollVC.autoresizingMask = YES;
    
    self.scrollVC.contentSize = CGSizeMake(self.scrollVC.frame.size.width * 2, self.scrollVC.frame.size.height);
    [self.secondVC.view setFrame:CGRectMake(self.scrollVC.frame.size.width, 0,
                                            self.secondVC.view.frame.size.width, self.secondVC.view.frame.size.height)];
    
    [self.scrollVC addSubview:self.firstVC.view];
    [self.scrollVC addSubview:self.secondVC.view];

Buttona tıkladığında bir sonraki sayfaya geçmek için kullanıyoruz.

- (IBAction)gotoNextPage:(id)sender
{
    [UIView animateWithDuration:0.9 animations:^{
        [self.scrollVC setContentOffset:CGPointMake(self.firstVC.view.frame.size.width, self.scrollVC.frame.origin.y) animated:NO];
    }];
}

Kaynak : http://stackoverflow.com/questions/5977640/uiscrollview-and-setcontentoffset

Projenin kaynak dosyasını indirmek için : Github sayfasını ziyaret edin.

iOS dependency manager for Objective-C

iOS ile programlama yaparken iOS’ün kendi frameworkünün sağlamadığı ekstra özelliklere ihtiyaç duyabiliriz. Bunun için Github gibi hazineler mevcut. Fakat birden çok framework kullandığımızda bu projemizin hem boyutunu artırıyor hem de gelen güncellemeleri yakalamamız zorlaşıyor. İşte tam burda da CocoaPods yükü omuzluyor ve bizi bu gibi sıkıntılardan arındırıyor. Aşağıda kısa ve öz olarak nasıl yükleceğimizi projemize nasıl dahil edeceğimizi anlatmaya çalıştım. Bir sıkıntınız olursa yazmaktan çekinmeyin!

Kurulum

Terminal’i açarak aşağıdaki komutları yazalım.
sudo gem install cocoapods

Daha sonra eğer aşağıdaki gibi bir prompt ile karşılaşırsanız “Y” yani yes diyerek devam edin.

rake's executable "rake" conflicts with /usr/bin/rake
Overwrite the executable? [yN]

Son adım olarak aşağıdaki satırı yazarak CocoaPods yüklemisini bitiriyoruz.
pod setup

Projeye dahil etmek

Kısaca cd komutunu kullanarak projemize ulaşıyoruz.

cd users\serhatsezer\Desktop\iOSDevelopment\SampleProject

Başlatıyoruz. Bu bizim proje dizininde pod file üretecek daha sonra onun içine projelerimizi ekleyip kullanabiliriz.
pod init

Daha sonra oluşturduğumuz Pod file dosyasını açıyoruz.
open -a Xcode Podfile

Kullanmak istediğimiz frameworkü yazıyoruz ve ios-sdk versiyonunu da değiştiriyoruz.
# Uncomment this line to define a global platform for your project
# platform :ios, "7.0"

target "ShowTracker" do
pod 'AFNetworking', '2.2.1'
end

daha sonra her yeni framework eklediğimiz de çağıracağımız komutu çağırıyoruz.
pod install

Aşağıdaki gibi bir mesaj alırsanız tamamdır! Artık cocoapods kullanıma hazır.
Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.2.1)
Generating Pods project
Integrating client project

Uyarı : bundan sonra projemizi geliştirirken xcworkspace projesini kullanmanız gerekiyor.

iOS TableView reload tableview row

Editable alanlarda bir değişiklik yaptığımzda tablonun tamamını reload etmek yerine sadece düzenlediğimiz satırı reload etmek isteyebiliriz. Bu gibi durumlarda aşağıdaki code snippeti kullanabilirsiniz.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];

Kaynak :
http://stackoverflow.com/questions/3069339/how-to-dynamically-resize-uitableviewcell-height

http://blog.amyworrall.com/post/66085151655/using-auto-layout-to-calculate-table-cell-height

UITableViewCell Dynamic Height


http://useyourloaf.com/blog/2014/02/14/table-view-cells-with-varying-row-heights.html

Cok faydalı bir kaynak, infinity scrolling with tableview
http://www.iosnomad.com/blog/2014/4/21/fluent-pagination

iOS Slide-out menu

Kendim için bir kaç “slide-out” menu örnekleri arıyordum güzel bir tane buldum onu deneyeceğim denemem bittikten sonra detaylı bir şekilde nasıl kullanılacağını anlatacağım. Ama öncelikle bulduğum kaynakları burada paylaşmak isterim.

http://code4app.net/category/menu

https://github.com/modocache/MDCSwipeToChoose

https://github.com/TanguyAladenise/BBBadgeBarButtonItem

http://www.scoop.it/t/iphone-and-ipad-development