Feb 262014
 

In some case we want to track mouse movement in table view cell. This can be done by subclassing the NSTableViewCell if the table is view type class.

The idea in this example is to show ‘Order fruit’ button only when the mouse is move into the fruit cell. Code below how this is done by subclassing NSTableViewCell.


@implementation WLFruitCellView
{
    NSTrackingArea *_trackingArea;
}

- (void)awakeFromNib{
    [self createTrackingArea];
    
    //hide the button first
    [self.eatButton setHidden:YES];
}


/**
 Create tracking area when mouse move in
 */
- (void)createTrackingArea
{
    _trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp owner:self userInfo:nil];
    [self addTrackingArea:_trackingArea];
    
    NSPoint mouseLocation = [[self window] mouseLocationOutsideOfEventStream];
    mouseLocation = [self convertPoint: mouseLocation
                              fromView: nil];
    
    if (NSPointInRect(mouseLocation, [self bounds]))
    {
        [self mouseEntered: nil];
    }
    else
    {
        [self mouseExited: nil];
    }
}

- (void)drawRect:(NSRect)dirtyRect
{
	[super drawRect:dirtyRect];
	
    // Drawing code here.
}

- (void)mouseEntered:(NSEvent *)theEvent{
    
    self.eatButton.title = [NSString stringWithFormat:@"Order %@", self.textField.stringValue];
    [self.eatButton setHidden:NO];
    NSLog(@"Entered '%@'", self.textField.stringValue);
}

- (void)mouseExited:(NSEvent *)theEvent{
    [self.eatButton setHidden:YES];
    NSLog(@"Exited '%@'", self.textField.stringValue);
}

Below is example project for tracking mouse in NSTableView or NSOutlineView, the method is same which is subclass NSTableViewCell. In this project binding is used for displaying fruits content.

Apr 262013
 

Dalam pos kali ini saya akan terangkan bagaimana untuk buat table dalam Mac OSX.

Apa yang akan dipelajari adalah
– NSTableView
– Delegate

Pertama sekali anda perlu faham maksud delegate. Contoh yang ringkas adalah delegate atau wakil untuk
sesebuah negara atau organisasi. Mereka bertindak /bercakap sebagai wakil bagi negara atau organisasi tersebut.

Begitu juga delegate untuk objective-c, contohnya class NSTableView juga menggunakan delegate untuk
– mendapatkan data-data untuk display table daripada delegate.
– memberitahu table telah diclick kepada delegate.
dan sebagainya.

1. Pertama sekali, buat Xcode projek baru dan pilih Cocoa Application dalam OS X. Pastikan Use Automatic Reference Counting dicheck. Namakan nama projek BasicTable.

2. Kemudian pergi ke MainMenu.Xib dan tambah table view ke main window. Kemudian double click kedua2 colum header dan namakan ia Nama dan Kerjaya.

Drag Table dari Object Library ke window

Table yang telah didrag dari Object Library ke window

3. Pergi ke AppDelegate.h , dan tengok di , semua yang berada dalam kurungan <> adalah untuk menunjukkan class ini iaitu AppDelegate adalah delegate kepada NSApplication.

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject

@property (assign) IBOutlet NSWindow *window;

@end

4. Buat NSMutableArray property bernama persons di AppDelegate.h

5. Sekarang kita mahu tambah table view delegate pula. Tambah code seperti di bawah. NSTableViewDataSource bermakna table view (dari NSTableView) akan wakilkan AppDelegate untuk mendapatkan maklumat untuk display table dan NSTableViewDelegate pula adalah untuk programmer melakukan aksi yang sepatutnya setelah table row diclick, didrag dan sebagainya. Untuk mengetahui apa function yang disediakan oleh delegate ini, guna Command Key + Left Mouse pada delegate. Code akhir untuk AppDelegate.h adalah seperti di bawah.

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource, NSTableViewDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (nonatomic, strong) NSMutableArray *persons;

@end

6. Sekarang anda perlu connect table ke AppDelegate.h. Tekan Assistant Editor dan AppDelegate.h akan terbuka bersebelahan dengan MainMenu.xib. Pastikan table view dihighlight di Document Outline. Untuk connect outlet, hold Ctrl key kemudian drag table view ke AppDelegate.h menggunakan mouse. Namakan ia sebagai tableView(Sila refer   Simple Calculator  jika anda mempunyai masalah sehingga step ini)

Xcode 5 copy

Drag table view dari IB ke AppDelegate.h

Namakan table view IBOutlet sebagai tableView

Namakan table view IBOutlet sebagai tableView

7. Cuba run tetapi masih tiada apa akan berlaku. Sebelum ini anda connect tableView ke AppDelegate, tetapi anda masih belum set delegate untuk tableView itu. Ada dua cara untuk set delegate iaitu dari Interface Builder atau guna code.

8. Untuk set delegate guna code, pergi ke AppDelegate.m dan tambah code seperti berikut

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    self.tableView.delegate = self;  //atau sama juga [self.tableView setDelegate:self]
    self.tableView.dataSource = self;
}

9. Try run program. Anda dapati pada ruangan output seperti berikut:
*** Illegal NSTableView data source (). Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:
Ini kerana anda telah set delegate untuk table tetapi tidak implement di dalam AppDelegate.

10. Untuk hilangkan warning ini, tambah dua method tersebut dalam AppDelegate.m

//NSTableView tanya berapa bilangan row untuk table
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{

}

//NSTableView tanya object (string dsb) untuk didisplay bagi setiap colum dan row
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

}

11. Apabila run sekali lagi, tiada lagi warning kerana kita telahpun implement method yang diperlukan walaupun masih tidak melakukan apa-apa. Sekarang kita akan buat array untuk digunakan oleh table.
Ubah code dalam AppDelegate.m anda supaya seperti di bawah.

#import "AppDelegate.h"

NSString *NameKey = @"nameKey";
NSString *KerjayaKey = @"kerjayaKey";

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    self.tableView.delegate = self;
    self.tableView.dataSource = self;

    self.persons = [NSMutableArray array];

    NSDictionary *Zakir = @{NameKey: @"Zakir", KerjayaKey: @"Cikgu"}; //cara lama:
    NSDictionary *Husin = @{NameKey: @"Husin", KerjayaKey: @"Peguam"};
    NSDictionary *Hasan = @{NameKey: @"Hasan", KerjayaKey: @"Pensyarah"};

    [self.persons addObject:Zakir];
    [self.persons addObject:Husin];
    [self.persons addObject:Hasan];

}

//NSTableView tanya berapa bilangan row untuk table
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{

}

//NSTableView tanya object (string dsb) untuk didisplay bagi setiap colum dan row
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{

}

@end

Code Explanation:
line 3-4: Kita hanya declare constant untuk digunakan pada dictionary key. Kemungkinan untuk tersalah taip berkurang jika ia akan banyak digunakan.
line 14: Initialize array.
line 15-19: Buat dictionary untuk setiap person, dalam dictionary itu ada ada nama dan kerjaya.
line 21-23: Masukkan setiap dictionary yang dibuat ke dalam persons array.

12. Untuk tableView mendapatkan data supaya kita berfungsi, kita perlu tambah code dalam method numberOfRowsInTableView: dan tableView:objectValueForTableColumn:. Tambah code seperti dibawah

//NSTableView tanya berapa bilangan row untuk table
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    //bilangan row adalah sebanyak bilangan person
   return  [self.persons count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSString *value;
    if ([tableColumn.identifier isEqualToString:@"name"]) {
        value = self.persons[row][NameKey]; //atau sama juga: [[self.persons objectAtIndex:row] valueForKey:NameKey];
    }
    else if ([tableColumn.identifier isEqualToString:@"kerjaya"]) {
        value = self.persons[row][KerjayaKey];
    }
    return value;
}

Code Explanation:
line 4 &7 : Table column identifier di cek supaya sama ada nama atau kerjaya
line 5 &8 : Set value untuk ambil data daripada, dari array untuk index ke row dan key NameKey atay KerjayaKey.

13. Run program. Tetapi nampaknya masih tiada apa yang berlaku. Ini disebabkan kita masih belum set identifier untuk table column. Pergi semula ke IB, highlight column Nama dan Kerjaya, dan set identifier di Identity Inspector sebagai ‘name’ dan ‘kerjaya’. Ambil perhatian bahawa identifier key ini tidak berkaitan dengan NameKey atau KerjayaKey constant. Anda boleh guna apa-apa nama sahaja.

Select table column dan set identifier di Identity Inspector

Select table column dan set identifier di Identity Inspector

14. Run dan sepatutnya anda dapat lihat table dengan person data yang dibuat. Bagaimana kalau nak tambah data? Jawapannya adalah dengan modify persons array kemudian reload data. Untuk demo secara ringkas, tambah push button di IB dan create IBAction di AppDelegate.m dan namakan ia addPerson.

Drag Add Person button to AppDelegate.m and name it addPerson

Drag Add Person button to AppDelegate.m and name it addPerson

15. Dalam addPerson:, ubah code menjadi seperti berikut

- (IBAction)addPerson:(id)sender {
    [self.persons addObject:@{NameKey: @"Ali", KerjayaKey: @"Jurutera"}];
    [self.tableView reloadData];
}

Code Explanation:
Kita lihat dalam code ini kita tambah NSDictionary baru, kemudian data direload supaya numberOfRowsInTableView: dan tableView:objectValueForTableColumn:row: dipanggil untuk update table.

16. Run dan tekan Add Person, jika anda tekan berkali-kali person baru akan sentiasa bertambah. Jika mahu tambah data person selain Ali, perlu lagi ubah code ini. Tetapi setakat ini cukuplah untuk tahu bagaimana menggunakan table.

Tekan Add Person untuk tambah data

Tekan Add Person untuk tambah data

Mar 152013
 

Pada artikel ini saya akan terangkan antara class yang penting dan kerap digunakan untuk programming objective c iaitu

NSString, NSArray dan NSDictionary.

Pertama sekali, perlu diketahui dalam sesetengah class dalam Cocoa terbahagi kepada mutable dan non-mutable.
Contohnya, NSString dan NSMutableString, NSArray dan NSMutableArray, serta NSDictionary dan NSMutableDictionary.

Perbezaan antara mutable dan non- mutable adalah kandungan dalam mutable class boleh diubah.
Contohnya dengan menggunakan NSMutableArray anda boleh menambah atau buang objek di dalam NSMutableArray tetapi tidak dengan menggunakan NSArray.

1. String
Declare string adalah mudah sahaja seperti berikut.

NSString *aString = @"I have declared a string";

Code Explanation:
Untuk menggunakan NSString, mesti declare dengan format @””

2. Array
Untuk declare array,


//Declare array kosong
NSArray *emptyArray = [NSArray array];

//declare array that have string objects in it
NSArray *array1 = [NSArray arrayWithObjects:@"ali", @"abu", @"ahmad", nil];
//declare array that have string objects in it
NSArray *array2 = @[@"ali", @"abu", @"ahmad"];

//Access array at index 1, will return abu
NSString *aString = [array1 objectAtIndex:1];
NSString *aString2 = array1[0];

//Create mutable array
 NSMutableArray *aMutableArray = [NSMutableArray array];

//Tambah objek ke dalam aMutableArray
[aMutableArray addObject:@"ali"];
 [aMutableArray addObject:@"abu"];
 [aMutableArray addObject:@"ahmad"];

//akses string pada index pertama
 NSString *aString3 = aMutableArray[0];

//print ke output
NSLog(@"array1 = %@", array1");
NSLog(@"array1 pada index 1 = %@", aString);
NSLog(@"array2 pada index 0 = %@", aString2);
NSLog(@"aMutableArray pada index 0 = %@", aString3);

Code Explanation:
line 2: kita hanya declare array yang kosong, maksudnya tiada object di dalam array ini.
line 4: kita declare array mengandungi NSString object, kita faham adalah NSString object dengan notation @””
line 7:, ia juga adalah sama seperti line ke 4 tetapi, ia adalah cara baru untuk create array, ia lebih mudah dan pendek. Untuk akses objek dalam array, kita menggunakan format ini [array objectAtIndex:theIndex] ataupun cara baru yang lebih pendek iaitu array[theIndex] seperti line 10 dan 11.

line 13 – 16: kita declare mutable array, maksudnya ia boleh diubah. Kita tambah string kedalam array dengan menggunakan addObject:. Cuba anda guna addObject untuk NSArray class dan tentunya error kerana object dalam NSArray class tidak boleh diubah.

Satu kelebihan array dalam objective-c adalah anda boleh masukkan semua jenis class(semua class inherit daripada NSObject) ke dalam array tersebut. Boleh juga jika mahu masukkan class yang berlainan dalam satu array contohnya masukkan NSNumber pada index 0, NSDictionary pada index 1 dan sebagainya.

Anda boleh cuba masukkan code diatas dalam applicationDidFinishLaunching: pada AppDelegate.m dan lihat hasilnya.

3. Dictionary
Jika NSArray menyimpan data secara berturutan, NSDictioanary pula menyimpan data secara key dan value. Berikut adalah contoh menggunakan NSDictionary


//Create dictionary dengan key name, age, phone
NSArray *objects = @[@"ali", @"16", @"0147763269"];
NSArray *keys = @[@"name", @"age", @"phone"];
NSDictionary *person = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

//Cara baru create dictionary
NSDictionary *person2 = @{@"name": @"Ali", @"age" : @"16", @"phone" : @"0147763269"};

//Seperti array juga, NSDictionary tidak boleh boleh diubah contentnya,
//kita perlu menggunakan NSMutableDictionary jika mahu tambah key-value baru

//Create NSMutableDictioanary
 NSMutableDictionary *person3 = [NSMutableDictionary dictionary];
 [person3 setValue:@"ali" forKey:@"name"];
 [person3 setValue:@"16" forKey:@"age"];
 [person3 setValue:@"0147763269" forKey:@"phone"];

//Untuk akses value dalam dictionary, kita menggunakan format berikut
//Cara lama
NSString *name = [person3 valueForKey:@"name"];

//ataupun cara baru yang lebih pendek
NSString *name2 = person[@"name"];

NSLog(@"value untuk name = %@", name2);

4. Combination

Ketiga-tiga class yang telah diterangkan amat penting dan selalu digunakan dalam coding. Sekarang kita gabung ketiga2 class tersebut


//Declare 3 dictionary
NSDictionary *aliDict = @{@"name": @"Ali", @"age" : @"16", @"phone" : @"0147763269"};
NSDictionary *abuDict = @{@"name": @"abu", @"age" : @"23", @"phone" : @"0157773902"};
NSDictionary *ahmadDict = @{@"name": @"ahmad", @"age" : @"43", @"phone" : @"0140763264"};

//Declare array dan masukkan ketiga2 dictionary diatas ke dalamnya
NSMutableArray *personArray = [NSMutableArray array];
[personArray addObject:aliDict];
[personArray addObject:abuDict];
[personArray addObject:ahmadDict];

//Dapatkan value untuk name
NSArray *names = [personArray valueForKey:@"name"];

//print setiap name dalam names
for (NSString *nameStr in names) {
    NSLog(@"%@", nameStr);
}

Code Explanation:
line 1-11: kita hanya declare 3 dictionary untuk ali, abu dan ahmad kemudian masukkan dictioanary tersebut ke dalam array.
line 14: Pada line ini kita menggunakan valueForKey:, seperti yang anda tahu personArray bukannya dictionary. Tetapi valueForKey: untuk NSArray adalah sangat berguna, ia membolehkan anda mendapatkan setiap value daripada content dan return dalam bentuk array.
line 17-19: Pada line 17 kita menggunakan fast enumeration, dengan fast enumeration ia akan loop setiap object di dalam array. Pada line 17-19, ia loop object di dalam array names dan print ke output

Anda boleh cuba tukar key pada line ke 14 kepada @”age” atau @”phone” dan lihat output yang terhasil

Download Xcode project berdasarkan contoh diatas

Mar 102013
 

Salam,

Dalam post ni, saya akan ajar bagaimana untuk buat Simple Calculator app guna Xcode
Anda akan belajar beberapa perkara

1. Cara menggunakan interface builder
2. Cara connect interface builder dengan code
3. NSButton, NSPopUpButton, NSTextField

1. Buat projek baru Xcode dan pilih Cocoa Application, pada product name guna SimpleCalculator (tak kisah pn apa nama sebenarnya)

)Xcode 10

2. Pastikan uncheck Use Core Data dan check Use Automatic Reference Counting.

*Core Data adalah untuk app yang berasas database. Automatic Reference Counting (ARC) membolehkan kita tidak perlu fikir banyak pasal memory management kerana compiler yang ambil tugas itu.

3. Apabila project telah dibuat, pergi ke MainMenu.xib (xib dalam sebutan dipanggil nib). Apa yang anda lihat dipanggil Interface Builder (IB).

4. Object Library adalah dimana object yang akan diguna untuk interface.

SimpleCalculator.xcodeproj — MainMenu

Interface Builder

4. Pada Object Library, drag object supaya menjadi seperti rajah di bawah. Pada Object Library anda boleh search di bawahnya dan drag ke SimpleCalculator Window

Text Field (NSTextField)
Pop Up Button (NSPopUpButton)
Label (NSTextField)
Push Button (NSButton)

5. Tukar title supaya menjadi seperti dibawah. Anda boleh tukar title dengan double click pada object ataupun dengan tukar title di Attributes Inspector.

Xcode 8

Object yang telah di drag ke Window

5. Tekan butang Run dan anda ia akan memaparkan Window seperti yang telah dibuat di IB tetapi ia masih tidak boleh melakukan apa2.

6. Pada pop up button, kita mahu ia sebagai math operator, double click pada popup button, kemudian double click setiap menu item dan namakan seperti rajah di bawah.

Pada mulanya anda hanya ada 3 menu item, untuk tambah satu lagi menu item, click pada mana2 menu item. Kemudian copy dan paste menggunakan keyboard.

Menu items dalam pop up button

Menu items dalam pop up button

7. Bahagian interface sudah siap. Sekarang kita perlu connect object di dalam IB kepada AppDelegate. Untuk ini tekan Assistant Editor

Xcode

8. Selepas tekan Assistant Editor, sepatutnya view akan terbahagi 2 bahagian seperti di bawah.

SimpleCalculator

9. Untuk connect setiap object ke AppDelegate, hold Ctrl key, kemudian drag object ke AppDelegate.h menggunakan mouse.

Xcode 6

Connect outlet by dragging from IB to AppDelegate.h

10. Pastikan Connection adalah Outlet untuk setiap object melainkan Calculate button gunakan connection Action.

Xcode 4

11. Setelah siap setiap nama sepatutnya seperti berikut.

*IBOutlet bermaksud sesuatu property itu diconnect dengan IB supaya kita boleh mendapat value dan sebagainya. manakala IBAction bermaksud sesuatu Action (method) akan dipanggil setelah diclick di interface

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *firstTextField;
@property (weak) IBOutlet NSPopUpButton *operatorPopup;
@property (weak) IBOutlet NSTextField *secondTextField;
@property (weak) IBOutlet NSTextField *resultTextField;

- (IBAction)calculate:(id)sender;

12. Sekarang pergi ke AppDelegate.m, anda akan dapati – (IBAction)calculate:(id)sender. Ia secara automatik dibuat oleh Xcode selepas di connect.

13. Sekarang dalam AppDelegate.m tambah seperti dibawah.

- (IBAction)calculate:(id)sender
{
    NSLog(@"In calculate method!");
}

14. Kemudian Run dan tekan butang Calculate. Jika betul maka dalam Output Area iaitu bahagian bawah akan tertulis seperti berikut

2013-03-09 13:53:32.758 SimpleCalculator[4680:303] In calculate method!

14. Dalam method calculate:, tukar code menjadi seperti di bawah

- (IBAction)calculate:(id)sender {
    NSLog(@"In calculate method!");
    CGFloat firstNumber = self.firstTextField.floatValue;
    CGFloat secondNumber = self.secondTextField.floatValue;
    CGFloat result = 0;

    switch (self.operatorPopup.indexOfSelectedItem) {
        case 0: //X
            result = firstNumber * secondNumber;
            break;
        case 1: // /
            result = firstNumber / secondNumber;
            break;
        case 2: //+
            result = firstNumber + secondNumber;
            break;
        case 3: //-
            result = firstNumber - secondNumber;
            break;
        default:
            break;
    }
    self.resultTextField.floatValue =result;
}

15. Run dan cuba kalculator yang telah siap!

16. Dalam code ni mula2 kita ambil nilai daripada textfield di IB dan masukkan dalam firstNumber dan secondNumber.

17. Kemudian untuk tahu operator mana yang dipilih kita gunakan switch dan method dari NSPopupButton indexOfSelectedItem. Index adalah bermula dari 0, daripada nilai index kita buat operasi yang sewajarnya ke dalam variable result.

18. Akhirnya nilai result di pas ke resultTextField untuk update interface.

*Jika tak faham sesuatu fungsi, documentation sangatlah berguna. Pada bahagian sebelah kanan di Quick Help, apabila anda tekan cursor mouse contohnya di indexOfSelectedItem. Quick Help akan tulis description untuk indexOfSelectedItem. Kemudian tekan NSPopUpButton Class Reference untuk maklumat lebih lanjut tentang class NSPopUpButton ni.

Quick Help

Quick Help

Jan 302013
 

Kepada sesiapa yang baru nak belajar objective c daripada Java background atau dari language lain, ini presetation slide yang bagus untuk permulaan.

http://www.slideshare.net/bobmccune/ob-4933190

Slide ni tahun 2010 lagi masa iOS 4, tapi masih lagi boleh guna. Sejak ios 5 dah tak perlu fikir pasal memory management dalam kebanyakan kes sebab semua dah di manage oleh Automatic Reference Counting atau ARC.

Jan 272013
 

Biasanya programming language menggunakan dot syntax untuk panggil method atau dapatkan property.

contohnya,

//get
CGFloat height = box.height;

//set
box.height = 5;

Dengan menggunakan KVC, untuk set atau get

//get
[box setValueForKey:@"height"];

//set
CGFloat height = [box valueForKey:@"height];

Dengan menggunakan KVC ada banyak kelebihan. Contohnya anda ada satu Class Box . Di bawah menunjukkan interface class box, ada 3 properties height, width dan length

@interface Box : NSObject

@property (nonatomic, assign) CGFloat height;
@property (nonatomic, assign) CGFloat width;
@property (nonatomic, assign) CGFloat length;

Contohnya ada satu array yang mempunyai boxes, dan anda nak tambahkan total height.

NSArray *boxes = ... //Initialize boxes height, width, and length

//Cara biasa nak tambahkan total height
CGFloat totalHeight = 0;
for (Box theBox in boxes)
{
    totalHeight += theBox.height
}

//Menggunakan KVC untuk tambah height
CGFloat totalHeight = [[boxes valueForKeyPath:@"@sum.height"] floatValue];

Macam mana, lagi simple bukan? Contoh lagi jika nak hanya widths array

//Menggunakan cara biasa untuk dapatkan widths array
NSMutableArray *widths = [NSMutableArray array];
for (Box theBox in boxes)
{
    [widths addObject:@(theBox.height)];
}

//Menggunakan KVC untuk dapatkan array of widths
NSMutableArray *widths = [boxes valueForKeyPath:@"height"];

Jika anda lihat @sum dinamakan collection operator, ada beberapa lagi collection operator seperti @avg, @min, @max dan @count seperti dalam documentation

Yang menarik adalah boleh juga kalau nak define custom operator sendiri.

Dalam objective c tak semestinya menggunakan KVC tapi ada sesetengah tempat yg lebih baik menggunakan KVC. Dengan menggunakan KVC juga dapat memendekkan lagi code dan juga menjadikan code nampak lebih kemas seperti contoh di atas.

Jan 192013
 

Programming iOS/Mac memerlukan Xcode ide. anda boleh download dengan free di Mac App Store atau mungkin dari tempat lain.

1. Apabila pertama kali buka Xcode, anda akan dipaparkan seperti di bawah. Pilih Create New Project

Intro Xcode 1

2. Kita akan buat OSX application, click Cocoa Application dan tekan Next

Intro Xcode 2

3. Kemudian tulis nama application kat product name ‘Intro’. Pastikan Use Automatic Reference Counting (ARC) dicheck. Dengan ARC kita tidak perlu fikir banyak pasal memory management. Uncheck Core Data, Core Data adalah untuk application yang berasaskan database. Kemudian tekan Next.

Intro Xcode 3

4. Kemudian anda akan dipaparkan seperti gambar di bawah

Screen Shot 2013-01-20 at 9.13.54 AM

5. Di Project Navigator, anda dapat lihat files yang dicreate secara automatik oleh Xcode. Yang perlu diberi perhatian adalah AppDelegate.h, AppDelegate.m dan MainMenu.xib.

6. Dalam objective C, Class file dibahagi kepada ‘.h’ dan ‘.m’. Header file adalah file ‘.h’, ia berfungsi untuk declaration class variable/property. ‘.m’ file pula adalah implementation file, iaitu dimana code body akan ditulis. File separation antara ‘.h’ dan ‘.m’ ini juga menjadikan code nampak lebih bersih.

7. Ambil perhatian bahawa class AppDelegate adalah mula-mula dipanggil selepas App dibuka. Untuk Mac, method pertama yang dipanggil oleh App secara automatik adalah applicationDidFinishLaunching.

8. Pergi ke dalam applicationDidFinishLaunching dan tambah code ini. NSLog() berfungsi untuk log ke console. Ia bersamaan dengan printf() untuk c.

9. Kemudian tekan Run di upper left corner. Pertama sekali anda akan dapati satu window kosong. Abaikan window ini kerana ia tak termasuk dalam tutorial ini. Sila take note satu view baru dibuka dibawah iaitu Debug Area. Di console anda dapati Hello World! ditulis bermakna anda berjaya untuk langkah pertama.

Intro Xcode 5

Jan 182013
 

Sebelum belajar programming untuk iOS/Mac, ada beberapa perkara yang perlu diketahui

Beberapa Kelebihan objective c

1. Tak perlu fikir memory management sebab dihandle secara automatik oleh ARC (kebanyakan kes)

2.  Objective C Adalah subset kpd c language, maksudnya c atau c++ juga boleh diguna selain objective c di XCode

3. Multithreading

Dipanggil Grand Central Dispatch, multithreading untuk Mac/iOS adalah mudah. Dengan GCD, tidak perlu fikir untuk create thread, cuma panggil function dan set untuk di run pada thread yang lain.

4. Animation

Animation di dalam mac/iOS dibahagi kpd implicit dan explicit animation. Implicit animation boleh dikatakan animation yang terjadi dengan automatik. Contohnya jika sesuatu object diubah position. Ia secara auto akan animate ke position yang baru. Untuk explicit animation, satu animation object mesti dibuat terlebih dahulu, explicit animation memungkinkan animation yang lebih advance.

Setiap Animation juga akan secara automatik di run pada thread selain main thread. Ini menjadikan user interface (UI) tidak diblok atau tidak mengganggu kelancaran UI.

5. Dynamic language

Objective c adalah dynamic language. Dengan dynamic language akan memungkinkan code yang ditulis lebih pendek kerana sifat language yang fleksibel. Ia juga menjadikan code lebih baik dan clean.

6. Programming Technology semakin berkembang setiap OS version

Setiap OS/iOS version, akan ada teknologi yang baru daripada Apple. Menariknya kebanyakannya akan lebih memudahkan kita code dengan lebih baik dan setiap API dari apple adalah sangat konsisten menyebabkan lebih senang untuk belajar sesuatu yang baru.

Perkara asas perlu dipelajari

1.Syntax

Belajar objective c syntax adalah paling penting. Ini disebabkan Objective c syntax banyak juga berbeza berbanding programming language lain. Bagaimanapun objective c syntax adalah di design untuk self documenting. Ia membolehkan programmer dapat faham code dengan lebih baik walaupun kurang comment

Contohnya:

Untuk create satu kotak (box), dalam c dan objective c, method syntax adalah

//C
void createBox(float height, float width, float length)
{
    //method body
}

//Objective C
- (void)createBoxWithHeight:(float)height width:(float)width length:(float)length
{
    //method body
}

Untuk panggil method,

//C
createBox(6, 3, 5);

//Objective C
[self createBoxWithHeight:6 width:3 length:5];

Sesiapa yang baru belajar objective c pastinya pening dengan syntax yang digunakan. Tetapi ia convenient dan self documenting. Sebelum semicolon, semuanya adalah sebahagian daripada method, ia adalah sebagai self description yang pendek, kalau letak apa-apa nama pun boleh sebenarnya. Selepas semicolon adalah nilai parameter yang dipass.