Thủ thuật lập trìnhchoiPhone Mình xin bắt đầu bài tutorial, các bạn cứ step by step theo mình là đc. Mình khuyến cáo là các bạn hãy thuần thục và tự phát huy cái "Hello World" phía trên trƣớc (cụ thể là hiểu UIView, UIViewController, các thao tác trong Interface Builder, cách dùng chuỗi NSString .). Mình cũng là dân code C# và J2ME, nên sẽ đƣa 1 số khái niệm tƣơng tự trong đó vào cho các bạn dễ hình dung hơn. Bước 1: Tạo project, File --> New Project --> iPhone OS Application: Windows- Based Application --> nhập tên project (mình default là Bamboo) Xài Template Windows-Based Application thì Xcode ko tạo sẵn các màn hình cho mình, mình tự tạo màn hình và thêm vào, nhƣ vậy sẽ dễ hiểu hơn. Trong thƣ mục Classes trong Project Explorer, bạn sẽ thấy lớp BambooAppDelegate. Lớp này tƣơng tự nhƣ MIDlet trong J2ME: quản lý các màn hình, các sự kiện chính (nhƣ bắt đầu chƣơng trình, trạng thái iPhone .) Trong BambooAppDelegate.h có UIWindow *window, đó là màn hình chính. Trong dòng "@properties ." phía dƣới, thì từ khóa IBOutlet dùng để hiện thị window trong Interface Builder. Trong BambooAppDelegate.m, hàm "- (void)applicationDidFinishLaunching: (UIApplication *)application" tƣơng tự nhƣ startApp() của MIDlet. Bước 2: Tạo màn hình chính cho chƣơng trình, nói chính xác là tạo 1 lớp quản lý màn hình chính. Right click tại "Classes" trên Project Explorer, Add --> New File - -> UIViewController subclass --> đặt tên là MainVC (VC viết tắt cho ViewController) Vào MainVC.m, xóa toàn bộ các hàm trong /* .*/ đi, kể cả hàm didReceiveMemoryWarning (ko dùng đến), chỉ giữ lại hàm dealloc thôi, cho đỡ rối Vào BambooAppDelegate.h khai báo 1 biến kiểu MainVC tên là mainVC (để ý IBOutlet để hiển thị nó trong Interface Buidler), và addSubview nó vào window trong file BambooAppDelegate.m nhƣ hình vẽ: Open MainWindow.xib ra (Project Explorer, Resources), tự load bằng Interface Builder Mở Library ra (Tools --> Library), drag 1 View Controller vào MainWindow.xib. Kết quả sẽ là: Đặt class cho cái View Controller là MainVC (Tools --> Inspector --> chọn Tab cuối, select "Class" là MainVC). Right click vào cái khối vuông Bamboo App ., asscociate mainVC (Outlet) vào cái hình tròn MainVC phía dƣới. Lần lƣợt drag từ trong Library 1 View, và 2 Round Rect Button lên màn hình của MainVC (vẫn trong Interface Builder) Save lại, chuyển qua Xcode, build và run thử. Chƣơng trình sẽ là 1 cái màn hình trắng với 2 cái button ở dƣới Bước 3: Tạo lớp Cell, tức là 1 cái ô lật/úp trên màn hình. Mỗi Cell cần 2 ảnh, 1 ảnh lúc đang úp, 1 ảnh lúc lật lên rồi, 1 property bool để biết nó đang úp hay mở. _ Right click tại Classes, Add --> New File --> UIView subclass --> đặt tên Cell. Giải thích 1 chút, UIView giống nhƣ UserControl trong C#, kế thừa nó, cài đặt theo ý mình và đặt nó lên Form (ở đây là mainVC.view) _ Khai báo trong Cell.h: #import <UIKit/UIKit.h> @interface Cell : UIView { bool isOpen; UIImageView *unknownView; UIImageView *valueView; } @property (nonatomic, assign) bool isOpen; - (void)flipToShow; - (void)flipToHide; @end _ UIImageView (cũng kế thừa từ UIView) là 1 UIView có chứa 1 image bên trong, có thể thiết lập chế độ hiển thị ảnh. _ Trong Cell.m, nhớ "@synthesize isOpen;" ngay phía dƣới dòng "@implementation" Cell", rồi vào hàm initWithFrame, ngay phía dƣới //Initialization code, copy đoạn code sau: CGRect rect = CGRectMake(0, 0, frame.size.width, frame.size.height); unknownView = [[UIImageView alloc] initWithFrame:rect]; unknownView.contentMode = UIViewContentModeScaleAspectFit; unknownView.image = [UIImage imageNamed:@"unknown.png"]; valueView = [[UIImageView alloc] initWithFrame:rect]; valueView.contentMode = UIViewContentModeScaleAspectFit; valueView.image = [UIImage imageNamed:@"Picture 0.png"]; [self addSubview:unknownView]; isOpen = FALSE; _ Giải thích code: khởi tạo 2 cái UIImageView với kích thƣớc trùng với Cell, tọa độ góc trên bên trái là (0, 0) (tọa độ tƣơng đối so với Cell). Dòng thứ 2 là đặt chế độ hiển thị ảnh, ở đây là "giữ tỷ lệ và nằm trọn trong UIImageView". Dòng thứ 3 là đặt image từ resource. Bạn tạo sẵn 2 hình có tên file nhƣ trên, rồi add vào resource nhƣ sau: + Right click vào "Bamboo" trên Project Explorer, Add --> New Group --> đặt tên là Images. + Right click vào "Images", Add --> Existing Files . --> browse tới 2 file đó, Add + Check vào "Copy items into destination group's folder (if needed)" rồi Add. _ Cài đặt 2 hàm flipToShow và flipToHide nhƣ sau: - (void)flipToShow { if (isOpen == TRUE) return; isOpen = TRUE; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.75]; [UIView setAnimationTransition:UIViewAnimationTransitionFl ipFromLeft forView:self cache:YES]; [unknownView removeFromSuperview]; [self addSubview:valueView]; [UIView commitAnimations]; } - (void)flipToHide { if (isOpen == FALSE) return; isOpen = FALSE; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.75]; [UIView setAnimationTransition:UIViewAnimationTransitionFl ipFromRight forView:self cache:YES]; [valueView removeFromSuperview]; [self addSubview:unknownView]; [UIView commitAnimations]; } _ Mình sử dụng hiệu ứng flip, ngoài ra còn 1 số các hiệu ứng khác, các bạn tự tìm hiểu ^_^. Cái setAnimationDuration là thời gian chạy hiệu ứng (tính bằng giây). Hiệu ứng hiểu nhƣ sau: ta có 2 cái UIImageView, mỗi lần lật hay úp, tức là ta gỡ cái UIImageView đang có ra, rồi add cái còn lại vào. _ Xử lý sự kiện "tap" trên Cell, add hàm này vào là xong (trong Cell.m): - (void)touchesBegan: (NSSet *)touches withEvent: (UIEvent *)event { if (isOpen == FALSE) [self flipToShow]; } _ Đừng quên giải phóng bộ nhớ trong dealloc: - (void)dealloc { [super dealloc]; [unknownView dealloc]; [valueView dealloc]; } _ Okie, vậy là xong. Giờ ta test thử 1 Cell trên MainVC. Trong MainVC.h, #import "Cell.h". Trong MainVC.m, thêm hàm này dƣới "@implementation MainVC": - (void)awakeFromNib { [super awakeFromNib]; Cell *cell = [[Cell alloc] initWithFrame:CGRectMake(10, 10, 50, 50)]; [self.view addSubview:cell]; } _ Build and run. Trên màn hình chƣơng trình của ta bây giờ xuất hiện 1 cái ô vuông ở góc trên bên trái. Tap vào đó, nó sẽ lật lên (có hiệu ứng). Giải thích 1 chút, hàm awakeFromNib đƣợc thực hiện khi chƣơng trình load MainVC từ resource, thay vì khởi tạo bằng init. ** RẤT HY VỌNG CÁC BẠN CHẠY ĐƢỢC CHƢƠNG TRÌNH **, hãy kiên nhẫn sửa lỗi (nếu có) và hiểu code. Các bạn cứ tự nhiên, mình sẽ giải đáp ** Phần kế tiếp cần có kỹ thuật coding tốt, cùng với xử lý sự kiện phức tạp, làm sao trình bày đây . Thủ thuật lập trình cho iPhone Mình xin bắt đầu bài tutorial, các bạn cứ step by step theo mình. số khái niệm tƣơng tự trong đó vào cho các bạn dễ hình dung hơn. Bước 1: Tạo project, File --> New Project --> iPhone OS Application: Windows- Based