Monthly Archives: January 2013

Singleton trong lập trình IOS

I. Thông tin chung:
– Singleton là một design pattern quen thuộc với tất cả mọi người
– Nó cho phép chỉ một instant của class được tạo ra và bạn có khả năng truy cập vào class này bất cứ đâu.
– Đây là một công cụ cực mạnh để chia sẽ dữ liệu giữa những class khác nhau trong cùng một chương trình mà không cần phải đưa dữ liệu qua từng class khác nhau chỉ để đi đến một class nữa..
– Nó còn giúp cho chương trình dễ dàng để bảo trì và thay đổi những thông tin cần thiết. Ví dụ như trong chương trình có giám đốc công ty, giám đốc có thể thay đổi nhưng rất lâu và tỉ lệ rất thấp. Vì vậy nên việc lưu vào trong chương trình là việc nên làm nhưng phải gom lại một chỗ để có thể làm việc dễ dàng hơn. Đây chính là mục đích của design pattern

* Đây là một pattern cực kì hữu ích cho mọi lập trình viên. Dĩ nhiên, pattern này cũng xuất hiện trong iPhone SDK.
* UIApplication có một method gọi là sharedApplication. Nó có thể được gọi ở bất cứ nơi đâu mà vẫn trả về đúng một UIApplication instant trong cùng ứng dụng đang chạy.

II. Nội dung chính:

File LKManager.h:

#import <foundation/Foundation.h>

@interface LKManager : NSObject {
NSString *someProperty;
}

@property (nonatomic, retain) NSString *author;

@property (nonatomic, retain) NSString *authorCompany;

+ (id)sharedManager;

@end

File LKManager.m:

#import “LKManager.h”

@implementation LKManager

#pragma mark Singleton Methods

+ (id)sharedManager {
static LKManager *sharedLKManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedLKManager = [[self alloc] init];
});
return sharedLKManager;
}

– (id)init {
if (self = [super init]) {
author = [[NSString alloc] initWithString:@”Huygamer”];

     authorCompany = [[NSString alloc] initWithString:@”LapKan Company”];
}
return self;
}

– (void)dealloc {
}

@end

Điều này biến nó thành một biến tĩnh (nhưng chỉ với trường hợp này) đã tạo ra một sharedLKManager chỉ được khởi tạo một lần duy nhất trong sharedManager. Cách chúng ta sử dụng để chắc chắn được điều này là dùng dispatch_once method trong Grand Central Dispatch (GCD). Nó là một quá trình an toàn và được xử lý toàn bộ trên tổng thể chương trình được vận hành bởi hệ điều hành để bạn không cần phải lo lắng về việc đó.  Nếu bạn có nhiều hứng thú về GCD và muốn tìm hiểu thêm về GCD thì link này có thể giúp bạn có những hiểu biết về việc quản lý bộ nhớ:

http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1

Trong một số trường hợp nếu bạn không muốn sử dụng GCD thì bạn có thể thay thế bằng đoạn code sau:

+ (id)sharedManager {
@synchronized(self) {
if (sharedLKManager == nil)
sharedLKManager = [[self alloc] init];
}
return sharedLKManager;
}

=> Nó sẽ đồng bộ hóa và xem xét nếu instance của class đã được tạo ra rồi thì sẽ trả về đúng đối tượng đã tạo nếu không thì nó mới tạo mới.

* Những đoạn code viết ở trên là đã sử dụng đến ARC, nếu bạn vẫn còn cổ lỗ xỉ hay chính xác hơn là những ông già lạc hậu trong làng công nghệ (già mà không biết cũng hơi bị lạ nhỉ) thì bạn có thể sử dụng đoạn code sau cho chương trình không sử dụng ARC (non-ARC):

#import “LKManager.h”

static LKManager *sharedLKManager = nil;

@implementation LKManager

@synthesize someProperty;

#pragma mark Singleton Methods
+ (id)sharedManager {
@synchronized(self) {
if(sharedLKManager == nil)
sharedLKManager = [[super allocWithZone:NULL] init];
}
return sharedLKManager;
}
+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedManager] retain];
}
– (id)copyWithZone:(NSZone *)zone {
return self;
}
– (id)retain {
return self;
}
– (unsigned)retainCount {
return UINT_MAX; //denotes an object that cannot be released
}
– (oneway void)release {
// never release
}
– (id)autorelease {
return self;
}
– (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@”Default Property Value”];
}
return self;
}
– (void)dealloc {
// Should never be called, but just here for clarity really.
[someProperty release];
[super dealloc];
}

@end

Bạn có thể sử dụng class Singleton vừa tạo bằng cách gọi nó ra như sau:

MyManager *sharedManager = [MyManager sharedManager];

Tôi thường sử dụng nó trong việc lưu trữ các biến toàn cục để không cần phải set lại trong cả chương trình. Ngoài ra, CoreLocation cũng là một trong số những bạn bè quen thuộc của Singleton, bạn chỉ lấy vị trí của người dùng 1 lần duy nhất và sử dụng trên cả chương trình tránh trường hợp mất mạng và giảm lưu lượng sử dụng rất nhiều. Đối với Core Data cũng vậy, bạn chỉ viết câu lệnh kết nối 1 lần duy nhất và sử dụng cho toàn bộ chương trình.

III. Kết luận:
– Singleton pattern là một pattern cực kì quen thuộc xuất hiện trên hầu hết các chương trình. Tôi cũng rất thường sử dụng Singleton trong các chương trình của tôi để lưu các dữ liệu sử dụng thường xuyên. Ngoài ra, nó cũng có tính tái sử dụng lại rất cao, có thể dùng để lưu những setting căn bản và khi cần chỉ paste lại không cần phải code lại mệt mỏi.

Advertisements

TableView trong IOS (Simple TableView Project)

I. Thông tin chung:

– Nếu là một người sử dụng IOS lâu ngày thì bạn đã xem rất nhiều các ví dụ về table view. Đó chính là ứng dụng “Contact” và “Mail” của Apple (Không chỉ trên Iphone mà trên Ipad cũng là table view). Table View chính là cách tiện lợi nhất để người

– Do đặc tính của table view nên tôi quyết định sẽ giữ nguyên 2 thuật ngữ table và table view trong bài hướng dẫn này cho các bạn làm quen
II. Nội dung chính:
1. Các thứ cần lưu ý khi bắt đầu một table view:
– Number of Sections: Số lượng những phần trong table view. Những phần này được chia theo chiều dọc để làm cho table trở nên dễ hiểu, dễ nhìn hơn
– Number of Rows: Số lượng dữ liệu trong tableview để Xcode chuẩn bị để hiển thị
– Data inside each row: Dữ liệu hiện ra thế nào trong từng dòng

2. Lập trình với table view:
– Bây giờ chúng ta có thể bắt đầu với table view. Đây là các bước để chúng ta bắt đầu làm việc để có được một table view đơn giản:
+ Tạo một khung sườn cho chương trình
+ Tạo ra một vài dữ liệu để đưa vào trong table
+ Tạo ra một table view
+ Kết nối với datasource và delegate của table
+ Hoàn tất vài lệnh tương tác đơn giản với table view

a. Tạo khung sườn cho chương trình:
– Bạn tạo ra một chương trình (New Project)
– Tạo thêm một NSMutableArray lkTableData để lưu trữ dữ liệu.
– Tạo UILabel lblNotice để ghi nhận sự kiện click vào trong từng Cell
– Tạo UITextView txvNotice để ghi ra những thành phần có trong lkTableData

@property (nonatomic, strong) NSMutableArray *lkTableData;
@property (strong, nonatomic) IBOutlet UILabel *lblNotice;
@property (strong, nonatomic) IBOutlet UITextView *txvNotice;

* Trong IB, ta xây dựng các control như sau:
+ Một TableView để hiển thị dữ liệu
+ Một Label để ghi nhận sự kiện
+ Một UITextView để ghi nhận các thành phần có trong lkTableData
* Chúng ta sẽ có như trong hình:

* Lưu ý: Bạn cần phải set up DataSource và Delegate cho TableView để nó có thể chạy được trong chương trình. Bạn nhấn chuột phải vào trong Table View sẽ thấy hình như sau. Lúc này, dataSource và delegate chưa có kết nối. Bạn giữ Ctrl bấm vào cái vòng tròn rồi kéo vào File’s Owner. Sau khi có được hình như thế này là Okie:

b. Tạo dữ liệu mẫu để đưa vào trong table view:
* Khi view được tạo ra chúng ta thêm vào một số những item để test dữ liệu xem có thực sự TableView hoạt động hay không? Và ở đây tôi sẽ hiển thị nó lên trên TextView để chúng ta có thể tham khảo được những item nào có trong lkTableData.

– (void)viewDidLoad
{
[super viewDidLoad];
self.lkTableData = [[NSMutableArray alloc] init];

for (NSUInteger i=0; i<10; i++) {
NSString *dataString = [NSString stringWithFormat:@”Item %d”, i];
[self.lkTableData addObject:dataString];
}

NSString *messageString = [NSString stringWithFormat:@”The lkTableData array contains %@”, self.lkTableData];
_txvNotice.text = messageString;
}

Đầu tiên phải set số section của TableView và số dòng (Row) được hiển thị trong đó.

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.lkTableData count];
}

Set up phần hiển thị trên Table:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *cellIdentifier = @”Cell”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

cell.textLabel.text = [self.lkTableData objectAtIndex:indexPath.row];

return cell;

}

c. Thêm vào các sự kiện:
Đây là sự kiện khi người dùng chạm vào một dòng (row). Ở đây, tôi sẽ thay đổi thông báo lblNotice thành dòng mà người sử dụng chạm vào để chúng ta có thể thấy được việc chúng ta có thể bắt được những sự kiện này thành công:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *messageString = [NSString stringWithFormat:@”You tapped row %d”, indexPath.row];
_lblNotice.text = messageString;
}

III. Kết luận:
– Table view là một trong những hỗ trợ cho người dùng rất tốt để giúp cho chương trình hiển thị đồ họa tốt hơn dễ dàng hơn cho người sử dụng.

Source Code:

Google Drive: https://docs.google.com/file/d/0B3v7a0gMgVkBUG4xamUxWVY1aTQ/edit

Mediafire: http://www.mediafire.com/download.php?u54dk28ybtj540y

Hệ thống nhắc nhở (Notification) trong IOS

IOS có một chức năng như chức năng báo giờ của đồng hồ chính là hệ thống nhắc nhở (Notification). Với hệ thống này, bạn có thể nhắc cho người sử dụng khi đến một thời điểm quan trọng nào đó hay gợi nhớ lại những việc làm trong game mà bạn đã hoàn thành.

Hệ thống này bao gồm có 3 loại:

– Âm thanh: Làm cho thiết bị phát ra âm thanh

– Thông báo hay một banner trên màn hình

– Badge: một con số hay hình ảnh trên Icon của chương trình cho chúng ta biết được chương trình đang có những sự kiện đã được hoàn thành hay cần chúng ta xem qua.

=> Tuy nhiên, đây cũng là một chức năng khá là khó chịu cho những người sử dụng quá nhiều phần mềm, các popup và thông bảo hiện lên rất nhiều. Lần đầu tiên, tôi bị dính cái hệ thống thông báo này là lúc mua Ipad và 12 h chương trình phát âm thanh chỉ vì nó vừa mới cho tôi thêm 1 lần chơi >.<.

Chúng ta có thể chọn Silent Mode và có hình mặt trăng ở bên trái phần đồng hồ để không bị làm phiền.

Kể từ phiên bản IOS 5.0 , chúng ta có thể truy cập vào hệ thống (Notification Center) bằng cách kéo từ trên cùng của màn hình xuống để xem tất cả các thông báo hiển thị

Chương trình chạy nhạc phần 2 (Nâng cấp tuỳ chỉnh lúc nghe nhạc)

I. Thông tin chung:

– Chạy nhạc chỉ sử dụng chương trình của Apple sẽ không cho chúng ta tùy chọn nhiều thứ nên chúng ta có thể thay thế những thuộc tính căn bản của phần nhạc để cho chương trình có thể tùy biến cao hơn. Cụ thể ở đây tôi sẽ chỉ các bạn thay đổi những tốc độ và  âm lượng của bài hát đang chạy. Tôi cũng chỉ các bạn cách lấy một vài chỉ số của bài nhạc đang chạy ra để xem xét.

II. Nội dung chính:

1. Những phần cần chuẩn bị cho việc tạo chương trình:

– Chúng ta bắt đầu:
* Cần phải thêm một vài điều khiển để thể hiện những dữ liệu có được lên màn hình bao gồm:
– 3 UISliders để điều khiển 3 cái là Rate (tốc độ bài hát), Pan () và Volumne (Âm lượng)

– 2 UILabel dùng để thể hiện AVG và Peak

2. Mã nguồn của chương trình:

* Đây là file .h

#import <UIKit/UIKit.h>

#import <AVFoundation/AVFoundation.h>

#import <AudioToolbox/AudioToolbox.h>

@interface MainMindViewController : UIViewController <AVAudioPlayerDelegate>

@property (strong, nonatomic) AVAudioPlayer *LKplayer;

@property (strong, nonatomic) IBOutlet UIButton *LKVibrateButton;

@property (strong, nonatomic) IBOutlet UIButton *LKPlayButton;

@property (strong, nonatomic) IBOutlet UIButton *LKPauseButton;

@property (strong, nonatomic) IBOutlet UISlider *LKSliderVolumne;

@property (strong, nonatomic) IBOutlet UISlider *LKSliderPan;

@property (strong, nonatomic) IBOutlet UISlider *LKSliderRate;

@property (strong, nonatomic) IBOutlet UILabel *LKPeakLabel;

@property (strong, nonatomic) IBOutlet UILabel *LKAverageLabel;

– (IBAction)LKVibratePressed:(id)sender;

– (IBAction)LKPlayPressed:(id)sender;

– (IBAction)LKPausePressed:(id)sender;

– (IBAction)LKVolumneChange:(id)sender;

– (IBAction)LKPanChange:(id)sender;

– (IBAction)LKRateChange:(id)sender;

@end

Đây là file .m

#import “MainMindViewController.h”

@interface MainMindViewController ()

@end

@implementation MainMindViewController

– (void)viewDidLoad

{

[super viewDidLoad];

NSString *fileName = @”MoiHongXaoXuyen”;

NSString *fileType = @”mp3″;

NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:fileType];

NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];

NSError *error;

self.LKplayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];

if (error)

{

NSLog(@”Khong chay duoc file nhac Da bit loi: %@”, error);

}

self.LKplayer.enableRate = YES;

self.LKplayer.meteringEnabled = YES;

self.LKplayer.delegate = self;

self.LKSliderVolumne.value = self.LKplayer.volume;

self.LKSliderRate.value = self.LKplayer.rate;

self.LKSliderPan.value = self.LKplayer.pan;

[self.LKplayer prepareToPlay];

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(updateLabels) userInfo:nil repeats:YES];

}

-(void)updateLabels

{

[self.LKplayer updateMeters];

self.LKAverageLabel.text = [NSString stringWithFormat:@”%f”, [self.LKplayer averagePowerForChannel:0]];

self.LKPeakLabel.text = [NSString stringWithFormat:@”%f”, [self.LKplayer peakPowerForChannel:0]];

}

– (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

}

– (IBAction)LKVibratePressed:(id)sender {

AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

}

– (IBAction)LKPlayPressed:(id)sender {

[self.LKplayer play];

}

– (IBAction)LKPausePressed:(id)sender {

[self.LKplayer pause];

}

– (IBAction)LKVolumneChange:(id)sender {

self.LKplayer.volume = self.LKSliderVolumne.value;

}

– (IBAction)LKPanChange:(id)sender {

self.LKplayer.pan = self.LKSliderPan.value;

}

– (IBAction)LKRateChange:(id)sender {

self.LKplayer.rate = self.LKSliderRate.value;

}

– (void)audioPlayerEndInterruption:(AVAudioPlayer *)player withOptions:(NSUInteger)flags

{

if (flags == AVAudioSessionInterruptionOptionShouldResume)

{

[self.LKplayer play];

}

}

@end

3. Giải thích mã nguồn:

– Chương trình dùng Audio của Apple để chạy nhạc và dùng NSTimer để cập nhật thông tin cho các nhãn (UILabel) hiển thị.

– Ngoài ra, nó còn bắt sự kiện thay đổi của từng UISlider để có sự điều chỉnh những gì đang phát trên Player.

* Lưu ý: Các số Max và Min bạn nên tuỳ chỉnh lại cho phù hợp vì nếu để mặc định sẽ là (Max: 1 và Min: 0) sẽ bị lỗi nếu bạn để Rate của trình phát nhạc xuống còn 0.

Với Rate nên là 0.5 -> 2

Với Pan nên là -1 -> 1

Với Volumne nên là 0 -> 1

=> Như vậy thì việc tuỳ chọn mới không phát sinh lỗi và có hiệu quả (Rate x2 tức là chương trình phát nhạc nhanh gấp đôi)

III. Kết luận:

– Đây là những bước đầu cho các bạn muốn điều chỉnh nhạc phát ra theo sở thích và mục đích của mỗi người. Những hàm chuẩn của chương trình là thế nhưng bạn có thể tuỳ biến để thực hiện theo đung mục đích của bạn ví dụ như hiệu ứng khi đang xem hay xem xét nhạc sắp hết hay muốn dừng lại đấy là tuỳ bạn.

* Source Code:

– Google Drive: https://docs.google.com/file/d/0B3v7a0gMgVkBSmlxNTJGMTU5NFE/edit?usp=sharing

– Mediafire: http://www.mediafire.com/?nc1m8ezd8b4pv1u

=> Mãi mới có người comment 🙂 Có người quan tâm thì mình post source.

Lưu trữ dữ liệu với NSUserDefault trong Object

I. Thông tin chung:

– Lưu trữ dữ liệu là một phần không thể thiếu đối với hầu hết các chương trình. Chẳng hạn như khi bạn chơi game, bạn cần lưu lại những thành tích mà bạn đạt được hay những vật dụng mà bạn đã mua hay đã sử dụng.

– NSUserDefault là cách lưu dữ liệu nhanh chóng và dễ dàng nhất của Object C. Nó chuyên dùng để lưu những dữ liệu đơn giản như các chuỗi (string), số lượng (number) hay đơn thuần chỉ là một biến bool. Ngoài ra nó cũng có thể dùng để lưu lại các NSArray hay NSDictionary nếu bạn không đưa những dữ liệu phức tạp vào như phim, hình ảnh và âm thanh. Đây là giải pháp tốt nhất nếu bạn muốn lưu lại những thiết lập (setting hay option) dành cho chương trình.

II. Nội dung chính:

Lưu trữ với NSUserDefault thực sự rất đơn giản. NSUserDefault lưu trữ thông tin với những từ khóa (keyword).

1. Lưu dữ liệu vào trong NSUserDefault:
Bạn chỉ cần tạo một instant NSUserDefault và truy cập dữ liệu với keyword của nó.

GameScore = 100;

Username = [[NSString alloc] initWithFormat:@”huygamer”];

NSUserDefaults * lkUserDefault =  [NSUserDefaults standardUserDefaults];

[lkUserDefault setInteger:GameScore forKey:@”GameScore”];

[lkUserDefault setObject:Username  forKey:@”MainUser”];

[lkUserDefault synchronize];

=> Đây là các bước để lưu dữ liệu người dùng vào trong NSUserDefault

2. Lấy dữ liệu từ trong NSUserDefault ra:
Bạn tạo một instant NSUserDefault xong và lấy dữ liệu dựa vào từ khóa của nó:

NSUserDefault *lkUserDefault = [NSUserDefault standardUserDefaults];

int GameScore = [[lkUserDefault  objectForKey:@”DiemSo”] intValue];

NSString *username = [lkUserDefault objectForKey:@”Username”];

3. Đặc điểm:
– NSUserDefault là cách đơn giản nhất để lưu dữ liệu của người dùng. Chỉ cần tạo một instant sau đó sử dụng.
– NSUserDefault cho mỗi ứng dụng là tách biệt với nhau. Nó được lưu cùng vị trí với chương trình và nếu chương trình bị xóa cùng toàn bộ dữ liệu bạn cũng sẽ mất toàn bộ dữ liệu mà bạn lưu trữ.

4. Phần phụ:

Do lúc lấy dữ liệu ra cũng cần phải hiển thọ trên View hay ở nơi nào đó, đây là cách format dữ liệu để hiển thị lên trên View:

NSNumberFormatter* lkNumberFormatter = [[NSNumberFormatter alloc] init];

lkNumberFormatter.usesGroupingSeparator = YES;

lkNumberFormatter.groupingSeparator = @”,”;

lkNumberFormatter.groupingSize = 3;

NSString *lkNumberString = [lkNumberFormatter stringFromNumber: [NSNumber numberWithInteger: lkLikCoin]];

_lblLKLikCoin.text = lkNumberString;

III. Kết luận:

– Lưu trữ dữ liệu là một phần rất quan trọng của chương trình. Nó giúp lưu lại quá trình làm việc của người sử dụng và có thể tiếp tục làm việc từ điểm đã làm tiếp từ hôm qua.

– NSUserDefault chỉ là một phương pháp lưu trữ đơn giản để có thê lưu dấu trang, những thuộc tính cần thiết để chạy chương trình. Ngoài NSUserDefault còn có hệ thống quản lý file của IOS (IOS’s file management system), SQLIte (database SQL gọn nhẹ thường được sử dụng cho các hệ thống di động) và Core Data.

– Hãy chọn cách thích hợp để lưu trữ data cho chương trình của bạn.

Nhãn (UILabel) và nút (UIButton) trong lập trình IOS

I. Thông tin chung:
– Nút (Button) và nhãn (Label ) là 2 thứ khó có thể thiếu được trong một ứng dụng. Button giúp người dùng tương tác với ứng dụng còn Label giúp người dùng hiểu thông tin đang được hiển thị mang ý nghĩa gì.

II. Nội dung chính:
1. Label (UILabel):
Những thứ có thể được tùy chính trong 1 Label bao gồm:

– Font,

– TextColor

– TextAligment (TextAligment đã được chuyển thành một thuộc tính (property) trong IOS 6)

– enable: Thực ra thì một Label gốc sẽ không tương tác với người sử dụng nghĩa là các sự kiện (Event) không hề có. Tuy nhiên, enable một Label có nghĩa là làm nó hiện lên còn enable false sẽ làm mờ Label thông báo cho người dùng biết field kế bên nó đã bị vô hiệu.

* Ngoài ra, chúng ta còn có thể tạo bóng (shadow) dành cho những Label mà chúng ta muốn

lkLabel.shadowColor = [UIColor  blackColor];
lkLabel.shadowOffset = CGSizeMake(2.0, 2.0);

=> Đây là đoạn code dùng để tạo một bóng màu đen lệch qua phải 2 point và lệch xuống dưới 2 point. Nhìn có vẻ không đẹp lắm nhưng nếu bạn sử dụng màu xám (Gray) thì đổ bóng sẽ đẹp hơn nhiều.

* Chúng ta có thể điều chỉnh thuộc tính userInteractionEnabled thành YES để có thể tương tác với Label đó.

2. Button (UIButton):
– Button là một trong những control rất quen thuộc với lập trình viên. Sau đây là những dạng button được định nghĩa sẵn trong Object C. Bao gồm:

+ UIButtonTypeCustom
+ UIButtonTypeRoundedRect
+ UIButtonTypeDetailDisclosure
+ UIButtonTypeInfoLight
+ UIButtonTypeInfoDark
+ UIButtonTypeContactAdd

=> Thông thường chúng ta sử dụng RoundedRect vì đây là button chuẩn của Xcode để tương tác với người dùng. Nó chỉ bao gồm một button với hình chữ nhật được bo tròn và tương tác như những button trong các ngôn ngữ khác (ví dụ như Java và C #).
– Tuy nhiên khi chúng ta có những điều chỉnh lớn và mong muốn sử dụng Button theo ý thích của mình thì Custom là thứ mà chúng ta sử dụng. Nó cho phép bạn có thể tùy biến lại hoàn toàn button theo ý của bạn và rất dễ để sử dụng

Code:

UIButton *lkButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[lkButton setTitle:@”LapKan” forState:UIControlStateNormal];

[lkButton setTitle:@”LapKanSelected” forState:UIControlStateHighlighted];

Sau đó set tới vị trí của button:

[lkButton setFrame:CGRectMake(10, 10, 100, 44)];
[self.view addSubview:lkButton]

Bạn cần thêm vào phản hồi dành cho button này:

[lkButton addTarget:self action:@selector(lkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];

* Đây là sự kiện được diễn ra:

– (void) lkButtonPressed:(UIButton *) sender
{
NSLog(@“You have pressed %@ button”, sender.titleLabel.text);
}

III. Kết luận:
– Đây là bài giới thiệu chung về các nút (Button) và nhãn (Label) trong Object C. Nó còn rất nhiều thuộc tính đáng lưu ý và nhiều cách sử dụng hơn nữa khi được kết hợp với Storyboard và TableView. Tôi sẽ cập nhật những controller khác trong những bài sau.

Entity framework (C Sharp)

I. Thông tin chung:

– Entity framework (EF) là một framework về cơ sở dữ liệu rất mạnh của Microsoft và được hỗ trợ trực tiếp bởi chính Visual Studio. Với giao diện của Visual Studio cực kì trực quan và khả năng kết nối tuyệt, EF trở thành một công cụ cực tốt cho việc lập trình C# với cơ sở dữ liệu (Database).

– Có nhiều tính năng rất đáng giá trong EF ví dụ như:

* Lazy Load: Không lấy hết dữ liệu 1 lần tránh gây nặng máy là chỉ thực thi khi có câu lệnh gọi.

* Hỗ trợ LINQ:

* Tùy biến cao:

* Nhiều lựa chọn đa dạng cho việc lập trình

* Kết nối trực tiếp từ các nguồn (DataGridView hay Report)
– Các thứ thường sử dụng nhất của Entity Framework

II. Nội dung chính:
* Chức năng chính của Entity framework chính là tương tác với database để làm việc. Ba loại tương tác phổ biến nhất chính là Thêm, Xóa và Sửa một record. Đây chính là code dành cho việc cập nhật dữ liệu đó.

A. Cách thứ nhất (Dùng Entity Key):

1. Adding new record:

private static void AddRecord(){ using (var entity = new LKEntity())

{

     EntityKey lkKey = new EntityKey(“entity.LKGame”, “ID”, 1)

     LKGame gameToDelete = new LKGame(7, “ShakingDice”)

     LKEntity.AddObject(gameToAdd);

     entity.SaveChanges();

}

2. Deleting a record:

private static void RemoveRecord()
{
using (var entity = new LKEntity())

    {

          EntityKey lkKey = new EntityKey(“entity.LKGame”, “ID”, 7)

          LKGame gameToDelete = (LKGame) entity.GetObjectByKey(lkKey );

        if (gameToDelete != null)

        {

                  entity.DeleteObject(gameToDelete);

                  entity.SaveChanges();

        }

      }

}

3. Updating a record:

private static void UpdateRecord(){ using (var entity = new LKEntity())

{

        EntityKey lkKey = new EntityKey(“entity.LKGame”, “ID”, 5)

        LKGame gameToUpdate = (LKGame) entity.GetObjectByKey(lkKey );

        if (gameToUpdate  != null)

       {

                gameToUpdate.Name = “HittingMe”;

                entity.SaveChanges();

        }

}

III. Kết luận:
– Entity framework đã làm giảm tối đa công việc tương tác với một bảng trong database của lập trình viên. Các thao tác Thêm, Sửa và Xóa giờ đây được Entity làm hết. Entity đang đóng vai trò là Modal trong mô hình (MVC)