Archive for category iPhone

UITableViewCell.textLabel Farklı Arkaplan Rengi

UITableViewCell içerisinde önceden tanımlı olarak gelen textLabel alanının arkaplan rengi, o hücre yaratılırken değiştirilemiyor. Bu sorun farklı renkte ya da bir renk geçişi içeren arkaplana sahip hücre oluşturmak istersek ortaya çıkıyor. Örnek olarak aşağıdaki kod beklediğimiz etkiyi vermeyecektir:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];

[cell.textLabel setBackgroundColor:[UIColor redColor]];
[cell.textLabel setText:[NSString stringWithFormat:@"Cell%d", indexPath.row+1]];

return [cell autorelease];
}

Bu kod satırının sonucunda textLabel’in arkaplanının kırmızı olmasını bekleriz, ancak çalıştırdığımızca arkaplan rengi değişmemiş görünür. Şu şekilde:

Screen shot 2009-11-18 at 11.47.31 AM

Bunun sebebi aslında iPhone SDK’sının otomatik olarak -hücrelerin ekranda kaydırılırken işlemciyi yormaması için- hücrelerin arkaplanlarını opak yapması ve standart bir renk ile göstermesidir. Bu durumun istisnası ise hücrenin seçilmesi durumudur. Dolayısıyla normal durumda textLabel opak olarak gösterilecek, ancak seçili (highlighted) duruma geçtiğinde arkaplanı transparan yapılacak ve arkasına belirttiğimiz backgroundView getirilecek. Normal durumlarda hangi renkte kalması gerektiğini söyleyebileceğimiz bir değişken olmadığı için (3.1.2 SDK’sinde yok en azından) textLabel normal durumda arkaplan rengini bulunduğu tablonun arkaplanı olarak ayarlar.

Eğer biz normal durumda farklı bir renkte görünmesini istiyorsak, bunu hücre yaratılırken (ya da initialize edilirken) değil, hücre ekranda gösterilecekken söylemeliyiz. Bahsettiğimiz UITableView’in delege metodu ‘tableView:willDisplayCell:forRowAtIndexPath:’dir. Bu metod hücre gösterilmeden hemen önce çağırıldığı için textLabel üzerinde istediğimiz değişiklikleri artık yapabiliriz.

Örnek kod olarak yukarıda yazdığımız satırı bahsedilen delege metodu içerisine yazarsak:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.textLabel.backgroundColor = [UIColor redColor];
}

Şu şekilde (ve istediğimiz gibi) bir görüntü elde ederiz:

Screen shot 2009-11-18 at 12.00.25 PM

Son olarak belirtmek istediğim nokta; bu bahsettiğim işlemler detailLabel için de aynen kullanılabilir.

, , , ,

No Comments

TableView Section Ekleme Çıkarma

iPhone uygulamalarında zaman zaman tablolara dinamik olarak yeni bölümler (section) eklenip çıkarıldığını görüyoruz. Bu işlem oldukça basit ve birkaç satır kod ile gerçekleştirebilir.

Yapmamız gereken aşağıdaki gibi bir metod eklemekten ibaret:

- (void) insertAndDeleteSections {

    UITableView *tv = (UITableView *)self.view;
    [tv beginUpdates];

    if([tv numberOfSections] > 1){
         [tv deleteSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationBottom];
    }

    [tv insertSections:[NSIndexSet indexSetWithIndex:1] withRowAnimation:UITableViewRowAnimationFade];

    [tv endUpdates];
}

Eğer bu metodu ekleme/silme yapmak istediğimiz noktadan çağırırsak varolan bölümün silinip yerine yenisinin eklendiğini ve tablonun yeniden yüklendiğini göreceğiz. “NSIndexSet” silmek istediğimiz bölümün index bilgisini içeriyor.

Buraya kadar işler kolay ancak dikkat edilmesi gereken ve unutulabilen bir nokta var. Örneğin tablomuzdan bir bölümü sileceğiz ama bir yenisini ekleme ihtiyacımız yok. Bu durumda yukarıdaki metoddan “insertSections” parçasını çıkarıyoruz. Bunu yaptıktan sonra önemli olan “numberOfSectionsInTableView” metodundaki dönüş değerinin yeni bölüm sayısı kadar olması. Aksi takdirde çıkarılan sayı kadar ekleme yapılmadığına dair bir hata alınacaktır. Tabii bu durum silmeyip sadece ekleme yaptığımız durumlar içinde geçerli olacaktır. Bu örnekte “dataRows” eklenen/çıkarılan bölümde gösterilen satırları temsil ediyor. Eğer bu veri yok ise section siliyor ve section sayısını 1′e indiriliyor.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
   if([dataRows count] > 0){
      return 2;
   }else { 
      return 1;
   }
}

, ,

No Comments

Minik ipuçları

iPhone SDK, uygulamalarınızın içerisinden telefon özelliklerine erişiminizi ciddi oranda kısıtlamaktadır. Aslında bir email göndermek, SMS göndermek veya bir telefon numarasını aramak haricinde çok da fazla olanağımız olmadığını söylemek yanlış olmaz.

iPhone’un bu özelliklerinden faydalanmak için URL şemalarından faydalanılır. Aşağıdaki örnek kodlarla bu işlemlerin nasıl yapıldığını görebilirsiniz.

Bir telefon numarasını uygulama içerisinden aramak:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://05320000000"]];

iPhone SDK 2.x’te mail göndermek için çok kısıtlı olanak sunuluyordu. Örneğin bir eklenti gönderemiyordunuz. iPhone SDK 3.x ile birlikte artık direkt uygulamanız içerisinden de mail gönderebilirsiniz. Aşağıdaki kod parçası eski usül tüm iPhone’larda çalışan versiyondur.

[[UIApplication sharedApplication] openURL:[NSURL
URLWithString:@"mailto:hebelek@abcd.com?subject=Deneme&body=ben bir
 deneme mesajim."]];

Eğer uygulamanız içerisinden SMS göndermek isterseniz bunun için de yine URL şemasından faydalanarak aşağıdaki kod parçasını örnek alabilirsiniz.

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:05320000000"]];

No Comments