28 January 2013

Kursus singkat Objective-C di iOS 6

Warning: Objective-C Crash Course Ahead!

Peringatan: Kursus singkat Objective-C di depan!

 

 

Catatan dari Ray: Tutorial ini sudah full update untuk iOS6, dan menggunakan sintaks Modern-Objective-C. Ini versi sebelumnya jika anda memerlukannya!

Ini adalah post dari iOS Tutorial Team Member Linda Burke, seorang iOS developer  dan founder dari canApps.

Apakah anda seorang developer yang punya skill di platform lain, tapi mau belajar mengenai development di iPhone (dan juga Objective-C)? Ini adalah mirip dengan situasi saya belum lama ini, dan jujur saja, semakin hari saya semakin berpengalaman dalam hal development.

Setelah dua tahun, saya sudah membuat beberapa apps untuk iPhone dan iPad. Biarpun saya belajar dengan cara yang sulit, saya ingin anda mendapat keuntungan dari coba-coba yang sudah saya lakukan.

Tutorial ini untuk para pembaca yang sudah memiliki pengalaman dalam hal programming. Tutorial ini mengasumsikan anda sudah mengetahui, misalnya while loop dan debug! Jika anda benar-benar baru dalam hal programming, mungkin anda ingin melihat tutorial berikut ini iOS for High School Students.

Tujuan dari tutorial ini untuk memberikan ada kepercayaan diri mengenai hal-hal dasar dari Objective-C. Daripada saya berkata “mari saya jelaskan setiap sintaks yang ada, kita akan langsung menyelam dan saya akan memberikan anda hands-on dan contoh-contoh. Dari situ akan mudah untuk anda melihat referensi (seperti ini) jika diperlukan.

Dalam tutorial ini, anda akan membuat app yang simple yang akan menampilkan quote secara acak dari stored list. Sambil membuat app ini, anda akan mengenal beberapa aspek dari Objective-C, termasuk:

  • Variables
  • Arrays
  • Property lists
  • Strings
  • Predicates
  • Pilihan secara acak
  • Interface simple antara objects dan events

Saya ingatkan sebelumnya – development iPhone dengan Objective-C sangat menyenangkan dan membuat kecanduan. Bersiaplah jika waktu tidur anda berkurang! :]

Sebelum kita mulai, pastikan anda memiliki account Apple developer dan provisioning detail nya sudah tersetup dan Xcode yang terbaru sudah terinstall (anda bisa mendownloadnya secara gratis di Mac App Store).

Jika sudah, mari kita mulai! :] Baca terus!

Tag: , , ,

27 January 2013

Kursus singkat Objective-C di iOS 6

Build dan run app anda untuk memastikan ini berjalan sesuai yang kita harapkan. Perhatikan untuk beberapa kategori yang berbeda dan kepada quote film Harry Potter untuk memastikan semuanya sudah benar.

Hujan Quote


Sedikit bersenang-senang, anda akan menggabungkan semua quotes anda, karena tidak terlalu banyak. Ini akan mengilustrasikan bagaimana melakukan loop pada array, dimana ini anda perlukan jika anda ingin memproses array satu demi satu.

Pada quoteButtonTapped: ubah bagian #1 dengan kode dibawah ini:

if (self.quoteOpt.selectedSegmentIndex == 2) {
    // 1.1 - Get array count
    int array_tot = [self.myQuotes count];
    // 1.2 - Initialize string for concatenated quotes
    NSString *all_my_quotes = @"";
    NSString *my_quote = nil;
    // 1.3 - Iterate through array
    for (int x=0; x < array_tot; x++) {
        my_quote = self.myQuotes[x];
        all_my_quotes = [NSString stringWithFormat:@"%@n%@n",  all_my_quotes,my_quote];
    }
    self.quoteText.text = [NSString stringWithFormat:@"%@", all_my_quotes];
}

For loop digunakan untuk memproses array dari baris 0 sampai ke baris akhir. x adalah counter yang digunakan untuk melacak baris.

Sekarang silahkan jalankan dan lihat hasilnya.

Satu hal lagi. Sebelumnya saya katakan bahwa ada perbedaan tipe array: NSArray dan NSMutableArray. Sejauh ini, dua-duanya sudah melaksanakan pekerjaan yang sama pada project kita.

Gunakan NSMutableArray jika anda ingin mengubah/mengupdate array tersebut. Seperti namanya, mutable array dapat diubah. Dan normal NSArray adalah statis dan anda tidak bisa menambah item yang baru atau menghapus suatu item dari array dengan mudah.

Sebagai contoh, jika anda ingin mengupdate suatu array setelah suatu baris dipilih untuk menunjukkan bahwa suatu quote sudah dipilih, anda memerlukan NSMutableArray.

Dalam proyek ini, movieQuotes adalah NSMutableArray anda. Anda menggunakan predicate, jadi pertama-tama anda harus menemukan row tersebut di movieQuotes dan mengupdatenya. Tambahkan kode berikut setelah bagian #2.9 di quoteButtonTapped: :

// 2.10 - Update row to indicate that it has been displayed
int movie_array_tot = [self.movieQuotes count];
NSString *quote1 = filteredArray[index][@"quote"];
for (int x=0; x < movie_array_tot; x++) {
    NSString *quote2 = self.movieQuotes[x][@"quote"];
    if ([quote1 isEqualToString:quote2]) {
        NSMutableDictionary *itemAtIndex = (NSMutableDictionary *)self.movieQuotes[x];
        itemAtIndex[@"source"] = @"DONE";
    }
}

Anda melakukan loop dari array dan memeriksa setiap baris apakah baris tersebut merupakan yang anda cari. Sekali lagi anda menggunakan isEqualToString: namun, kali ini, anda membandingkan dua variable string.

Untuk mengupdate baris di dalam array, anda mengambil obyek yang ditanyakan dan mengupdate obyek tersebut. Ini memang sedikit advance untuk tutorial kita, tapi berguna untuk anda ketahui;

Karena anda mengupdate string source dan karena  string source adalah yang digunakan untuk memilih quote dari setiap kategori, baris tersebut tidak akan digunakan pada saat kita menggunakan NSPredicate untuk memfilter array. Dan ini cukup luar biasa.

Apa selanjutnya setelah ini?

Berikut contoh proyek  dengan semua kode dari tutorial diatas.

Wah, anda sudah mencapai akhir dari proyek kecil kita. Anda sudah mengetahui menggunakan array dengan berbagai cara, membuat action dari event interface, mengakses object melalui Interface Builder menggunakan XIB file dan melakukan bermacam perbandingan string dan penggabungan. Ini bukan usaha yang sedikit untuk app iPhone pertama anda!

Sekarang setelah anda mengetahui dasarnya, anda mungkin ingin mencoba tutorial berserk Bagaimana membuat simple iPhone app tutorial series, atau daftar ke newsletter bulanan kami  untuk mendapatkan bermacam-macam iOS tutorial untuk pemula.

Forum juga tersedia jika anda mempunyai pertanyaan mengenai apa yang sudah ada lakukan. Dan juga, jika anda menyukai tutorial ini dan ingin lebih tahu secara mendalam, silahkan beritahukan saya di  forum!

Sementara itu, terima kasih dan selamat bersenang-senang! :]

Tutorial ini dibuat oleh iOS Tutorial Team Member  Linda Burke, , seorang developer iOS indie dan juga founder dari  canApps.

 

11 October 2012

Bagaimana Membuat Simple iPhone App di iOS 5 – Tutorial: Part 3/3

Perhaps the Scariest Bug of All!

Perhaps the Scariest Bug of All!

Update 2/20/12: Fully updated for iOS 5.

 

Artikel ini adalah bagian terakhir dari 3 bagian seri untuk pemula mengenai bagaimana membuat aplikasi iPhone yang simple. Dan apps ini mengenai cara merating serangga yang menyeramkan!

Pada bagian pertama, kita membuat app dengan table view yang berisi daftar serangga.

Pada bagian kedua, kita membahas bagaimana membuat detail view dari serangga-serangga tersebut.

Pada artikel ini, kita akan membahas bagaimana menambahkan serangga, menambah icon dan default image ke project kita, dan juga cara mengatasi operasi yang terus menerus.

Jadi, mari kita selesaikan..!

Menambah dan Menghapus Serangga

Sejauh ini semua berjalan dengan baik, tapi sebenarnya ini bukanlah apps yang user-friendly! Maksudnya hal pertama yang semua orang ingin lakukan adalah menambahkan serangganya sendiri, dan sejauh ini satu-satunya cara yang ada adalah menambahkan lewat coding!

 

Untungnya, karena kita membuat DetailViewController bisa mengedit serangga, dan kita juga menggunakan UITableViewController untuk RootViewController, maka hampir semua yang kita butuhkan sudah tersedia!

Hanya ada 4 langkah yang perlu kita lakukan, tapi saya akan menjelaskannya secara detail satu persatu agar mudah dimengerti:

1) Mensetup tombol navigation bar

Pada MasterViewController.m, tambahkan baris berikut  pada viewDidLoad:

self.navigationItem.leftBarButtonItem = self.editButtonItem;
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
    target:self action:@selector(addTapped:)];

Disini kita menset beberapa tombol untuk navigation bar. Seperti halnya “title” adalah special property pada view controllers yang digunakan oleh navigation controller, “navigationItem” juga termasuk salah satunya. Apapun yang kita set untuk leftBarButtonItem dan rightBarButtonItem akan muncul pada navigation bar ketika navigation controller menampilkan view controller.

Untuk leftBarButtonItem, kita menggunakan tombol special yang sudah tersedia yang bernama “editButtonItem.”. Tombol ini akan bertuliskan “Edit” dan mengubah UITableView menjadi mode edit (contohnya dimana kita bisa menghapus baris) dan mode normal.

Untuk rightBarButtonItem, kita membuat tombol yang bisa di tap oleh user untuk membuat serangga baru. Ternyata, sudah ada system built-in yang tersedia untuk menambah (yang seperti symbol +), jadi silahkan gunakan dan daftarkan sebagai method “addTapped:” yang akan dipanggil ketika tombol ditap.

Perhatikan, bahwa kita juga bisa menset ini di editor Storyboard, tapi saya sengaja menampilkannya dengan menggunakan kode disini supaya anda bisa melakukannya sendiri.
2) Mengimplementasikan tableView:commitEditingStyle:forRowAtIndexPath

Masih di MasterViewController.m, uncomment tableView:commitEditingStyle:forRowAtIndexPath dang ganti menjadi seperti dibawah ini:

if (editingStyle == UITableViewCellEditingStyleDelete) {        
    [_bugs removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}

Method ini dipanggil ketika user akan melakukan perubahan pada suatu baris. Kita akan cek, jika user ingin menghapus baris, maka baris tersebut akan kita hapus. Tapi perhatikan bahwa kita harus menghapus nya dari model data (_bugs) DAN menotifikasi ke table view bahwa salah satu barisnya sudah dihapus, caranya melalui deleteRowsAtIndexPaths.

3)  ) Menambah serangga

Berikutnya, tambahkan method ini ke dalam MasterViewController.m:

- (void)addTapped:(id)sender {
    ScaryBugDoc *newDoc = [[ScaryBugDoc alloc] initWithTitle:@"New Bug" rating:0 thumbImage:nil fullImage:nil];
    [_bugs addObject:newDoc];
 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:_bugs.count-1 inSection:0];
    NSArray *indexPaths = [NSArray arrayWithObject:indexPath];    
    [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:YES];
 
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionMiddle];
    [self performSegueWithIdentifier:@"MySegue" sender:self];    
}

Kita sudah mengaturnya di langkah pertama, jadi ketika user mentap tombol add, method ini akan dipanggil.
Disini kita membuat ScaryBugDoc dengan beberapa default value, dan menambahkannya ke dalam array bugs. Perhatikan juga bahwa kita harus mengupdate table view supaya table view mengetahui bahwa ada baris baru.
Kemudian kita memanggil beberapa code untuk membuat table view bereaksi jika user memilih baris yang baru tersebut, maka kita akan langsung menampilan edit view untuk serangga baru tersebut.Pertama-tama kita memilih baris tersebut di table view, kemudian secara manual menjalankan seque yang sudah kita set up di editor Storyboad.
Perhatikan bahwa kita sebenarnya belum pernah menamakan seque nya menjadi “MySeque” di Storyboad. Karena itu mari kita lakukan sebagai langkah terakhir.
4) Memberi nama segue

Buka MainStoryboard.storyboard dan click icon tanda panah antara master dan detail view controller – ini adalah seque milik kita.
Kemudian di tab keempat di sidebar (Attributes Inspector), set Identifier menjadi to MySegue. Dengan ini kita bisa menjalankannya secara manual melalui code.

Naming a segue in Xcode

Selesai! Jika anda mengcompile dan menjalankan run, anda sekarang bisa menambahkan sendiri serangga, seperti dibawah ini
An Objective-C Bug

Menambah Icon dan Default Image

Ok, sekarang apps kita sudah terlihat menarik, mari kita publish dan segera dapatkan uang!
Tapi, akan memalukan jika kita lakukan itu sekarang, maksud saya bahkan kita tidak mempunyai icon!
Untungnya, itu gampang sekali diperbaiki. Sebelumnya, kita sudah menambah file icon untuk project kita (logo1.png) dari ExtraStuffForScaryBugs2.zip. Kita akan menggunakan file tersebut menjadi icon dari project kita!
Untuk melakukannya, cara paling mudah adalah memilih ScaryBugs project di Project navigator, dan memilih ScaryBugs target. Pastikan Summary tab dipilih, dan scroll down ke App Icons. Control-klik pada icon pertama dan pilih Select File:

Changing the icon for an app in Xcode

Pilih logo1.png dari project directory, terima semua peringatan, dan anda akan lihat logo nya akan segera muncul. Jika anda menerima warning bahwa image size tidak match, resize logo1.png ke 57×57 (download sebelumnya mempunyai file yang lebih besar dari ukuran diatas)
Perhatikan bahwa ini adalah shortcut untuk mengedit ScaryBugs-Info.plist, dimana semua setting apps kita tersimpan. Anda bisa memastikan ini dengan membuka ScaryBugs-Info.plist dan akan terlihat seperti dibawah ini:

following:
Settings to set an app's icon in the info.plist

Anda bisa secara manual menambahkan settings ini ke file, tapi menurut saya menggunakan GUI akan lebih mudah.
Silahkan hapus dan re-install app di simulator atau phone anda, dan anda akan lihat icon yang baru akan muncul

New icon for Scary Bugs

Ada satu lagi yang harus kita perbaiki. Saat anda menjalankan ScaryBugs, jika anda perhatikan setelah anda mentap icon nya, akan ada jeda sebelum aplikasinya muncul, yaitu layar hitam. Ini sedikit memalukan – app kita seperti tidak responsive.
Menurut dokumentasi dari Apple, cara paling baik untuk melakukannya adalah menunjukkan layar yang serupa dengan aplikasi kita, tapi tanpa ada data di dalamnya.

Mudah sekali melakukanya, buka MasterController.m dan buat perubahan seperti dibawah ini:

// Replace tableView:numberOfRowsInSection's return statement to the following:
return 0; //return _bugs.count;

Kemudian run project nya di device anda, dan anda akan melihat table view kosong setelah apps anda load. Di XCode, click Organizer button di toolbar (yang paling kanan), klik pada device, pindah ke screenshots tab, dan click “New Screenshot” (bawah kanan) untuk mengambil screenshot:
Taking a screenshot with Xcode Organizer

Kemudian click Save as Launch Image. Pastikan ScaryBugs workspace dipilih, biarkan namanya tetap sebagai Default, dan click Next. Ini akan menyimpan gambarnya ke project anda dan mensetnya sebagai launch image, mudah bukan?
Anda bisa lihat jika imagenya sudah menjadi launch image dengan melihat target summary tab:

Setting the launch image in the Xcode project settings

Kemudian, kembalikan tableView:numberOfRowsInSection seperti semula dan jalankan app nya lagi. Anda akan melihat default screennya sudah berubah, tidak layar hitam lagi. Dan app kita akan terlihat lebih responsive!

Bonus: Menghandle operasi yang terus menerus

Jika anda menjalankkan app nya di Simulator, semuanya mungkin akan baik-baik saja, tapi jika anda menjalankannya di iPhone dan kemudian memilih gambar untuk mengubahnya, akan ada delay LAMA ketika UIImagePicker terinisialisasi. Setelah memilih gambar, akan ada delay lama lagi ketika imagenya di resize(terutama jika gambarnya besar). Ini bukan sesuatu yang baik, dan menjadikan aplikasi anda terlihat tidak responsive ke users.
Aturan utama adalah kita tidak boleh menampilkan suatu operasi yang lama pada main thread. Kita sebenarnya melanggar aturan ini dalam dua hal, karena itu aplikasi kita menjadi seperti tidak responsive.
Yang harus kita lakukan adalah menjalankan operasi tersebut di background. Idealnya, operasi itu dilakukan di background pada saat user melakukan hal-hal yang lain. Tapi jika task itu diperlukan sebelum user bisa lanjut (misalnya meload image picker) paling tidak kita harus memberikan suatu indikator loading supaya user tahu bahwa aplikasi tersebut sedang bekerja dan tidak ada yang salah.
Jadi itu yang akan kita lakukan, menjalankan code di background dan menampilkan “loading” view di layar depan sambil menunggu operasi tersebut selesai.

Keinginan untuk menampilkan loading view adalah masalah yang umum bagi para app developers, jadi beberapa orang sudah membuat  beberapa library activity indicator, yang bisa kita gunakan untuk menghemat waktu. Saya sudah mencoba berbagai library ini, dan favorit saya adalah SVProgressHUD yang dibuat oleh Sam Vermette. Mari kita coba. Anda bisa mendownload copynya disini SVProgressHUD Github.

Setelah anda selesai mendownload SVProgressHUD, tambahkan SVProgressHUD.h dan SVProgressHUD.m kedalam project di bawah grup “Views”. Anda juga harus melakukan dua langkah ini:
1. Tambahkan library yang dibutuhkan.

Klik project anda di Project Navigator dan pilih target ScaryBugs. Pilih tab Build Phases dan expand bagian Link Binary with Libraries. Klik tombol ‘+’ dan tambahkan QuartzCore.framework.

Adding required QuartzCore.framework library in Xcode

2. Mengcompile tanpa dukungan ARC.

Untuk saat ini SVProgressHUD tidak compatible dengan ARC, jadi kita harus mengcompilenya tanpa dukungan ARC. Untuk melakukan ini, expand tab Compile Sources dan double klik SVProgressHUD.m. Ketik -fno-objc-arc di kotak dialog yang ada untuk mengcompilenya tanpa dukungan ARC. Update 15/7/2012: SVProgressHUD sekarang sudah mendukung ARC. Terima kasih kepada Juan telah memberitahukan hal ini.
Sampai pada langkah ini anda seharusnya bisa membuild project tanpa ada error.

Kemudian ubah DetailViewController.m seperti dibawah ini:

// Di baris paling atas
#import "SVProgressHUD.h"
// Ganti addPictureTapped menjadi seperti ini:
- (IBAction)addPictureTapped:(id)sender {
    if (self.picker == nil) {   
 
        // 1) Show status
        [SVProgressHUD showWithStatus:@"Loading picker..."];
 
        // 2) Ambil queue sekarang dari system
        dispatch_queue_t concurrentQueue =
        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
        // 3) Load picker di background
        dispatch_async(concurrentQueue, ^{
 
            self.picker = [[UIImagePickerController alloc] init];
            self.picker.delegate = self;
            self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
            self.picker.allowsEditing = NO;    
 
            // 4) Tampilkan picker main thread
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.navigationController presentModalViewController:_picker animated:YES];    
                [SVProgressHUD dismiss];
            });
 
        });        
 
    }  else {        
        [self.navigationController presentModalViewController:_picker animated:YES];    
    }
}

Ada beberapa hal baru disini, mari kita bahas satu persatu.

1. Disini kita menggunakan class helper SVProgressHUD yang baru kita tambahkan untuk menunjukkan GUI “Loading” gambar lingkaran yang berputar di layar. Dengan ini user akan tahu bahwa ada proses yang sedang terjadi dan app kita tidak seperti terlihat freeze.

2. Kita ingin memuat image picker di background. Kita bisa melakukan hal ini di iOS dengan technology yang bernama Grand Central Dispatch. Kita tidak akan membahas hal ini secara detail (tapi jika anda penasaran, silahkan baca tutorial ini) . Untuk saat ini, yang perlu anda ketahui adalah baris ini memberikan anda antrian yang bisa anda gunakan untuk menjalankan beberapa blok kode di background.

3. Baris ini menjalankan beberapa baris kode yang meload  image picker di background. Jika anda bingung dengan syntaxnya, silahkan cek tutorial ini.

4.Terakhir,  kita menampilkan picker di antrian utama. Perhatikan anda harus selalu mengupdate GUI pada antrian utama- anda tidak bisa melakukannya di background.

Dan juga, kita juga bisa melakukan resize gambar di background. Ubah  imagePickerController:didFinishPickingMediaWithInfo menjadi dibawah ini:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {    
 
    [self dismissModalViewControllerAnimated:YES];
 
    UIImage *fullImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; 
 
    // 1) Show status
    [SVProgressHUD showWithStatus:@"Resizing image..."];
 
    // 2) Ambil queue sekarang dari system
    dispatch_queue_t concurrentQueue =
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
 
    // 3) Resize image di background
    dispatch_async(concurrentQueue, ^{
 
        UIImage *thumbImage = [fullImage imageByScalingAndCroppingForSize:CGSizeMake(44, 44)];
 
        // 4) Tampilkan image di main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            self.detailItem.fullImage = fullImage;
            self.detailItem.thumbImage = thumbImage;
            self.imageView.image = fullImage;
            [SVProgressHUD dismiss];
        });
    });
 
}

Selesai! Coba jalankan di device anda, dan anda akan melihat animasi akan muncul pada saat task yang yang loading lama sedang berjalan, sekarang user experiencenya terlihat lebih baik.

Using SVProgressHUD

Apa selanjutnya setelah ini?

 

Ini adalah sample project dengan semua code yang sudah kita buat sejauh ini.

Selamat – anda sudah selesai membuat app Master/Detail yang simple di iOS! Anda sudah menyelami kursus singkat bagaimana  membuat suatu app, dan menggali lebih dalam lagi beberapa bagian yang menarik.

Berikut beberapa yang saya rekomendasikan anda baca setelah ini:

  • The iOS Apprentice:  Anggota Tutorial iOS  Matthijs Hollemans telah menulis seri tutorial yang detail mengenai pengembangan aplikasi iOS untuk pemula yang  membahas semua yang anda perlukan untuk mulai pengembangan iOS dari awal. Anda bisa mendapatkan bagian pertamanya dengan gratis dengan cara mendaftar di newsletter bulanan iOS, atau anda bisa membeli secara lengkap di toko raywenderlich.com.
  • Beginning Storyboards in iOS 5 Tutorial: Untuk meletakkan user interface anda di iOS 5, anda memerlukan editor Storyboad, jadi ini penting untuk dipelajari.
  • Beginning ARC in iOS 5 Tutorial: Juga sangat penting untuk mengetahui bagaimana iOS 5 menghandle memory management (dan juga bagaimana mudahnya ARC!)
  • How To Use Blocks in iOS 5 Tutorial:    Jika anda belum pernah mendengar soal blocks, anda harus melihat tutorial ini. Ini akan memberikan informasi tambahan yang penting mengenai Storyboards.
  • Multithreading and Grand Central Dispatch on iOS:    Juga penting untuk mengetahui bagaimana menjalankan suatu task di background. Tuotrial kita ini sudah menyinggungnya, tapi silahkan baca yang ini untuk informasi lebih detail.
  • How To Submit Your App to the App Store:  Dan tentu saja ketika anda sudah selesai membuat app, anda ingin tahu bagaimana menempatkannya di App Store! Silahkan baca tutorial ini untuk petunjuk langkah demi langkah.
  • Dan banyak lagi!  Kita punya banyak tutorial iOS di website ini. Silahkan klik link ini untuk melihat semua daftarnya.Saya harap anda mendapat kesuksesan dalam petualangan iOS anda, dan saya harap anda bersenang-senang saat membuat ScaryBugs app ini! Jika anda mempunyai pertanyaan, komentar, silahkan gabung di diskusi dibawah ini!

Saya harap anda mendapat kesuksesan dalam petualangan iOS anda, dan saya harap anda bersenang-senang saat membuat ScaryBugs app ini! Jika anda mempunyai pertanyaan, komentar, silahkan gabung di diskusi dibawah ini!

Tag: , ,

Bagaimana Membuat Simple iPhone App di iOS 5 – Tutorial: Part 2/3

Update 2/17/12: Fully updated for iOS 5.

Artikel ini adalah bagian ke dua dari tiga bagian bagaimana membuat simple iPhone app untuk pemula. Dan app ini mengenai bagaimana merating serangga yang menyeramkan!

Di bagian pertama, kita membuat app yang berisi daftar dari serangga-serangga dan menampilkannya pada table view.

Pada artikel kedua ini, kita akan membahas bagaimana membuat detail view, sehingga kita bisa melihat gambar serangga yang lebih besar, merating, dan mengubah gambarnya!

Di bagian ketiga yang merupakan bagian terakhir, kita akan membahas bagaimana menambahkan serangga baru, menambah icon dan default image untuk project kita, dan bagaimana menghandle operasi yang terus menerus.

Mari kita membuat beberapa serangga! Lagipula, bukankah ini merupakan tujuan dari programming? :]

Aduh, View Controllers!

Sekarang setelah kita sudah mempunyai daftar serangga-serangga, akan sangat menyenangkan jika kita bisa men-tap bug tersebut dan menampilkan screen dimana kita bisa mengedit nama atau gambar serangga, dan meratingnya.

Kebanyakan pada iPhone app, untuk setiap “screen” dari app kita mempunyai class yaitu “View Controller” untuk screen tersebut. Saat ini MasterViewController kita muncul pada saat startup, yang berisi table view. Kita ingin membuat kalau kita men-tap serangga tersebut, akan muncul DetailViewController, dan menampilkan beberapa informasi mengenai serangga itu.

Ketika kita pertama kali menjalankan templatenya, hal ini berhasil, tapi ketika kita merubah object yang ditampilkan di table view (kita menampilkan serangga kita, bukan template Xcode NSDate Objects), men-tap baris di table view tidak lagi mengirimkan object yang benar untuk detail view. Dan kita akan segera memperbaikinya.

Setiap “View Controller” dapat berisi banyak view (multiple views). Di table view controller kita, kita hanya punya satu view – yaitu table view. Namun, di details view contoller kita, kita memerlukan banyak view – kita memerlukan view untuk nama serangga, view untuk gambar, view untuk rating, dan beberapa lagi.

Download beberapa hal terlebih dahulu!

Sebelumnya, kita memerlukan view untuk rating 5 bintang pada detail screen – tapi tidak ada fungsi ini di standard iPhone. Namun, baru-baru ini saya menulis tutorial How To Make a Custom UIView in iOS 5: A 5-Star Rating View, jadi kita bisa menggunakan view dari tutorial tersebut untuk project kita ini.

Jangan kuatir, kita tidak akan membahas tutorial tersebut saat ini (kecuali anda ingin) – namun anda bisa mendownload Paket Tambahan untuk Scary Bugs yang saya sudah buat untuk project ini.

Silahkan download file tersebut, kemudian :

  • Buat grup baru di XCode dengan nama “Views”, kemudian drag RateView.h/RateView.m ke dalam grup tersebut, pastikan “Copy items into destination group’s folder (if needed)” dicentang. Pastikan target “ScaryBugs” juga dicentang. Ini adalah code untuk view rating bintang 5 dari tutorial yang saya sebutkan diatas.
  • Ulangi langkah diatas untuk UIImageExtras, tapi drag ke dalam grup baru bernama “Helpers”. Ini adalah helper code untuk meresize gambar yang akan kita perlukan nanti.
  • Ulangi untuk tiga gambar muka yang terkejut, yang dibuat oleh istri tercinta saya, tapi drag ke dalam group baru bernama “Art”. Ini adalah gambar-gambar yang akan kita gunakan untuk “bintang” di dalam rating view kita, untuk menambah humor :]
  • Ulangi untuk logo1.png, dan drag ke grup Art. Kita akan menset icon untuk app kita belakangan.

 

Mengatur Detail View Controller Dengan Storyboard Editor

Ok – sekarang kita sudah siap! Buka MainStoryboard.storyboard, dan jika anda menscroll sampai ke kanan ujung, anda akan melihat Detail View Controller yang sudah dibuat oleh template untuk kita secara default, dengan label di dalamnya : “Detail view content goes here”
The detail view controller in the storyboard editor

Storyboard Editor memberi kita cara visual untuk mengatur user interface di XCode. Anda mendrag dan drop element UI ke dalam view, mengubah propertiesnya sesuka anda, dan bahkan anda bisa mengconnect element ke properties di View Controller class anda.

Cara paling mudah untuk memahaminya adalah dengan mencoba! Pertama-tama, click pada View controller nya kemudian pilih EditorCanvasShow Bounds Rectangles – ini membuat kita lebih mudah melihat bagaimana kita meletakkan control-control di screen.

Hapus label “Detail view content goes here” – kita tidak memerlukannya!

Kemudian di panel sebelah kanan, pada bagian bawah, pastikan tab ketiga ter-select untuk Object Library. Drag UITextField, UIImageView dan UIView ke dalam screen dan atur letaknya seperti dibawah ini ( text field berada paling atas) :

Laying out the interface in the storyboard editor

Kemudian pilih UITextField dan di bagian atas sidebar, pastikan tab ke empat (Attributes Inspector) terpilih, supaya kita bisa merubah beberapa properties.

Set font ke CustomHelveticaBoldSize 18.0, text alignment  center, Clear Button behavior:  ”Appears While Editing”, capitalization Words, seperti dibawah ini:

Setting text field attributes

Kemudian, pindah ke Size Inspector dengan menglick tab ke lima, dan setup autosizing attribut seperti dibawah ini:

Autosizing Attributes

Ini akan membuat ketika view kita diputar ke landscape, text field akan tertarik lebar sepanjang screen.

Kemudian, kita setup ImageView. Pada tab ke empat  (Attributes Inspector) set mode ke “Aspect Fit” dan di  tab ke lima (Size Inspector) set autosizing attribut menjadi seperti dibawah ini:

Autosizing Attributes

Ini akan membuat Image View membesar atau mengecil untuk mengisi space yang ada, sambil menjaga agar ujungnya berjarak sama dengan ujung dari screen, dan menset ukuran image agar bisa pas sebisa mungkin sambil menjaga ratio image yang sesuai.

Untuk UIView, pada tab ke tiga (Identity Inspector) set Class Identity ke “RateView” agar rating 5 bintang kita muncul disana. Kemudian di tab ke lima (Size Inspector) set autosizing attribut menjadi seperti dibawah ini:

Autosizing Attributes

Ini akan membuat gambar tertarik dari kiri ke kanan, tapi tingginya akan tetap.

Sejauh ini bagus! Kemudian kita perlu menambah beberapa control ke screen agar user bisa men-tap UIImageView area untuk mengubah gambar.

Ada beberapa cara untuk melakukan ini, tapi cara yang paling mudah adalah membuat tombol yang tidak terlihat diatas UIImageView, dan menset agar kita bisa mendapat respons balik ketika tombol ditekan. Kita juga bisa menambah UILabel dibawah gambar yang bertuliskan “Tap to Change Picture” (“Tekan untuk mengubah gambar”) jika belum ada gambar yang diset.

Silahkan drag Round Rect Button dari library, ubah ukurannya agar letak dan ukurannya sama persis dengan UIImageView. Untuk membuatnya tidak terlihat, di tab keempat (Attributes Inspector) ubah type nya ke Custom. Kemudian ke tab ke lima (Size Inspector) set autosizing attributes menjadi seperti dibawah ini:

Autosizing Attributes

Terakhir, drag UILabel dari library, letakkan di tengan dari UIImageVIew, dan double klik untuk mengedit text nya, ganti menjadi “Tekan untuk mengubah Gambar”. Kemudian ubah text alignment menjadi center. Dan juga, drag posisi UILabel di XIB naik keatas agar berada di belakang UIImageView (listnya berurutan dari bawah keatas) :

Setting the label to show up in the back

Kemudian pada tab ke lima (Size Inspector) set autosizing attributes menjadi seperti dibawah ini:

Autosizing Attributes

Sebelum kita lanjut, silahkan periksa lagi apakah kita sudah menset semua autosizing attributes dengan benar, dengan cara memilih Detail View Controller, dan di tab ke empat (Attributes Inspector) ubah orientasi dari Portrait ke Landscape :

Testing autosizing attributes and orientation changes work OK in Storyboard editor

Jika ada yang salah, jangan kuatir – silahkan ubah kembali ke Portrait dan cek ulang settingannya.

Phew..! Kita sudah menambah semua control yang kita perlukan, sekarang yang harus kita lakukan adalah menghubungkan semuanya dengan outlet pada masing-masing class.

Untuk melakukan ini, buka Assistant Editor (tombol ke dua dibawah bagian “Editor” pada toolbar atas) dan pastikan sudah diset ke AutomaticDetailViewController.h:

Bringing up the assistant editor

Kemudian, control-drag UITextField kedalam DetailViewController.h, tepat sebelum @end. Sebuah popup akan muncul yang memungkinkan untuk menghubungkan UITextField ke properti dari class milik kita. Beri namanya titleField, dan click Connect.

Connecting the title field to an outlet

Ulangi langkah diatas untuk image view (tapi pastikan terhubung ke outlet dengan nama imageView) dan Rate View (hubungkan ke outlet dengan nama rateView)

Kita juga ingin memastikan ketika tombol ditap, suatu method akan terpanggil di class kita. Untuk melakukannya, control-drag dari button/tombol ke sebelum @end, seperti yang kita lakukan dengan view yang lain. Namun, kali ini pilih Action sebagai connection type nya, beri nama addPictureTapped, dan klik Connect.

Connecting a button to a method in the Storyboard editor

Perhatikan bahwa secara otomatis event yang terpilih adalah “Touch Up Inside”. Ini sudah sesuai karena ini berarti ketika jari user terangkat dari tombol (misalnya, mereka mengclik tombol), method kita segera dipanggil.

Kita juga bisa menghubungkan action yang lain dengan callback method. Misalnya, ada action ketika di suatu text field textnya berubah, kita ingin ada callback ketika ini terjadi.

Untuk melakukannya, control-drag dari UITextField tepat sebelum @end dan set juga ke Action. Secara default event yang diset adalah Editing Did End – ubah menjadi Editing Changed. Beri nama methodnya titleFieldTextChanged, dan click Connect.

Yang terakhir yang harus kita lakukan adalah menset agar class kita menjadi delegate untuk text field tersebut. Kadang-kadang menerima callback action dari suatu view belum cukup – mungkin saja ada informasi lain yang perlu disampaikan, dan text field adalah contohnya.

Untuk melakukannya, control-click di Text Field, dan drag satu garis dari lingkaran kecil pada tulisan “delegate”, drag ke  tulisan Detail View Controller – Detail, kemudian lepaskan.

Setting the delegate of a text field

Sekarang, DetailViewController.h akan menjadi seperti dibawah ini :

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController

@property (strong, nonatomic) id detailItem;

@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet RateView *rateView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)addPictureTapped:(id)sender;
- (IBAction)titleFieldTextChanged:(id)sender;

@end

Anda mungkin melihat sesuatu yang baru dari code diatas yaitu – IBOutlet and IBAction. Ini adalah “keyword spesial” yang diperlukan oleh Storyboard Editor, berguna agar kita bisa mencocokkan control yang kita tambahkan di interface builder dengan properties dari class kita. Pada dasarnya, jika kita meletakkan IBOutlet atau IBAction setelah suatu property/method, Interface Builder akan langsung mendetectnya sehingga kita bisa menghubungkannya nanti.

Dengan membuat ini pada Storyboard editor, ini sudah dihubungkan secara otomatis untuk kita, tapi kita bisa melihat koneksinya dengan cara control-click salah satu dari Detail View Controller. Hal ini dinamakan “outlets”

Kita perlu membuat sedikit penyesuaian disini untuk menandakan view controller kita mengimplement beberapa delegate, menambah property untuk image picker dan memodifikasi detailItem untuk menandakan ini spesial untuk ScaryBugDoc, karena detail item ini yang akan ditampilkan. Silahkan ubah seperti dibawah ini:

#import <UIKit/UIKit.h>
#import "RateView.h"

@class ScaryBugDoc;

@interface DetailViewController : UIViewController <UITextFieldDelegate, RateViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>

@property (strong, nonatomic) ScaryBugDoc * detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet RateView *rateView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (strong, nonatomic) UIImagePickerController * picker;

- (IBAction)addPictureTapped:(id)sender;
- (IBAction)titleFieldTextChanged:(id)sender;

@end

OK, akhirnya selesai untuk layout dan header file – sekarang ke implementasi!

Implementasi Detail View

Kita akan membuat beberapa perubahan di DetailViewController.m. Akan ada banyak coding disini, mari kita mulai satu persatu

1) Mengimport headers

// Pada baris paling atas
#import "ScaryBugDoc.h"
#import "ScaryBugData.h"
#import "UIImageExtras.h"

// Add in synthesize section
@synthesize picker = _picker;

2) Mensetup Rate View

// ganti configureView menjadi seperti dibawah ini:
- (void)configureView
{
    // Update user interface untuk detail
    self.rateView.notSelectedImage = [UIImage imageNamed:@"shockedface2_empty.png"];
    self.rateView.halfSelectedImage = [UIImage imageNamed:@"shockedface2_half.png"];
    self.rateView.fullSelectedImage = [UIImage imageNamed:@"shockedface2_full.png"];
    self.rateView.editable = YES;
    self.rateView.maxRating = 5;
    self.rateView.delegate = self; 
}

Pada configureView (yang dipanggil dari viewDidLoad) , kita menset properties dari RateView kita. Untuk detailnya, silahkan liat tutorial How To Make a Custom UIView in iOS 5: A 5-Star Rating View

3) Mengenable autorotation

// Ganti return di shouldAutorotateToInterfaceOrientation menjadi:
return YES;

Pada shouldAutorotateToInterfaceOrientation, kita menuliskan return YES, dimana sebelumnya kita sudah menset semua autosizing attributes di Interface Builder! Ini memungkinkan user merotate view ke semua orientasi, dan control kita akan me-relayout sesuai dengan autosizing attributes yang sudah kita set.

4) Mensetup initial UI state

// di baris paling bawah dari configureView
if (self.detailItem) {
    self.titleField.text = self.detailItem.data.title;
    self.rateView.rating = self.detailItem.data.rating;    
    self.imageView.image = self.detailItem.fullImage;
}

Disini kita hanya mensetup GUI berdasarkan serangga yang dipilih.

5)  Menghandle text view dan rating view

- (IBAction)titleFieldTextChanged:(id)sender {
    self.detailItem.data.title = self.titleField.text;
}

#pragma mark UITextFieldDelegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

#pragma mark RateViewDelegate

- (void)rateView:(RateView *)rateView ratingDidChange:(float)rating {
    self.detailItem.data.rating = rating;
}

Kita menset titleFieldValueChanged agar dipanggil kapanpun user mengubah isi dari text field, jadi kita mengupdate modelnya juga kapanpun ada perubahan.

textFieldShouldReturn dipanggil ketika user menekan tombol return pada keyboard. Kita memanggil resignFirstResponder untuk menghilangkan keyboard dari layar ketika ini terjadi.

rateView:ratingIsChanged dipanggil ketika user memilih rating baru karena kita menset diri kita sebagai RateView delegate, jadi itu yang terjadi ketika kita mengupdate model kita.

Mungkin ada yang bertanya-tanya apa fungsi #pragma mark, ini hanya baris khusus yang dibaca XCode untuk memisahkan antara daftar fungsi editor, hanya supaya lebih terorganisir.

Using pragma mark to organize code in Xcode

6) Menampilkan Image Picker dan memproses hasil

- (IBAction)addPictureTapped:(id)sender {
    if (self.picker == nil) {   
        self.picker = [[UIImagePickerController alloc] init];
        self.picker.delegate = self;
        self.picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        self.picker.allowsEditing = NO;    
    } 
    [self.navigationController presentModalViewController:_picker animated:YES];    
}

#pragma mark UIImagePickerControllerDelegate

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissModalViewControllerAnimated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {    

    [self dismissModalViewControllerAnimated:YES];

    UIImage *fullImage = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage]; 
    UIImage *thumbImage = [fullImage imageByScalingAndCroppingForSize:CGSizeMake(44, 44)];
    self.detailItem.fullImage = fullImage;
    self.detailItem.thumbImage = thumbImage;
    self.imageView.image = fullImage;
}

Kita menset addPictureTapped agar dipanggil kapanpun user mentap button invisible yang terletak diatas UIImage, jadi disini kita membuat UIImagePicker (jika belum ada), dan menset source photo nya ke photo library (atau kita juga bisa memilih dari camera). Kita menset sendiri sebagai delegate, jadi kita mendapat hasil balik ketika user selesai memilih foto.
Terakhir, kita menampilkan image picker sebagai modal view controller, yang berarti mengambil seluruh screen.

Terakhir, kita mengimplementasikan hasil balik dari image picker ketika user memilih gambar atau batal.
Apapun itu, kita mendismiss modal view controller. Jika user memilih gambar, kita mendapatkan full image dan juga versi thumbnail (yang kita resize menggunakan UIImageExtras class yang kita tambahkan sebelumnya), dan mengupdate baik model dan juga view nya.

OMG – barangkali kalian sudah bosan menulis code ya?Jangan kuatir – kita hampir selesai, hanya tinggal menggabungkan saja!

Mengintegrasikan Detail View

Ini tidak akan lama. Pertama-tama, buka MainStoryboard.storyboard, dan pilih table view cell di Master View Controller. Control-drag dari sel tersebut ke Detail View Controller, sebuah popup akan menanyakan apakah kita akan menghubungkannya sebagai Push, Modal atau Custom. Pilih push, dan anda seharusnya akan melihat panah yang menghubungkan view controllers :

Connecting the view controllers with a push segue

Sekarang, kita perlu menampilkan serangga yang benar ke dalam detail view controller ketika suatu baris dipilih. Untuk melakukan ini, buka MasterViewController.m dan ubah seperti dibawah ini:

// tambahkan di baris paling atas
#import "DetailViewController.h"

// di baris paling bawah dari viewWillAppear
[self.tableView reloadData];

// Add to end of file
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    DetailViewController *detailController =segue.destinationViewController;
    ScaryBugDoc *bug = [self.bugs objectAtIndex:self.tableView.indexPathForSelectedRow.row];
    detailController.detailItem = bug;
}

Pertama, perhatikan di viewWillAppear, kita mereload data yang ada di table. Ini karena ketika user berada di detail view, mereka bisa merubah nama dari serangga atau gambar, dan kita ingin mengupdate nama/gambar agar muncul ketika mereka kembali ke table view. Salah satu cara yang paling mudah adalah mereload keseluruhan table, dan itu yang kita lakukan.

Kemudian, jangan lupa bahwa kita menset di editor Storyboard ketika suatu baris di tap, akan mempush Detail View Controller ke stack. Ketika ini terjadi, prepareForSegue akan dipanggil, jadi kita punya kesempatan memberikan detail view controller informasi yang diperlukan. Dalam hal ini, kita cukup menampilkan serangga yang dipilih ke layar.

Akhirnya, selesai…! Silahkan compile dan run project anda, dan jika tidak ada masalah seharusnya sekarang anda bisa menampilkan detail view dari serangga, mengubah namanya, mengubah gambarnya, memberi rating dan bahkan memutar baik portrait/landscape!

Detail View Controller Example

Apa selanjutnya setelah ini?

Ini adalah sample project  dengan semua code yang sudah kita buat sejauh ini.

Silahkan infokan ke saya jika ada dari tutorial diatas yang membingungkan atau anda ingin saya menampilkan lebih detail mengenai apapun.

Di seri terakhir, kita akan membahas bagaimana cara menambah, menghapus serangga, menambahkan icon dan default image ke project kita dan cara yang benar menghandle operasi yang terus menerus.

 

Tag: , , ,

Bagaimana Membuat Simple iPhone App di iOS 5 – Tutorial: Part 1/3

iPhone programming is like a ladybug - fun and only a little scary!

iPhone programming itu seperti kumbang – menyenangkan dan hanya sedikit menakutkan!

Update 2/16/12:Update untuk iOS5

Platform iPhone adalah platform pengembangan yang hebat bagi para indie software developers. Tidak ada cara yang lebih mudah ketika mendapatkan ide unik untuk apps kita, melakukan coding dan langsung tersedia untuk jutaan potensial user.

Beberapa saat yang lalu, saya mendapat banyak pertanyaan dari orang-orang yang baru mengenal pengembangan iOS tentang bagaimana cara memulainya. Jadi saya rasa akan sangat berguna jika saya menulis beberapa seri tutorial yang disesuaikan bagi para pemula.

Tapi, daripada fokus ke hanya satu topik, kita akan masuk dan membuat satu aplikasi lengkap dari awal. Setelah selesai, kalian akan mencoba semua aspek dari pengembangan aplikasi di iPhone dan siap untuk menggali lebih dalam.

Jadi, aplikasi apa yang akan kita buat?Hmm, saya ceritakan dulu awalnya..

Suatu malam, saya melihat foto dari Potato Bug untuk pertama kalinya, saya langsung kaget karena serangga tersebut sangat besar dan menyeramkan! Kemudian saya terobsesi melihat semua foto serangga yang menyeramkan di internet. Jadi untuk membagi semua kesenangannya, kita akan membuat aplikasi untuk itu-memberi peringkat serangga yang menyeramkan!

Sambil membuat aplikasi ini, kita akan membahas beberapa topik yang sering digunakan pada pengembangan aplikasi iPhone

  • Apa yang diperlukan untuk memulai pengembangan aplikasi di iPhone
  • Bagaimana menyimpan data dari aplikasi kita ke dalam Model
  • Bagaimana menggunakan Table Views – termasuk menambah dan menghapus row/baris
  • Bagaimana membuat detail view dari suatu row
  • Bagaimana untuk mendukung orientasi Portrait & Landscape
  • Bagaimana menggunakan Navigation Controllers
  • Bagaimana menggunakan Image Picker
  • Bagaimana menggunakan control yang umum seperti, text field, button dan image view
  • Bagamana menambah icon dan default image
  • Bonus : bagaimana menghandle operasi yang terus menerus

Memang, sepertinya banyak, tapi jangan kuatir – kita tidak takut terhadap serangga!

Pada bagian pertama dari tiga bagian ini, kita akan membahas bagaimana memuat model kita dengan daftar dari serangga dan menampilkannya di table view (Silahkan lihat Part 2 atau Part 3)

Tutorial ini ditujukan untuk pemrogrammer iOS pemula, tapi diharapkan anda sudah familiar dengan Objective-C dan programming secara umum. Jika anda baru dalam Objective-C, saya merekomendasikan anda membaca Objective-C Programming Language Guide  dari Apple.

Apa yang anda perlukan

Pertama-tama, untuk mengembangkan aplikasi di iPhone, anda memerlukan komputer Mac. Mac apapun cukup, asalkan bisa menjalankan versi Mac Os terakhir, Lion. Tapi jika ingin mencari yang paling murah, anda bisa menggunakan Mac Mini, ini sudah bisa digunakan dengan baik sebagai mesin development.

Kemudian, anda perlu mendapatkan copy dari XCode, IDE dari Apple untuk pengembangan iOS. Jika anda belum mendapatkannya, silahkan daftar secara gratis di iPhone Dev Center dan silahkan download XCode dari Mac App Store.

Jika mau, anda bisa mendaftar Program iPhone Developer berbayar, yang memungkinkan anda untuk menjual aplikasi anda di App Store, tapi jika hanya ingin mencoba pengembangan aplikasi iOS, account yang gratis sudah cukup.

Jika anda ingin serius dalam pengembangan iOS, disarankan anda memiliki iPhone/iPhone4/iPod Touch/iPad. Memang sih anda bisa melakukan testing lewat simulator, tapi ada beberapa API yang tidak jalan di Simulator, dan anda memerlukan salah satu device di atas untuk testing.

Nah – jika anda belum melakukan langkah diatas, silahkan download XCode, jalankan dan mari kita lanjutkan!

Halo, Table View!

Kita akan mulai dengan menggunakan salah satu control yang paling sering digunakan di iPhone – yaitu Table View. Anda mungkin sudah sering melihat Table View di beberapa aplikasi, berikut beberapa contohnya:

UITableView Examples

Jadi, layar pertama aplikasi kita akan memiliki Table View, untuk menampilkan daftar serangga-serangga yang menakutkan!

Mari kita mulai dengan mengklik File- New- Project di XCode, pilih iOS -Application-Master-Detail Application, dan klik Next.

Creating an app with the master detail application template

Di halaman berikutnya, ketik ScaryBugs sebagai Product Name, masukkan identifier yang unik di Company Identifier(com.namaperusahaananda atau com.namaanda sudah cukup), pilih iPhone untuk device family, dan pastikan Use Storyboard dan Use Automatic Reference Counting tercentang. Klik Next setelah selesai.

Project Settings for scary bugs app

Pilih lokasi untuk menyimpan proyek anda dan klik Create. Dan sebelum kita melakukan apapun, mari kita lihat apa yang sudah kita peroleh sejauh ini! Di toolbar pada layar paling atas pilih iPhone Simulator dari daftar yang tersedia, klik tombol Run. Jika semuanya berjalan dengan lancar, anda akan melihat simulator seperti ini:

The main screen created by the master detail template

Anda dapat menekan tombol ‘+’ untuk membuat entry baru, kemudian tekan baris yang baru untuk melihat detail viewnya :

Detail view created by master detail application template

Seperti yang anda lihat, kita sudah memiliki project yang sudah berfungsi karena kita memilih Master-Detail Application template.

Kita tidak akan membahas lebih banyak mengenai template karena pembahasan tersebut diluar tutorial ini, tapi bisa dilihat bahwa kita mempunyai table view dan detail view yang masih kosong namun bisa segera digunakan – kita hanya harus mengisinya dengan data!

Untuk mengetahui caranya, mari kita buat sebuah class untuk meng keep track serangga-serangga kita.

Model Data: Pengorganisasian

Perhatikan hirarki folder pada Project Navigator di dalam XCode:

The project navigator in Xcode

Template ini hadir dengan root grup, dan Supporting Files grup. Grup-grup ini hanya untuk pengaturan, jadi silahkan ganti sesuai selera anda. Dalam tutorial ini, kita akan memiliki banyak files, jadi mari kita atur sedikit file-file tersebut.

Pertama-tama, kita buat grup baru untuk menyimpan file-file User Interface. Caranya, Control-Klik grup Scary Bugs dan pilih New Grup. Kemudian klik grup yang baru dibuat, dan ganti namanya menjadi “GUI”. Tarik file-file dari root ke dalam GUI Grup (bukan Supporting Files). Sekarang tampilan XCode anda harusnya seperti dibawah ini:

Organizing Project Navigator tree, part 1

Sekarang kita buat grup baru yang kedua dan kita beri nama “Model” karena kita akan menambahkan beberapa class untuk model data kita. Sekarang tampilannya akan seperti dibawah ini:

Creating a group for the model

Sebelum kita mulai, berikut ini bagaimana kita akan mengatur proyek kita:

1. ScaryBugData : berisi nama serangga dan peringkat
2. ScaryBugDoc: Berisi gambar full size, thumbnail, ScaryBugData

Kenapa kita mengatur seperti ini agar mudah dalam memfollow up tutorial ini, dimana kita akan menyimpan data ke disk drive, mengimplementasikan file sharing, dan lain2.

Model Data: Implementasi

Ok, mari kita mulai! Control-klik pada Model grup dan klik “New File..”.Pilih iOS- Cocoa Touch- Objective-C class template, dan klik Next.

Creating a file with the Objective-C class template

Masukkan nama classnya ScaryBugData, masukkan NSObject untuk subclass, dan klik Next.

Creating a class that derives from NSObject in Xcode

Di jendela popup yang terakhir, pilih Create. Jika semuanya berjalan dengan lancar, Project Navigator anda akan terlihat seperti dibawah ini:

Project organization, part 3

Ok, sekarang saatnya membuat ScaryBugData class. Ubah ScaryBugData.h menjadi seperti dibawah ini:

#import <Foundation/Foundation.h>

@interface ScaryBugData : NSObject

@property (strong) NSString *title;
@property (assign) float rating;

- (id)initWithTitle:(NSString*)title rating:(float)rating;

@end

Sebenarnya ini adalah sesuatu yang simple – kita hanya mendeklarasikan suatu object dengan dua properties – string untuk nama serangga dan tipe data float untuk merating seberapa menakutkan serangga tersebut. Kita menggunakan dua properti attribut untuk ini:

  • strong:  ini menspesifisikan bahwa runtime harus secara otomatis menjaga referensi strong pada object tersebut. Atau dengan kata lain, kita menginginkan agar ARC runtime tetap mengkeep object di dalam memori selama ada referensi, dan men-deallocate ketika tidak ada referensi lagi. Untuk informasi lebih detail, silahkan lihat Beginning ARC in iOS 5 Tutorial.
  • assign:  ini berarti property di set secara langsung, tanpa ada keterlibatan dari memory management. Ini yang biasa kita set untuk tipe data primitive (non-object) seperti float.

Kita juga mendefinisikan initializer untuk class ini, supaya kita bisa menset title dan rating ketika kita membuat suatu serangga.

Buka ScaryBugData.m dan ubah seperti dibawah ini:

#import "ScaryBugData.h"

@implementation ScaryBugData

@synthesize title = _title;
@synthesize rating = _rating;

- (id)initWithTitle:(NSString*)title rating:(float)rating {
    if ((self = [super init])) {
        self.title = title;
        self.rating = rating;
    }
    return self;
}

@end

Simple bukan? Kita men-synthesize properties, dan membuat initializer kita untuk mengisi instance variables dari passed-in parameters, perhatikan bahwa dealloc tidak diperlukan karena kita menggunakan ARC.

Ok, selesai untuk ScaryBugData. Sekarang lakukan langkah yang sama seperti diatas untuk membuat subclass NSObject lain, kali ini kita namakan ScaryBugDoc.

Ubah ScaryBugDoc.h menjadi seperti dibawah ini:

#import <Foundation/Foundation.h>

@class ScaryBugData;

@interface ScaryBugDoc : NSObject

@property (strong) ScaryBugData *data;
@property (strong) UIImage *thumbImage;
@property (strong) UIImage *fullImage;

- (id)initWithTitle:(NSString*)title rating:(float)rating thumbImage:(UIImage *)thumbImage fullImage:(UIImage *)fullImage;

@end

Tidak ada sesuatu yang khusus pada langkah ini, hanya membuat suatu instance variables/properties dan sebuah initializer.

Ubah ScaryBugDoc.m seperti dibawah ini:

#import "ScaryBugDoc.h"
#import "ScaryBugData.h"

@implementation ScaryBugDoc
@synthesize data = _data;
@synthesize thumbImage = _thumbImage;
@synthesize fullImage = _fullImage;

- (id)initWithTitle:(NSString*)title rating:(float)rating thumbImage:(UIImage *)thumbImage fullImage:(UIImage *)fullImage {   
    if ((self = [super init])) {
        self.data = [[ScaryBugData alloc] initWithTitle:title rating:rating];
        self.thumbImage = thumbImage;
        self.fullImage = fullImage;
    }
    return self;
}

@end

OK..model data kita sudah selesai. Sekarang kita akan membuat beberapa sample data dan menampilkannya di table view.

 

Daftar serangga yang berbeda dari yang biasanya

Pertama-tama,  kita setup dulu table view kita supaya bisa menampilkan list dari ScaryBugDocs. Yang harus kita lakukan pertama kali adalah memodifikasi table view kita supaya bisa menampilkan baris yang dynamic (daripada harus menghard code baris dari template yang sudah disiapkan)

Langkahnya, buka MainStoryboard.storyboard. Ini membuat kita bisa melihat layout “screen” dari aplikasi kita. Seperti yang bisa kita lihat, app ini sudah disetup untuk memiliki satu navigation controller (sesuatu yang mempermudah perpindahan antara screen), dengan root controller adalah “master” screen, dan secondary controller adalah “detail” screen.

Main Storyboard layout

Plih Master View Controller, dan pada selection area di panel kiri, pilih table view. Di bagian inspector sebelah kanan, pastikan Content diset ke Dynamic Protoypes.

Setting table view to use dynamic prototype cells

Setting ini yang membuat kita bisa mendesign single cell dari table view seperti yang kita inginkan di Storyboard editor, dan dengan mudah membuat instance dari cell melalui coding. Kita hanya ingin cell yang standar, jadi sekarang kita pastikan style yang kita gunakan adalah Basic.

Pilih Table View Cell di sebelah kiri, dan pada Atrributes Inspector pastikan Style di set ke Basic. Dan juga set Identifer menjadi MyBasicCell.

Setting cell style and reuse identifier

Untuk informasi lebih detail mengenai pembuatan custom cells, silahkan lihat tutorial kami Beginning Storyboards in iOS 5 Tutorial.

Ok, karena kita sudah mensetup table view kita secara visual, kita hanya perlu mengupdate code programmnya untuk mengisi table kita dengan daftar dari serangga-serangga.

Kita akan menyimpan ScaryBugDocs kita kedalam suatu NSMutableArray, yaitu koleksi class yang digunakan untuk array yang sizenya bisa berubah secara dinamis.

Tambahkan baris dibawah ini ke dalam MasterViewController.h, antara baris @interface dan @end :

@property (strong) NSMutableArray *bugs;

Ini akan menjadi instance variable/property yang kita gunakan untuk mentrack daftar serangga kita.

Sekarang buka MasterViewController.m dan ubah seperti dibawah ini:

// Pada baris paling atas
#import "ScaryBugDoc.h"
#import "ScaryBugData.h"

// Setelah @implementation
@synthesize bugs = _bugs;

// baris paling akhir di viewDidLoad
self.title = @"Scary Bugs";

// Ganti return di shouldAutorotateToInterfaceOrientation menjadi :
return YES;

// Ganti return di tableView:numberOfRowsInSection menjadi:
return _bugs.count;

// Ganti tableView:cellForRowAtIndexPath menjadi :
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:@"MyBasicCell"];
    ScaryBugDoc *bug = [self.bugs objectAtIndex:indexPath.row];
    cell.textLabel.text = bug.data.title;
    cell.imageView.image = bug.thumbImage;
    return cell;
}

Ok, ini menarik untuk kita diskusikan..!

Pertama-tama, perhatikan bahwa kita menset sendiri property “title” menjadi “Scary Bugs”. Title adalah special built-in property dari view controllers. Ketika Navigation Controller menampilkan sebuah view controller, dia juga menampilkan apapun “title” property yang ada di title bar. Jadi dengan menset ini, kita seharusnya melihat “Scary Bugs” di title atas!

Selanjutnya, perhatikan bahwa kita membuat return menjadi yes pada bagian shouldAutorotateToInterfaceOrientation, dimana ini memberi instruksi kepada OS bahwa kita akan mensupport semua orientasi baik Portrait, Landscape, dan kebalikannya masing-masing. Kita hanya perlu melakukan langkah ini , dan dikarenakan class ini adalah UITableViewController, maka view nya akan berputar secara otomatis!

Kemudian, ketika membuat table view dengan baris yang dinamis kita harus mengubah numberOfSectionsInTableView dan numberOfRowsInSection untuk memberitahu OS berapa banya section/baris yang harus ditampilkan di table view. Karena kita hanya memiliki 1 section, kita tidak perlu mengubah apa-apa karena templatenya sendiri sudah mensetup 1 section. Untuk baris, kita hanya perlu mengembalikan jumlah object yang ada di array serangga kita.

Terakhir, kita mengimplement tableView:cellForRowAtIndexPath, dimana ini adalah method yang paling penting dalam pembuatan table view. Disini kita mensetup cell yang akan ditampilkan untuk baris tertentu. OS akan memanggil method ini satu persatu untuk setiap baris sehinga kita bisa mensetup nya.

Mari kita lihat method nya secara detail karena ini merupakan topik yang penting :

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:@"MyBasicCell"];
    ScaryBugDoc *bug = [self.bugs objectAtIndex:indexPath.row];
    cell.textLabel.text = bug.data.title;
    cell.imageView.image = bug.thumbImage;
    return cell;
}

Baris pertama memanggil fungsi bantuan dengan nama “dequeueReusableCellWithIdentifier” yang akan mengembalikan reusable cell. Apa artinya ini?

Ini adalah informasi penting untuk mengoptimalkan performance. Perlu diketahui bahwa table view dapat berisi jumlah baris yang sangat besar, tapi hanya beberapa saja yang ditampilkan di layar dalam satu waktu. Jadi, daripada kita membuat suatu cell baru setiap ada baris baru yang muncul di layar, OS bisa meningkatkan performance dengan menggunakan cell yang sudah pernah dibuat, tapi tergulung keluar layar.

Jadi itu yang dimaksud dengan dequeueReusableCellWithIdentifier. Jika tidak ada cell yang bisa digunakan, kita bisa membuat cell baru yang sudah kita setup di Interface Builder (ingat tadi kita sudah menset Basic dan memberi nama “MyBasicCell”?).

Di editor storyboard kita bisa meng-customize layout/tata letak dari suatu cell, atau menggunakan built-in yang tersedia. Dalam tutorial ini, kita memilih basic style, yang menambahkan label dan gambar yang bisa kita set.

Jika anda ingin tahu lebih mengenai beberapa opsi tampilan standard dari table view cell, silahkan lihat “Standard Styles for Table-View Cells” section pada tutorial Table View Programming Guide

Terakhir, kita mengconfigure cell dengan menset textLabel dan imageView (tersedia pada pilihan Basic style).

Percaya atau tidak, hanya itu yang kita perlu lakukan! Sekarang kita hanya perlu mensetup beberapa sample data untuk ditampilkan di table view.

Gambar-Gambar Serangga yang menyeramkan!

Untuk memperoleh gambar-gambar serangga, anda bisa mencarinya di internet atau mendownload dari Scary Bug Pictures yang saya temukan di  stock.xchng

Setelah anda mendownload atau anda memiliki koleksi sendiri, drag gambar-gambar tersebut ke root dari Project Navigator. Ketika muncul popup, pastikan “Copy items into destination group’s folder (if needed)” dicentang, kemudian click Finish.

Adding scary bugs files to project

Kemudian buka AppDelegate.m dan ubah seperti dibawah ini:

// Di baris paling atas
#import "MasterViewController.h"
#import "ScaryBugDoc.h"

// Pada awal dari application:didFinishLaunchingWithOptions
ScaryBugDoc *bug1 = [[ScaryBugDoc alloc] initWithTitle:@"Potato Bug" rating:4 thumbImage:[UIImage imageNamed:@"potatoBugThumb.jpg"] fullImage:[UIImage imageNamed:@"potatoBug.jpg"]];
ScaryBugDoc *bug2 = [[ScaryBugDoc alloc] initWithTitle:@"House Centipede" rating:3 thumbImage:[UIImage imageNamed:@"centipedeThumb.jpg"] fullImage:[UIImage imageNamed:@"centipede.jpg"]];
ScaryBugDoc *bug3 = [[ScaryBugDoc alloc] initWithTitle:@"Wolf Spider" rating:5 thumbImage:[UIImage imageNamed:@"wolfSpiderThumb.jpg"] fullImage:[UIImage imageNamed:@"wolfSpider.jpg"]];
ScaryBugDoc *bug4 = [[ScaryBugDoc alloc] initWithTitle:@"Lady Bug" rating:1 thumbImage:[UIImage imageNamed:@"ladybugThumb.jpg"] fullImage:[UIImage imageNamed:@"ladybug.jpg"]];
NSMutableArray *bugs = [NSMutableArray arrayWithObjects:bug1, bug2, bug3, bug4, nil];

UINavigationController * navController = (UINavigationController *) self.window.rootViewController;
MasterViewController * masterController = [navController.viewControllers objectAtIndex:0];
masterController.bugs = bugs;

Disini kita hanya menggunakan initializer ScaryBugDoc untuk membuat 4 sample serangga, membuat title, rating dan gambar untuk setiap serangganya. Kita menambahkan semuanya ke dalam NSMutableArray, dan menset nya ke dalam table view.

Sebenarnya, kita juga bisa mendapat pointer ke RootViewController karena kita tahu ini adalah controller pertama dari stack navigation controller. Memang ada cari lain untuk mendapatkan pointernya, tapi sepertinya ini adalah cara yang paling gampang.

Selesai sudah! Complile dan run app nya, dan jika semua berjalan dengan baik, anda bisa melihat daftar dari serangga yang menakutkan di table view!

Scary Bugs Table View

Apa selanjutnya setelah ini?

Ini  adalah sample projectnya dengan semua code yang sudah kita buat sejauh ini.

Silahkan infokan ke saya jika ada dari tutorial diatas yang membingungkan atau anda ingin saya menampilkan lebih detail mengenai apapun.

Pada seri berikutnya, kita akan membahas bagaimana membuat detail view dari serangga-serangga supaya kita bisa mengedit dan merating nya!

 

Tag: , , ,