UITextField

iOS tabanlı projelerde kullanıcıdan veri almak istediğimizde UITextField nesnesini kullanırız.

        txt = [[UITextField alloc] initWithFrame:CGRectMake(5,40, 310, 30)]; //Text nesnesini ekrandaki yerinide belirterek tanımlıyoruz
        txt.backgroundColor = [UIColor colorWithRed:(245/255.0) green:(245/255.0) blue:(245/255.0) alpha:1] ; //RGB olarak arkaplan rengi atıyoruz
        txt.borderStyle = UIButtonTypeInfoLight; //Textfield için iOS tarafından hazır sunulan formatlardan birini seçmemiz daha görselliği artıracaktır
        txt.clearButtonMode = UIButtonTypeRoundedRect; //Clearbutton text nesnelerinizde giriş yaptığınızda sağ tarafta beliren ve tüm girişi silmenize yarayan bir özelliktir.
        txt.placeholder = @"<cevabınızı giriniz>"; //alana giriş yapılmadan önce içerisinde yazılacak yazıyı belirtir, ilk karakter girişi ile birlikte otomatik olarak kaybolur
        [self addSubview:txt];

UINavigationController Kullanımı

Projemizde kullanacağımız tüm viewleri içine alacak üst bir sınıf niteliğinde Navigation Control iOS uygulamarında sıkça karşımızda çıkmaktadır.

Kabaca NavigationControler’ın ASP.NET’deki master page’lere benzer bir yapı olduğunu söyleyebiliriz. UINavigationController sayesinde farklı viewler arasında geçişler çok daha kolaylıkla yapılacağı gibi master olarak ihtiyacımız olan bazı özellikleri de bize otomatik olarak sunmaktadır.

Projemize Navigation Controler tanımını appdelegate dosyaları içerisinde yapıyor olacağız.

Öncelikle appdelegate.h dosyamıza navigationControler sınıfından bir nesne tanımlayalım.

@property(nonatomic,retain)UINavigationController *navigation;

appdelagate.m dosyamızda ise @synthesize tanımından sonra önce nesnemizi oluşturuyoruz. sonrasında ise self.window.rootViewController‘a oluşturduğumuz nesnemizi bağlıyoruz.  Standart olarak sunulan ve aşağıda pasif hale getirdiğim standart yapıda rootviewControler’a direkt olarak controler bağlanmış. Biz araya bir navigation kontrol ekleyip root’a bunu göstermiş olduk. Dikkat etmemiz gereken diğer bir nokta navigation’u oluştururken bağlantısını kopardığımız viewcontroler’ımızı initWithRootViewController ile navigation’a bağlamış olmamız.

    //self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    //self.window.rootViewController = self.viewController;
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];
    navigation=[[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = navigation;

Şimdi projemize ikinci bir view ekleyelim. ve birinci view'den bunu açalım. Projemize

Web View Nesnesi

Uygulamamızın içerisinde bir web sayfası göstermek istiyorsak yada daha kullanışlı şekli ile ifade edeyim, ben x-code ile falan uğraşamam. Kullanıcı Apple-Storeden uygulamamı indirsin ancak benim uygulama sadece web uygulamı gösteren basit bir browser olsun diyorsanız kullanacağınız bir nesene. Kullanımı da gayet basit.

    UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320 , 400)];
    [self.view addSubview:web];    
    NSString *str = @"http://www.gencsiviller.net";
    NSURL *url = [NSURL URLWithString:str];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];   
    [web loadRequest:req];

Site yüklenirken kullanıcıya gösterilecek bir loading yükleyelim. Bunun için UIActivityIndicatorView sınıfını kullanıyoruz.

    loadling = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(320/2, 480/2, 60, 60)]; 
    [self.view addSubview:loadling];

Web View’in webViewDidStartLoad ve webViewDidFinishLoad delegatelerini kullanalım.

- (void)webViewDidStartLoad:(UIWebView *)webView{
    [loadling startAnimating];
    NSLog(@"basladi");
}
- (void)webViewDidFinishLoad:(UIWebView *)webView{
        [loadling stopAnimating];
    NSLog(@"bitti");
}

Kendi elimizdeki bir HTML kodunu webviewde göstermek istersek ;

    [web loadHTMLString:@"<html>..." baseURL:nil];

Eğer web sayfamızdaki herbir refresh’i yakalamak istiyorsak shouldStartLoadWithRequest delegatini kullanırız. Ancak sayfa içerisindeki javascript refreshlerini yakalayamayacaktır. Bu nedenle Ajax kullanılan sayfalar içinde kullanılması sağlıklı olmayacaktır.


					

Run Time Object Yaratma

XCode’de ekran tasarımlarını .xib dosyası üzerinde sürükle bırak yöntemi ile yapabiliyoruz. Ancak bazı durumlarda ekranda gösterilecek nesnenin rutime esnasında yaratılıp kullanılmasını gerektiren durumlar oluşabilir. Basit olarak run time anında bir nesneyi create edip nasıl kullanacağımıza gözatalım.

UIButon sınıfından yarattığımız bir buton nesnesini initwithframe ile ekranda görüntüleneceği yer bilgisini set ediyoruz.

    UIButton *btn = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 50, 50)];

Buton ile ilgili diğer özellikleri set ediyoruz.

    btn.backgroundColor = [UIColor redColor];
    [btn setTitle:@"deneme" forState:nil];

View’in addsubview methodu ile nesnemizi view’e ekliyoruz.

    [self.view addSubview:btn];

Tanımladığımız nesnelerin event’larını da set etmemiz gerekecek. buton örneğimiz için TouchUpInside event’ını tanımlayacak olursak;

    [btn addTarget:self action:@selector(cagrilacakfonksiyon) forControlEvents:UIControlEventTouchUpInside];

TouchUpInside event’ı ile cagrilacakfonksiyon isimli bir fonksiyon çağıracağımızı set ettik. bu fonksiyonumuzu sayfamız içerisinde tanımladığımız vakit işlemi tamamlamış oluruz.

-(void)cagrilacakfonksiyon{
    //yapılacak işlemler
}

Eğer IPhone’nın standart dizaynına uygun bir buton oluşturmak istiyorsak initwithframe ile değilde buttonwithtype ile tanımlama yapmak ve sonrasında frame vermek daha doğru olacaktır.

 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
 [btn setTitle:@"deneme" forState:nil];

Array ve Dictionary

Objective-C’de Diziler NSArray sınıfından türetilir. Her türlü nesne’den dizi oluşturalabilir. Dizinin tüm elemanlarının aynı nesne tipinden olma zorunluluğu da bulunmamaktadır.
Çok basit olarak array tanımı şu şekilde yapılır;

NSArray *array = [[NSArray alloc]init];

Dizimizin tüm class içerisinde kullanılmasını istiyorsa bunu .h dosyası içerisinde tanımlayalım.

NSMutableArray *array;

şeklinde tanımladıktan sonra .m dosyasında diziyi oluşturma ve içeriğini doldurma şu şekilde yapılır;

array = [[NSMutableArray alloc] init];
 [array addObject:(@"ahmet")];
 [array addObject:(@"cuneyt")];
 [array addObject:(@"duygu")];
 [array addObject:(@"nihat")];
 [array addObject:(@"sedat")];
 [array addObject:(@"deniz")];
 [array addObject:(@"ilker")];

Yukarıda dizimizi çok basit olarak string değerler ile doldurduk, dizileri herhangi bir object ile doldurmamız mümkün hatta  her row’unu farklı objeler ile de doldurabiliriz.

En çok kullanılan tiplerden birisi dictionary tipidir. Bu tanımlarıda yine .h dosyasında da yapabiliriz ancak tüm class içerisinde kullanılmasına gerek olmadığından .m dosyası içerisinde tanımlamak daha doğru olacaktır.

NSMutableDictionary *user1 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *user2 = [[NSMutableDictionary alloc] init];
[user1 setValue:@"John Lennon" forKey:@"Name"];
[user1 setValue:@"Beatles" forKey:@"Grup"];
[user1 setValue:@"15" forKey:@"ID"]; 
[user2 setValue:@"Bono" forKey:@"Name"]; 
[user2 setValue:@"U2" forKey:@"Grup"];
[user2 setValue:@"20" forKey:@"ID"]; 

tanımlama işleminden sonra value ve key değerleri ile dictionarilerimizi dolduruyoruz, sonrasında bu dictionary değerlerini dizimize her zamanki gibi ekliyoruz.

 array = [[NSMutableArray alloc] init];
 [array addObject:(user1)];
 [array addObject:(user2)];

Herhangi biryerde dizimizin elamanına erişmek için index ve ke değerlerini vermemiz yeterli olacaktır.

[[array objectAtIndex:indexPath.row] objectForKey:@"Grup"];