Nhiều bạn lập trình viện không có nhiều thời gian đến các trung tâm hoặc các trường học để có thể tham gia các khóa học lập trình iOS.Các bạn đang mong muốn tìm cho mình được 1 bộ tài liệu học lập trình iOS từ Cơ Bản – Chuyên Sâu. DevPro là một trong những trung tâm dạy lập trình iOS online, offline cho các bạn sinh viên, các nhân viên lập trình muốn tìm hiểu về ngôn ngữ thế hệ mới này để tạo cho mình 1 công việc và 1 mực lương tốt hơn trong cuộc sống. Nhưng không phải ai cũng có thời gian và điều kiện đến trung tâm để tham gia khóa học.Thấu hiểu được điều đó thì trung tâm DevPro đã xây dựng một bộ tài liệu học lập trình iOS từ Cơ Bản – Nâng cao giúp các bạn có thể tự học lập trình iOS tại nhà mà không phải tốn nhiều thời gian đến các trong tâm. MỤC LỤC Nhập môn ObjectiveC 2 Các kiểu dữ liệu cơ bản trong Objective C 2 Biến, hằng số, toán tử trong Objective C 5 Cấu trúc điều khiển trong Objective C 6 Cơ bản về hàm, class trong Objective C 9 Hướng dẫn cách sử dụng block trong Objective C 14 Cấu trúc của một chương trình trong lập trình IOS 17 Tạo ứng dụng Helloworld sử dụng Objective C (tạo ứng dụng Iphone đầu tiên trên iOS) 19 Tìm hiểu về Label, Button, TextField, Slider, Switch, Page Control trong iOS 24 Tìm hiểu về Progress View, Activity View, Segmented Control, Switch trong ios 29 Quản lý bộ nhớ trong IOS (Memory Management) 32 Điều hướng sử dụng Navigation controller 37 Hướng dẫn sử dụng Tabbar ViewController mở Webview, ImageView, Mapkit. 48 Hướng dẫn sử dụng file xib trong IOS. 59 Hướng dẫn sử dụng TableView trong IOS 64 Tương tác row selection trong Tableview 72 Hướng dẫn xóa 1 hàng trong TableView 76 Hướng dẫn sử dụng Sidebar 79 Hướng dẫn phân trang trong IOS sử dụng file xib 89 Hướng dẫn sử dụng CollectionView trong IOS 95 Hướng dẫn tương tác với CollectionView 105 Thêm Header và Footer trong UICollectionView 114 Phân tích XML parser 122 Hướng dẫn phân tích JSON 129 Hướng dẫn load dữ liệu từ Json vào TableView 143 Hướng dẫn Localization(đa ngôn ngữ) cho ứng dụng của bạn 155 Hướng dẫn thêm tính năng chia sẻ cho ứng dụng của bạn 163 Hướng dẫn sử dụng một máy quay và playback. 169 Hướng dẫn xây dung một máy ảnh đơn giản sử dụng UIImagePickkerViewcontroller 174 Vào ra file trong ios 179 AutoLayout trong ios 183 Hướng dẫn sử dụng SQLite trong ios 190 Hướng dẫn sử dụng Coredata trong ios 203
Trang 1Tự học lập trình iOS từ Cơ Bản – Chuyên
Sâu
Nhiều bạn lập trình viện không có nhiều thời gian đến các trung tâm hoặc các trường học để có thể tham gia các khóa học lập trình iOS.Các bạn đang mong muốn tìm cho mình được 1 bộ tài liệu học lập trình iOS từ Cơ Bản – Chuyên Sâu
DevPro là một trong những trung tâm dạy lập trình iOS online, offline cho các bạn sinh viên, các nhân viên lập trình muốn tìm hiểu về ngôn ngữ thế hệ mới này để tạo cho mình 1 công việc và 1 mực lương tốt hơn trong cuộc sống
Nhưng không phải ai cũng có thời gian và điều kiện đến trung tâm để tham gia khóa học.Thấu hiểu được điều
đó thì trung tâm DevPro đã xây dựng một bộ tài liệu học lập trình iOS từ Cơ Bản – Nâng cao giúp các bạn có thể tự học lập trình iOS tại nhà mà không phải tốn nhiều thời gian đến các trong tâm
MỤC LỤC
Nhập môn Objective-C 2
Các kiểu dữ liệu cơ bản trong Objective C 2
Biến, hằng số, toán tử trong Objective C 5
Cấu trúc điều khiển trong Objective C 6
Cơ bản về hàm, class trong Objective C 9
Hướng dẫn cách sử dụng block trong Objective C 14
Cấu trúc của một chương trình trong lập trình IOS 17
Tạo ứng dụng Helloworld sử dụng Objective C (tạo ứng dụng Iphone đầu tiên trên iOS) 19
Tìm hiểu về Label, Button, TextField, Slider, Switch, Page Control trong iOS 24
Tìm hiểu về Progress View, Activity View, Segmented Control, Switch trong ios 29
Quản lý bộ nhớ trong IOS (Memory Management) 32
Điều hướng sử dụng Navigation controller 37
Hướng dẫn sử dụng Tabbar ViewController mở Webview, ImageView, Mapkit 48
Hướng dẫn sử dụng file xib trong IOS 59
Hướng dẫn sử dụng TableView trong IOS 64
Tương tác row selection trong Tableview 72
Hướng dẫn xóa 1 hàng trong TableView 76
Hướng dẫn sử dụng Sidebar 79
Hướng dẫn phân trang trong IOS sử dụng file xib 89
Hướng dẫn sử dụng CollectionView trong IOS 95
Hướng dẫn tương tác với CollectionView 105
Thêm Header và Footer trong UICollectionView 114
Phân tích XML parser 122
Hướng dẫn phân tích JSON 129
Hướng dẫn load dữ liệu từ Json vào TableView 143
Hướng dẫn Localization(đa ngôn ngữ) cho ứng dụng của bạn 155
Hướng dẫn thêm tính năng chia sẻ cho ứng dụng của bạn 163
Hướng dẫn sử dụng một máy quay và playback 169
Hướng dẫn xây dung một máy ảnh đơn giản sử dụng UIImagePickkerViewcontroller 174
Vào ra file trong ios 179
Trang 2[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
I Nhập môn Xcode và Objective-C
1 Nhập môn Objective-C
Objective-C là ngôn ngữ được Apple phát triển từ C và có tính hướng đối tượng Cụ thể tính đối tượng như thế nào mình sẽ hướng dẫn các bạn trong các bài học của mình
Để bắt đầu, bạn cần phải sử dụng hệ điều hành Mac OS (trên máy Mac hoặc Hackintosh) và
dĩ nhiên là phải cài ứng dụng Xcode (do Apple phát triển và cung cấp miễn phí) Để nhận dạng ứng dụng Xcode thì bạn nhìn vào hình nhé!
2 Bạn cần một máy tính MAC OS hay Laptop tương thích hoặc Laptop cấu hình tốt…
- MAC OS giá khá đắt
- Laptop cài song song yêu cầu cấu hình tương thích, chạy ổn định như MAC giá rẽ hợp sinh viên
- Laptop cấu hình mạnh, ram 8GB cài máy ảo yếu hơn cài song song
3 Bạn cần tạo một tài khoản Apple ID để phát triển phầm mềm
Vào trang này để khởi tạo tài khoản https://appleid.apple.com
4 Tải về Xcode trên máy MAC từ MAC App Store
Đăng nhập bằng Apple ID để tải Xcode từ MAC App Store
5 Sau khi cài đặt xong
Một khi hoàn tất quá trình cài đặt, bạn sẽ tìm thấy Xcode trong phần Launchpad
II Các kiểu dữ liệu cơ bản trong Objective C
Như các bạn đã biết muốn tìm hiểu bất cứ ngôn ngữ nào ban đầu ta luôn tìm hiểu các kiểu dữ liệu của chúng Việc nắm bắt được phạm vi, cách dùng các kiểu dữ liệu giúp các bạn lập trình không bị sai, hiểu được cách quản lý từng đoạn code
Bài đầu tiên mình giới thiệu cụ thể các kiểu dữ liệu nguyên thủy và các kiểu dữ liệu đối tượng trong Objective C
1 Các kiểu dữ liệu nguyên thủy trong C
Trong Objective C, hầu hết các kiểu dữ liệu cơ bản trong ngôn ngữ lập trình C đều sử dụng được một cách trực tiếp bao gồm integer (int), float, char, double,float,enum, … Trong C++ cũng được dụng nhưng phải sử dụng file trung gian để kết nối
Trang 3unsigned char 1 byte [0 - 255]
unsigned int 4 byte [0 - 4294967295]
signed int 4 byte [-2147483648 - 2147483647]
unsigned short int Range [0 - 65535]
signed short int Range [-32768 - 32767]
long int 4 byte [-2147483647 - 2147483647] unsigned long int 4 byte [0 - 4,294,967,295]
signed long int 4 byte [-2147483647 - 2147483647]
Số thực dạng double double 8 byte [+/- 1.7e +/- 308 (~15 ký số)]
long double 8 byte [+/- 1.7e +/- 308 (~15 ký số)] Kiểu không có giá trị void
signed (kiểu có dấu)
unsigned (kiểu không có dấu)
short
long Các kiểu dữ trên trong Objective C sử dụng giống trong C cơ bản! ! !
Ví dụ: cách khai báo - int a = 5;
float b = 5.5; double c = 11.11; char str[5] = “objec”;
unsign int uI = 8; -
2 Các kiểu dữ liệu đối tượng trong Objective C
- NSString
Kiểu chuỗi ký tự trong Objective C Kiểu NSString không thể thay đổi
Ví dụ: khai báo NSString - NSString *str1 = [[NSString alloc] init]; //Khai báo cách 1
NSString *str2 = @”test”; //Khai báo cách 2 -
Trang 4[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Kiểu chuỗi ký tự trong Objective C Kiểu NSMutableString có thể thay đổi
Lưu ý: NSMutableString không được khai báo tắt theo cách 2 (phần ví dụ NSString)
NSArray *arr1=[[NSArray alloc]initWithObjects:@"ngo",@(5), nil];
//Cách khai báo 2 arr0=@[@(1),@"2"];
NSDictionary *dict1=[[NSDictionary alloc]initWithObjectsAndKeys:@(1),@"key",@(2),@"key1", nil];
//Cách 2 NSDictionary *dict=@{@"key1":@(1),@"key":@(2)};
Tương tự kiểu nguyên thủy float framework graphic tùy biến thành CGFloat
- true/false hay YES/NO
Có 3 kiểu chính BOOL (8bit) : YES/NO dùng trong Objective C bool (16/32/64/… bit tùy môi trường) : true/false Boolean (8bit) : TRUE/FALSE
Ví dụ - Boolean boolA = TRUE;
bool boolB = true;
BOOL boocC = YES;
-
III Biến, hằng số, toán tử trong Objective C
Ở phần trước mình đã làm rõ khái niệm kiểu dữ liệu, giới thiệu các kiểu dữ liệu nguyên thủy c, c++, cũng như các kiểu dữ liệu đối tượng trong Objective C Mình cũng đã sử dụng các biến để thử các kiểu dữ liệu Bài này mình sẽ làm rõ biến là gì? , hằng số là gì?, cách dùng? Giới thiệu các
Trang 51 Biến
+) Bộ nhớ máy tính được tổ chức đơn vị nhỏ nhất là là ô nhớ (đơn vị byte) Biến cơ bản
là lưu trong ô nhớ trong bộ nhớ máy tính, được dành riêng để lưu trữ các dữ liệu và truy xuất giá trị
+) Mỗi biến có một tên riêng lưu trữ một giá trị riêng tùy vào kiểu dữ liệu
+) Mỗi biến và giá trị sẽ tự mất đi trong bộ nhớ nếu ứng dụng ngừng chạy
+) Giá trị của các biến có thể thay đổi được
+) Cách truy xuất biến trong Objective C, như thế nào ? Mình minh họa một số ví dụ sau:
Ví dụ Cách khai báo biến: kiểu dữ liệu [tên biến] = giá trị biến;
- //int[kiểu dữ liệu] bien[tên biến] = 8[giá trị biến];
int bien = 8;
- Giá trị của biến có thể thay đổi được
- int a = 1;
Hằng số cũng là biến, nó có thể được khai báo là biến thường hay biến con trỏ
Biến hằng số: có giá trị không thể thay đổi được trong toàn ứng dụng
Giá trị của biến hằng số được gán ngay sau khi khai báo biến
Hằng số thường được khai báo ở đầu đoạn code hoặc Class chạy đầu tiên nhất trong ứng dụng
Khai báo:
{ int const hangSoA = 8;
} Chúng ta không thể thay đổi giá trị của hangSoA một khi đã khai báo Nếu thay đổi chương trình sẽ báo lỗi khi chạy
int b = 2;
Trang 6[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
int chia = b / a; //trả về 2 int du = a % b; //trả về 1 -
- Toán tử phức hợp : “+=, -=, *=, /=”
Ví dụ - int a = 1;
a += 1; //Tương đương với a = a + 1 (2) Áp dụng với các phép toán khác
-
- Toán tử tăng, giảm giá trị : “++, ”
Ví dụ - int i = 1;
i++; //Tăng 1 đơn vị (i = i +1)
i ; //Giảm 1 đơn vị (i = i – 1)
int b = 2;
a>b?NSLog(@“dung”):NSLog(@”sai”); //Nếu a > b thì trả về “dung”, ngược lại “sai” -
IV Cấu trúc điều khiển trong Objective C
Bài này mình sẽ giới thiệu các cấu trúc điều khiển trong Objective C Cũng giống các ngôn ngữ khác cấu trúc điều khiển là rất quan trọng, giúp điều hướng code, chạy giải thuật một cách tuyệt vời
Để giúp các bạn hiểu rõ, mình sẽ giới thiệu cụ thể cách khai báo và cách dùng của từng cấu trúc một cách cụ thể
1 Cấu trúc IF, IF ELSE kiểm tra true or false:
IF : Cấu trúc if chỉ thực hiện khi điều kiện trả về đúng
Khai báo tổng quát if(điều kiện đúng){
//Thực hiện khi điều kiện đúng }
Ví dụ
Trang 7//Khai báo 2 biến int tuoi = 22;
NSString *ten = @”Nguyen Van A”;
//Kiểm tra điều kiện if(tuoi==22&&[ten isEqualToString:@”Nguyen Van A”]){
NSLog(@“Tuoi cua %@ la %d”, ten, tuoi);
} //Trường hợp này sẽ log ra kết quả nếu tên là “Nguyen Van A” và tuổi là 22 -
IF ELSE : Khi điều kiện đúng thì thực hiện lệnh trong if, ngược lại nếu điều kiện sai thì thực hiện lệnh trong else
Khai báo tổng quá if(điều kiện){
//Thực hiện nếu điều kiện đúng }
else{
//Thực hiện nếu điều kiện sai }
Ví dụ - if([ten isEqualToString:@”Nguyen Van B”]){
//Nếu tên là “Nguyen Van B” thì log ra “Day la B”
NSLog(@”Day la B”);
} else{
//Ngược lại log ra “Day khong phai la B”
NSLog(@”Day khong phai la B”);
} - -
Vòng lặp
Vòng lặp hữu hạn : biết được số lần lặp
for(giá trị biến khởi tạo; điều kiện lặp; bước nhảy sau mỗi lần lặp){
//code }
Đầu tiên khai báo biến khởi tạo gán giá trị khởi tạo, kiểm tra nếu biến khởi tạo thoả mãn điều kiện thì thực hiện các dòng code bên trong thân hàm for, cuối cùng tăng biến khởi tạo theo bước nhảy, nếu không thoả mãn thoát khỏi vòng for và vòng lặp cứ thực hiện như thế đến khi out vòng for
Ví dụ - //Log ra các số tự nhiên từ 1 đến 10
for(int i = 1; i <= 10; i++){
NSLog(@“%d”, i);
} - Ban đầu i = 1, kiểu tra thấy i <= 10 (true), thực hiện log ra giá trị i (1) Sau đó tăng i = i + 1, tương tự như thế lặp lại cho đến khi i = 11, không thỏa mãn điều kiện vòng lặp for nữa Vòng for sẽ dừng lại
Vòng lặp hữu hạn : duyệt từng đối tượng trong danh sách các đối tượng
Trang 8[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
NSArray *arr = @[@"2",@"4",@"6",@"8"];
for (NSString *str in arr) { NSLog(@"%@",str);
} - Vòng lặp khai báo một đối tượng str kiểu NSString, duyệt từng đối tượng trong mảng arr, mỗi một lần lặp ->đối tượng trong mảng được duyệt lần lượt lưu tạm trong đối tượng str, làm việc từng đối tượng thông qua str
Vòng lặp vô hạn
while(điều kiện){
//code } Nếu điều kiện còn thoã mãn là true thì vòng lặp vô hạn, lặp với điều kiện … nếu điều kiện không đúng thì đoạn mã trong vòng lặp sẽ không được thực hiện lần nào
Ví dụ - int a = 0;
while(a!=-1){
NSLog(@”%d”, a);
a++;
} }
sẽ lặp vô hạn, điều kiện luôn đúng vì a có kết quả luôn khác -1 {
Trong trường hợp nếu muốn vòng lặp while thực hiện ít nhất một lần, bất kể điều kiện như thế nào thì ta thực hiện vòng lặp do while
Ví dụ - int a = 6;
do{
NSLog(@”%d”, a);
} while(a < 5);
-
a (6) vẫn được log ra một lần dù không thỏa mãn điều kiện while (a < 5)
Cấu trúc điều khiển với nhiều lựa chọn
Chúng ta có thể sử dụng IF lồng nhau để đưa ra nhiều lựa chọn với nhiều điều kiện khác nhau Tuy nhiên nhìn code sẽ rắc rối khó quản lý, Ở trong Objective C cũng như các ngôn ngữ khác, có hỗ trợ kiểu nhiều lựa chọn
switch(biến){
case [điều kiện 1]:
Trang 9case [điều kiện 2]:
break;
default:
break;
} Với điều kiện truyền vào, điều kiện sẽ kiểm tra xem nó đúng với case nào sẽ thực hiện các lệnh trong case đó Nếu không đúng với case nào, sẽ thực hiện các dòng lệnh default Và như thế chúng ta có nhiều lựa chọn
Ví dụ - int a = 1;
Ở đây điều kiện truyền vào là a, với a = 1, sẽ thực hiện case 1 : Trả về kết quả “true 1” Full code ví dụ
http://www.mediafire.com/file/f7q3t3p0p6lg4v2/cauTrucDieuKhien%282%29.zip
V Cơ bản về hàm, class trong Objective C
Trong bài viết này, mình sẽ giới thiệu về 1 khái niệm mới “hàm ” và “class” trong Objective C Mình sẽ giúp các bạn biết cách khai báo một hàm, class, cách gọi hàm , gọi class, hiểu về tính chất của class, Cách truyền tham số cho hàm…
Khởi tạo dự án mới đặt tên:
Trang 10[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Đầu tiên mình sẽ giới thiệu về hàm trong Objective C : làm việc trên file ViewController.m Cách khai báo hàm tổng quát:
-(void) tenham{
//code thực thi }
Đơn giản khai báo hàm không có tham số truyền vào
lưu ý: Sau tên Biến phải có dấu cách xong mới đến dấu ‘:‘
-(void) tenham: ([kiểu dữ liệu])tenbien1 nhacnho:([kiểu dữ liệu]tenbien2{
}
Ví dụ : tính tổng a và b - -(void) tong:(int)soA : (int)soB{
int tong = soA + soB;
NSLog(@”%d”, tong);
- }
Hàm có tham số truyền vào thêm gợi ý chức năng của hàm
-(void) tenham : (kiểu dữ liệu)tenbien goiy: (kiểu dữ liệu) tenbien{
//code }
lưu ý: Sau tên Biến phải có dấu cách xong đến gợi ý mới đến dấu ‘:‘
Ví dụ - -(void) tong: (int)soA Cong: (int)soB{
Trang 11NSLog(@”%d”, tong);
} - (Gợi ý giúp ta hiểu thêm về chức năng của hàm)
Để gọi hàm trong Objective C
Tổng quát:
[self tênhàm];
Ví dụ
- [self tong:1 Cong:2];
-
Tiếp theo mình sẽ giới thiệu về class trong Objective C
Ở đây mình sẽ giới thiệu các bạn cách khai báo và sử dụng class, mình không đi sâu ý nghĩa class
kế thừa … ngôn ngữ nào ý nghĩa cũng giống nhau 🙂
=>Để tạo một class: newFile -> đặt tên sinhVien kế thừa từ NSObject!
Cách khai báo class
@interface Tênclass : NSObject
@end
NSObject là lớp gốc của hầu hết các Mục tiêu-C phân cấp lớp Qua NSObject , đối tượng thừa kế một giao diện cơ bản cho các hệ thống thời gian chạy và khả năng để hành xử như các đối tượng Objective-C
tại file sinhsinhVien.h
Ví dụ
Trang 12[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
-
Để khai báo thuộc tính sử dụng từ khoá:
@property kiểudữliệu tên thuộc tính
-(void) tênPhươngThức => đây là thuộc tính bình thường truy xuất thông qua đối tượng gọi đến
thuộc tính của nó
+(void) tênPhươngThức =>đây là thuộc tính tĩnh (static) có thể truy xuất thông qua class gọi đến
thuộc tính, đối tượng gọi đến class
-(instancetype) Hàmkhởitạo: truyền tham số => giống contructor trong java đây là hàm khởi tạo
sẽ được gọi khi tạo một đối tượng có tham số (của 1 class)
-Hàm init (giống contructor trong java) là hàm không tham số, ngay khi tạo một đối tượng hàm
này sẽ được gọi, từ IOS7 trở lên xcode tự tạo hàm không có tham số
get set thuộc tính, IOS7 xcode tự động gen
Ví dụ
-
@interface sinhVien : NSObject
@property int tuoi;
@property NSString *ten,*email;
-(void) thongtin;// ham
+(void) diemSV;// hàm static
-(instancetype)initSinhVien:(NSString*)tenSV :(int)tuoiSV :(NSString*)email;
@end
- tại file sinhvien.m thêm đoạn mã sau để viết code cho hàm init , hàm get set,hàm phương thức
Ví dụ
- // sinh ra bien the hien va sinh ra get set!mac dinh duoc ta ra
// contructor co tham so!
-(instancetype)initSinhVien:(NSString*)tenSV : (int)tuoiSV :(NSString *) email{
Trang 13Vào file ViewController.h
-
#import "sinhVien.h"
- Vào file ViewController.m trong -(void)viewDidLoad{} thêm đoạn mã:
-
- (void)viewDidLoad {
// khai báo đối tượng không có tham số
sinhVien *sv=[[sinhVien alloc]init];
Ngay lật tức init không tham số được gọi và log ra “init” Tiếp theo set các giá trị thuộc tính cho đối tượng NSLog ra thông tin sv Cuối cùng gọi đến 2 phương thức của đối tượng: phương thức bình thường [sv thongTin], phương thức (static) [sinhVien diemSV]
Kết quả:
- init
tên:binh, tuổi:22, email: maibinhpro
thong tin
diem sinh viên
- Tạo một đối tượng có tham số:
-(void)viewDidLoad{} thêm đoạn mã:
- //khai báo đối tượng có tham sô
sinhVien *sv1=[[sinhVien alloc]initSinhVien:@"dat" :23 :@"maidat"];
NSLog(@"tên:%@, tuổi:%d, email: %@",[sv1 ten],[sv1 tuoi],[sv1 email]);
[sinhVien diemSV];
[sv1 thongtin];
- Ngay lật tức init có tham số được gọi Và tự set các giá trị cho thuộc tính của đối tượng NSLog ra
Trang 14[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
- tên:dat, tuổi:23, email: maidat
diem sinh viên
thong tin
- Full link code : http://www.mediafire.com/download/ot6f3ssa9d7wr6b/functionClassBlock.zip
VI Hướng dẫn cách sử dụng block trong Objective C
1 Sơ lược về Objective C
Như chúng ta đã biết một biến có thể lưu một giá trị, một đối tượng có bao gồm các thuộc tính, phương thức… Tuyệt vời! Block hỗ trợ chúng ta lưu một đoạn code sẽ được sử dụng, tương tác nhiều lần Bài này mình sẽ giúp các bạn tìm hiểu về Objective C
Khai báo block Định nghĩa block Truy vấn block, và tính chất block
Ứng dụng block Đầu tiên khởi tạo dự án mới:
Ta làm việc trên file ViewController.m -
- (void)viewDidLoad { [super viewDidLoad];
// Do any additional setup after loading the view, typically from a }
-
Đầu tiên Cách khai báo một block
Một block khai báo tổng quát:
kiểu dữ liệu trả về (^tên block)(kiểu dữ liệu 1,kiểu dữ liệu 2,kiểu dữ liệu 3);
Trang 15Kiểu trả về “void”, tên block “_in”, không tham số truyền vào “( )”
- void (^_in)();
- +) block một tham số:
Kiểu trả về “int”, tên block “myBlock”, 1 tham số truyền vào “( int)”
- int (^myBlock)(int);
- +) block nhiều tham số truyền vào:
Kiểu trả về “void”, tên block “myBlock”, 2 tham số truyền vào “( int,int)”
- //block nhiều tham số
void (^inSo)(int,int);//khai báo -
Định nghĩa block
Định nghĩa block tổng quát:
- blockX=^(tham số1, tham số2 , tham số3){code};
-
Ví dụ block _in : đơn giản ta chỉ log chuỗi
- _in=^(){
NSLog(@"infor");
};
- block myBlock: truyền vào tham số “num”, log ra thông tin “num”, và trả về giá trị num - myBlock= ^(int num){//định nghĩa
NSLog(@"%d",num);
return num;
};
- block inSo: truyền vào 2 tham số “soA” “soB”, tính tổng và log ra giá trị tổng
- inSo=^(int soA,int SoB){//định nghĩa
-
Ví dụ
Trang 16[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
- block myBlock:
- myBlock(7); //kết quả 7
- block inSo:
- inSo(6,4); //kết quả 10
- Thêm đoạn mã sau:
- int i=100; //lấy được giá trị của biến bên ngoài hàm!!!
ở đây trong block không truyền tham số biến i vào nhưng ta vẫn sử dụng biến i được !!!
Tính chất rất tuyệt vời của block custom (block lấy được các biến địa phương ngay trước
khi khai báo đó)
khi chạy cho kết quả: 100
- int i=100; //lấy được giá trị của biến bên ngoài hàm!!!
-
gán lại giá trị biến i=200 tuy thế khi gọi block kết quả vẫn trả về :100
như thế block chỉ tham chiếu giá trị chứ k tham chiếu ô nhớ
Ứng dụng block
Các bạn đã làm quen với block cách khai báo, định nghĩa , truy vấn Ở đây mình đưa ra một ví dụ về cách áp dụng block :
Ví dụ - -(int) addInfor: (int)intX{
intX=6;
NSLog(@"so:%ld",(long)intX);
return intX;
} - Gọi hàm:
- int soA;
[self addInfor:[self addInfor:soA]];
-
khi đó hàm luôn trả về : so:6
Trang 17Tính chất lưu lại giá trị trên hàm chỉ lưu được 1 giá trị của kiểu dữ liệu trả về ,trên block được ứng dụng rất nhiều lưu trữ nhiều kiểu giá trị khác nhau!
Cách truyền block vào hàm
Tổng quát:
–(void) tên hàm : (kiểu dữ liệu)tên biến1 : (kiểu dữ liệu)tên biến2 :block –(void) tên hàm : (kiểu dữ liệu)tên biến1 : (kiểu dữ liệu)tên biến2 : (kiểu trả về block (^)(kiểu dữ liệu A ,kiểu dữ liệu B)) Tên block;
Ví dụ - -(void) add:(NSString*)name :(int)age :(void (^)(NSInteger diem,NSString
Thêm đoạn mã sau trong viewDidLoad:
Đây là đoạn code mã nguồn cho block:
- // ứng dụng block
[self add:@"binh" :22 :^(NSInteger diem, NSString *monHoc, NSError *error) { NSLog(@"%@,%ld",monHoc,(long)diem);
}];
-
=> Khi đó các tham số block đã lưu lại thông tin! Ta gọi tham số ra và làm việc !!!
Ở đây là một ví dụ đơn giản, trong thực tế ta khai báo các block để lưu lại thông tin các tham số và dùng các tham số định nghĩa lại block để làm việc với tham số!
Ví dụ load API truyện về ta cần lưu lại thông tin số cuốn sách, tên sách… định nghĩa block gồm các thông tin trên Khi đó đối với từng hàm ta gọi block trên, và định nghĩa nghĩa block tuỳ mục đích sử dụng với các thông tin block cung cấp
Link full code : http://www.mediafire.com/download/cgkgo8otu5imss6/blockCoBan.zip
VII Cấu trúc của một chương trình trong lập trình IOS
Các thành phần cơ bản của một app ios :
–file h gồm :@interface khai báo : biến , fun ,class ,protocol…
–file m: @implementation: thực thi
1 Tổng quan:
Trang 18[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
FILE: AppDelegate: Mình đã commen các hàm cơ bản trong Appdelegate nội dung các hàm ý nghĩa như sau:
- // bắt đầu chạy khi app gọi
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch
return YES;
}// sẽ chạy sau Didview
- (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates Games should use this method to pause the game
} // chạy khi app chạy ở chế độ nền
- (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it
is terminated later
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits
} // chạy khi app sẽ chạy ở chế độ nền
- (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background
} // khi app hoàn thành
- (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive
If the application was previously in the background, optionally refresh the user interface }
-
Trang 19Gồm các viewcontroller các màn hình, các cảnh trong app , nơi thiết kế giao diện
Thông tin app- cấu hình app
-FILE: Supporting Files
Chứa main app
2 Nguyên lý chạy cơ bản
Main khởi tạo chạy ứng dụng-> thông tin cấu hình app cho phép-> khởi tạo màn hình khởi động-> gọi đến appdelegate khởi tạo hàm bắt đầu chạy trong app-> sau đó chạy các hàm thực thi viewcontroller
VIII Tạo ứng dụng Helloworld sử dụng Objective C (tạo ứng dụng Iphone đầu tiên trên iOS)
Đối với bất kỳ ngôn ngữ nào ta cũng làm quen với hello world, mình cũng giới thiệu cụ thể hello world trong IOS cơ bản! sử dụng Objective C
Mục tiêu hiển thị ra thông báo: Helllo World mà bất kỳ ngôn ngữ nào cũng học qua!
1 Khởi tạo một dự án mới
Trang 20[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
– Xcode cho bạn thấy mẫu dự án khác nhau để lựa chọn Đối với ứng dụng đầu tiên của bạn, chọn “Single Xem Application” và nhấp “Next”
Product Name : HelloWorld – tên ứng dụng
Organization Name : – Tên cá nhân hoặc tên công ty
Organization Identifine : – định danh viết tắc tên công ty hoặc tên cá nhân
Device : chọn tên thiết bị
Trang 21Chọn next-> chọn thư mục lưu->create =>như thế chúng ta đã tạo file thành công
2 Bắt đầu viết app “HelloWourld”
-Vào main.StoryBoard Lúc đầu màn hình không có gì!
– Kéo “button” vào đổi text “helloWorld”, chọn vào button và chọn vào background chọn
Trang 22[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Chọn vào biểu tượng có 2 cái vòng tròn!
– click vào button , và giữ CTRL kéo sang, đặt tên helloWorld chọn Action,touchUpInside bắt
sự kiện click vào button
Trang 233 Bắt đầu code nào
Khởi tạo đối tượng helloWorld truyền tham số vào : Tiêu đề, thông báo, delegate, Cancel trở lại, thông tin hiển thị thêm, OtherButtonTitles
Trong viewDidLoad - UIAlertView *helloWorld=[[UIAlertView alloc] initWithTitle:@"hello"message:@"helloWorld" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
// lúc này helloWolrd đã đc tạo để chạy ta gọi hàm "show"
[helloWorld show];
- – Biên dịch và chạy thử ta được kết quả như hình sau:
Trang 24[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Click vào nút button sẽ đưa ra thông báo:
IX Tìm hiểu về Label, Button, TextField, Slider, Switch, Page Control trong iOS
Trang 25UI cơ bản của lập trình di động IOS Label, Button, TextField, Slider, Switch, Page Control cách khai báo, cách sử dụng, ứng dụng thực tế của các UI trong App
Sau đây mình sẽ giới thiệu cho các bạn từng UI cụ thể!
Ta cần tạo dự án mới, đặt tên:
1 Đầu tiên mình sẽ giới thiệu về Label, Button, TextField trong IOS
Label là gì? label là nhãn chứa thông tin về text, trang trí text, thường dùng để thông báo thông tin, trang trí màn hình
Button là gì? button là một nút, sau khi nhấn vào nút đó sẽ thực một số công việc gì đó, đoạn code nào đó
TextField là gì? là một ô nhập liệu cho phép nhập dữ liệu từ bạn phím vào ô đó, và cho phép lấy dữ liệu từ ô để thực hiện các tác vụ khác
Để cho các bạn dễ hình dung mình sẽ lấy một ví dụ cụ thể sau:
Mình tạo ra 2 ô nhập liệu(TextField) , nhập dữ liệu từ bàn phím, một nút(button) để thực hiện cộng 2 số nhập từ bàn phím, một label hiển thị kết quả tổng của 2 số
Thiết kế giao diện đơn giản như sau label đổi text=0, button đổi text=0, và 2 ô text Field
Ánh xạ UI sang class quản lý: tạo file ViewController.h, Giữ CTRL và kéo lần lượt label, textField để kiểu Outlet chỉ thuộc tính label và textField và đặt tên:
Trang 26[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Riêng button Cộng ta để kiểu action:
Sau khi ánh xạ và đặt tên ta sẽ được như trông như sau:
- -
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *labelResult;
- (IBAction)buttonCong:(id)sender;
@end
-
Ta thực thi bên file ViewController.m
Ta thêm đoạn mã sau trong buttonCong:
soA=[self.textfieldSoA.text intValue]; lấy dữ liệu từ ô nhập thứ nhất chuyến đổi kiểu sang
intValue, số mới có khả năng tính toán Tương tự với soB
Lưu ý: Trong ios nếu kiểu dữ liệu nhập vào ô textField là không thể chuyển sang kiểu số thì gán =0 giá trị mặc định khi không thể chuyển đổi được
tong=soA+soB; gán tổng bằng tổng 2 số vừa lấy ra Định dạng lại kết quả kiểu NSString, kiểu text mới có thể đưa dữ liệu lên label, đưa dữ liệu lên label
2 Tiếp theo mình giới thiệu cho các bạn về Slider
Slider là gì? là môt thanh có con trỏ cho phép tuỳ chỉnh một miền dữ liệu trên thanh Thường ứng dụng như tinh chỉnh ánh sáng, màu sắc, độ trong suốt…
ví dụ: Ta có một thanh slider và một label trả về miền giá trị, khi ta kéo con trỏ trên thanh slider:
Ta thiết kế trên ViewControler ví dụ trước :
ta thêm slider và cho con trỏ vào chính giữa
Trang 27Ta thêm label và đổi text thành 0.500000, đơn giản bởi ta cho con trỏ ở chính giữa, miền ta cho chạy
Ánh xạ tương tự như ví dụ trên và đặt tên ta cần thuộc tính để lấy data từ con trỏ và action
để cho phép lấy dữ liệu khi di chuyển con trỏ
-
- (IBAction)sliderbarChange:(id)sender;
Trang 28[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
-
- (IBAction)sliderbarChange:(id)sender { UISlider *slider=(UISlider*) sender;
self.labelSliderBar.text=[[NSString alloc]initWithFormat:@"%f",slider.value];
} - khi ta di con trỏ giá trị con trỏ lưu trong value, sẽ hiện thị trên label Sliderbar
Tuỳ từng ứng dụng mà ta lấy miền giá trị truyền vào!
3 Stepper
Stepper là gì? stepper bao gồm 2 nút + và – là một thanh dữ liệu min max, thanh này sẽ nhảy bậc theo bậc ta quy định khác slider ở chỗ slider miền liên tục, stepper tăng giảm rời rạc, ứng dụng như tăng giảm âm thanh…
Ví dụ
Ta có một Stepper, và label hiển thị kết quả khi tăng giảm
Ánh xạ Stepper: thuộc tính để lấy giá trị stepper, action để mỗi lần thay đổi ta lấy được giá trị thay đổi
-
@property (weak, nonatomic) IBOutlet UIStepper *stepper;
- (IBAction)step:(id)sender;
- ánh xạ label gán giá trị =0 để hiển thị kết quả stepper :
-
@property (weak, nonatomic) IBOutlet UILabel *labelSliderBar;
Trang 29Thực thi thêm đoạn mã sau:
-
- (void)viewDidLoad { [super viewDidLoad];
self.stepper.stepValue=2;
self.stepper.minimumValue=-2;
self.stepper.maximumValue= 51;
- bước nhảy mỗi lần nhấn vào + or - giá trị min=-2, max= 51;
-
- (IBAction)step:(id)sender { double number=[self.stepper value];
self.labelStepper.text=[[NSString alloc]initWithFormat:@"%f",number ];
} - [ self.stepper value] lấy ra giá trị của stepper hiện tại
=> sau đó đưa lên label
như vậy mình đã hướng dẫn cơ bản một số UI cơ bản!
Link full code : http://www.mediafire.com/file/t7d2d54u6xnivhc/UICoBan.zip
X Tìm hiểu về Progress View, Activity View, Segmented Control, Switch trong ios
Tiếp tục giới thiệu, cách dùng, và dùng các Control trên.!
Tạo một dự án mới và đặt tên:
Đầu tiên mình thiết kế giao diện chung như hình sau:
Trang 30[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Bao gồm:Progress View, Activity View, Segmented Control, Switch kéo thả từ tập các danh sách UI:
Segmented Control:
Chúng ta có thể đổi số lượng segments , lựa chọn từng segment và thay đổi tiêu đề (title) cho từng segment tuỳ ứng dụng của mình
Đối với segment chúng ta khai báo: Property để lựa chọn đang sử dụng segment nào, và action
để lọc thông tin tuỳ theo từng segment
Ứng dụng chủ yếu là để lọc thông tin như messager chẳng hạn.!
Khai báo một label đổi text=”Filter Friend” Dùng để hiển thị nội dung segment khi ta lọc thông
tin
Progress View: có thể thay đổi vị trí thanh màu xanh progress
Trang 31Dùng để tăng giảm theo bước nhảy trong khoảng Min Max, Tuy nhiên nó biểu biễn cụ thể trực quan hơn Stepper, và nó cũng rời rạc chứ không liên tục như Slider
Ở đây mình thêm 2 button là + – dùng để tăng giảm Progress Progress chỉ sử dụng Property để thay đổi khung màu xanh chạy cho tới khi full
Ứng dụng: Sử dụng khi biết chính xác thời gian load dữ liệu Ngược lại vớiActivity là cứ quay khi nào load dữ liệu thành công thì dừng quay
Switch: Sử dụng rất đơn giản chỉ có 2 trạng thái ON or OFF Nếu on thì làm gì đó off thì dừng việc
đó lại Sử dụng khi bật tắt chức năng gì đó hoặc cho phép hay không cho phép sử dụng ứng dụng, trong setting Iphone sử dụng rất nhiều Khai báo property để lựa chọn on or off
Activity View: Đơn giản là nếu chúng ta cho phép quay thì quay, tắt thì nó sẽ dừng quay, sử dụng
rất nhiều khi load data mà không biết khi nào xong, chưa load xong thì nó sẽ quay, và ngay khi lấy được data thì sẽ dừng quay
Thiết kế Ứng dụng hoạt động theo nguyên lý như sau:
– Khi chọn vào segment thì label sẽ hiển thị nội dung lọc
– Khi nhấn vào cộng trừ thì progress tăng giảm
– Khi chọn vào ON thì Activity quay, OFF thì activity dừng quay
Kết nối UI với class ViewController.h quản lý:
Giữ Ctrl vào kéo vào class quản lý và đặt tên:
Sau khi ánh xạ và đặt tên ta được đoạn mã:
-
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *activity;
- (IBAction)switchActivity:(id)sender;
@property (strong, nonatomic) IBOutlet UISwitch *switchControl;
@property (strong, nonatomic) IBOutlet UIProgressView *progressView;
Trang 32[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Thực thi các UI đã khai báo trong ViewController.m:
Segmented Control:
Lựa chọn:
– Nếu segmented=0, thì lọc ra friend online
– Nếu segmented=1, thì lọc ra friend all
Progress View:( min =0 , max =1)
– Tăng : mỗi lần nhấn vào nút cộng thì tăng lên o.1
– Giảm : mỗi lần nhấn vào nút trừ thì giảm đi 0.1
XI Quản lý bộ nhớ trong IOS (Memory Management)
Một vấn đề rất được quan tâm trong lập trình ios là quản lý bộ nhớ (Memory Management), chắc các bạn cũng từng đặt câu hỏi là vì sao phần mềm Iphone, Mac os, IPad… chạy rất mượt sau một thời gian dài sử dụng Đó là sự khác biệt rất tuyệt vời.Đối với các ngôn ngữ, Android , Windows phone… quản lý bộ nhớ, giải phóng bộ nhớ, thu rọn rác hoàn toàn tự động
Trang 33Manual Reference Counting (MRC) : quản lý bộ nhớ thủ công, có nghĩa là chúng ta sẽ tự
quản lý bộ nhớ bằng cách đánh dấu, theo vết vòng đời của object Cụ thể là ta sẽ đếm việc khởi tạo, sử dụng và giải phóng object trong chương trình
Autiomatic Reference Counting (ARC) : quản lý bộ nhớ tự động, hệ thống sẽ dùng bộ đếm
tương tự như MRC nhưng nó sẽ thêm vào phương thức quản lý bộ nhớ tự động tại thời điểm compile
Garbage Collection (GC) : hệ thống sẽ tự động lưu vết và tự động giải phóng vùng nhớ của
object không cần thiết nữa Nó sử dụng kỹ thuật quản lý bộ nhớ khác với MRC và ARC, tuy nhiên GC chỉ hỗ trợ Mac OS X mà không hỗ trợ iOS
IOS bây giờ sử dụng trình ARC để giải phóng bộ nhớ, và rọn rác Tuy nhiên chúng ta vẫn quản
lý từng biến thuộc tính cho phép tham chiếu đến đối tượng như thế nào? khi nào được phép giải phóng? …
2 Quản lý bộ nhớ đối với biến:
Trước khi đi vào cụ thể mình có lưu ý một số thuật ngữ sau tiện cho sử dụng
Lưu ý:
1 Trỏ đến = tham chiếu đến
2 Sở hữu đối tượng = có quyền quyết định đến sự tồn tại của đối tượng
Strong trỏ đến đối tượng và có quyền sở hữu đối tượng, nghĩa là có quyền quyết định đến sự tồn tại của đối tượng
– Mặc định là strong: Khi bị gán mới nghĩa là trỏ đến đối tượng mới thì ô nhớ chứa đối
Arr=@[@(10)]; Arr trỏ đến vùng nhớ chứa giá trị @[@(10)] dẫn tới vùng nhớ chứa giá trị
@[@(1)] không có ai trỏ tới và sẽ bị giải phóng
=>Ngay lật tức vùng nhớ cũ bị ARC giải phóng
kết quả: Arr=10
– Đối với strong gán bằng strong :
- // biến kiểu strong gán strong
strong NSArray *Arr1=@[@(1)];
strong NSArray *Arr2=Arr1;// gán và cả 2 mảng cùng trỏ đến 1 vùng nhớ!!! quyền sở hữu như nhau
Arr1=@[@(10)];// thay đổi vùng nhớ cho Arr1 tuy nhiên thằng Arr2 vẫn trỏ đến, vùng nhớ cũ vẫn tồn tại
NSLog(@"%@",Arr2);
Trang 34[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Arr2=Arr1 => Arr2 trỏ đến cùng vùng nhớ của đối tượng Arr1 trỏ với, và cũng có quyền sở hữu như nhau Vì thế khi gán lại Arr1=@[(10)] vùng nhớ cũ không bị giải phóng
Kết quả Arr2=1;
-Đối với weak gán bằng strong:
Weak trỏ tới đối tượng , nhưng không có quyền sở hữu đến đối tượng, nghĩa là không có quyền quyết định đến sự tồn tại của đối tượng
thêm đoạn mã sau:
- // kiểu weak gán strong
strong NSArray *Arr3=@[@(1)];
weak NSArray *Arr4=Arr3;// Arr4 trỏ vào vùng nhớ của Arr3, phụ thuộc Arr3 khi vùng nhớ Arr3 bị xoá thì Arr4 nil
weak Arr4 = Arr3 => Arr 4 trỏ đến cùng vùng nhớ của đối tượng Arr3, nhưng không có quyền
sở hữu vùng nhớ đó, chỉ tham chiếu gián tiếp thông qua Arr3
Khi Arr3=@[@(10)]; thì Arr3 trỏ đến vùng nhớ chứa đối tượng mới, mà Arr3 có quyền sở hữu vùng nhớ cũ dẫn tới vùng nhớ cũ bị giải phóng , dẫn tới Arr4=nil rỗng
kết quả Arr4=nil;
unsafe_unretained: unsafe_unretained luôn trỏ về vùng nhớ cũ.khi vùng nhớ bị giải phóng
nó vẫn trỏ đến vùng nhớ giải phóng, có thể dẫn đến crash chương trình khi vùng nhớ bị xoá
Tuy nhiên :giải phóng không có nghĩa là vùng nhớ bị xoá như kiểu thùng rác quản lý trong
máy tính lưu lại một thời gian sau đó mới xóa
Kiểu gán này không làm tăng vùng nhớ, dùng gán biến tạm
- strong NSArray *Arr5=@[@(1)];
unsafe_unretained NSArray *Arr6=Arr5;
Arr5=@[@(10)];
NSLog(@"%@",Arr6);
- Thằng Arr6 luôn trỏ về vùng nhớ cũ của Arr5 cho dù Arr5 đã giải phóng vùng nhớ cũ
May mắn kết quả: Arr6=1
Tuy nhiên nếu để một thời gian không sử dụng biến này có thể gây crash chương trình do vùng nhớ đã được giải phóng lưu lại trong thùng rác mà chưa bị xoá, sau một thời gian đầy thùng rác bị xoá thì gây crash chương trình
3 Quản lý vùng nhớ đối với property :
Trang 35nonatomic: Không độc quyền nghĩa là rất nhiều thread cùng một thời điểm có thể thay đổi
giá trị thuộc tính, dẫn tới không an toàn
Lưu ý:Nếu chỉ có 1 luồng truy cập vào biến thì tốc độ nhanh
atomic (default): Độc quyền, nghĩa là nhiều thread cùng truy cập thì thread này gán giá trị
chỉnh sửa xong mới cho phép thread khác sử dụng biến đó để chỉnh sửa
Lưu ý:Truy cập chậm hơn nonatomic nếu chỉ có 1 luồng do có cơ chế khóa mặc định khi có nhiều luồng truy cập!
Tính cho phép đọc ghi dữ liệu vào thuộc tính Property: (IVar đọc ghi bình thường)
readwrite (default): cho phép đọc, ghi vào thuộc tính
readonly : chỉ cho phép đọc, không cho phép ghi (set),”các biến thể hiện vẫn đọc ghi bình
thường”
Thay đổi tên mặc định cho hàm get, set Property:
Do tên set get thường là tính từ, thuộc tính là danh từ, or ta muốn quản lý lại get set, nên ta cần nhu cầu thay đổi tên get set mặc định
@property(assign,getter=isAge,setter=setIsAge:) int age; sử dụng “getter = tên getter mới”,
“setter=tên setter mới:”
Quản lý bộ nhớ đối với thuộc tính đối tượng
Đối với thuộc tính là kiểu đối tượng trong Objective C:
Lưu ý: nhắc lại
1 Trỏ đến = tham chiếu đến
2 Sở hữu đối tượng = có quyền quyết định đến sự tồn tại của đối tượng
3 Strong pointer và weak pointer đề cập đến việc tham chiếu mạnh hay yếu tới object
Strong pointer: là một con trỏ, trỏ đến một đối tượng và sở hữu (own) đối tượng đó biến
iVar sẽ là weak pointer
Weak pointer: là một con trỏ, trỏ đến một đối tượng nhưng không sở hữu (own) đối tượng
đó.weak thường đi kèm với một đối tượng kiểu strong.” biến iVar sẽ là strong pointer, tương đương với retain
Ví vụ minh họa: Ta khai báo một class sinhVien như sau:
-
@interface sinhVien : NSObject
@property(strong,nonatomic) NSArray *model;
-(void) infor;
@end - Thực thi hàm infor:
- -
@implementation sinhVien -(void) infor{
Trang 36[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
arr=nil;
NSLog(@"strong : %@",self.model);
}
@end - Tương tự kiểu strong trong biến mà mình đã giải thích ở trên: kết quả model=0 có cùng quyền sở hữu do tham chiếu mạnh
nếu ta thay đổi strong thành weak
-
@property(weak,nonatomic) NSArray *model;
- khi đó model=nil do tham chiếu yếu không có quyền sở hữu đối tượng Tương tự như weak trong biến mà mình đã giải thích ở trên
unsafe_unretained: Tương tự unsafe_unretained trong biến, Dùng cho kiểu thuộc tính là đối
tượng
Copy:
copy: cố gắng copy khi property được gán
copy là sao chép toàn bộ đối tượng của property được gán! xong lưu đối tượng đó vào vùng nhớ mới
Copy phát huy tác dụng khi muốn tạo một bản sao rồi chỉnh sửa mà không ảnh hưởng đến đối tượng cũ Sử dụng chủ yếu NSMutableDictionary, NSMutableString, NSMutableArray, lấy bản sao dữ liệu rồi tuỳ chỉnh
Ví dụ sau:
-
@interface sinhVien : NSObject
@property(copy,nonatomic) NSMutableArray *model;
-(void) infor;
@end - Thực thi hàm infor:
-
@implementation sinhVien -(void) infor{
NSMutableArray *arr=@[@(0)];
Đối với thuộc tính là kiểu nguyên thủy trong C:
Assign(default): trỏ vào ô nhớ tương tự như unsafe_unretained, tuy nhiên dùng nhẹ nhàng
hơn rất nhiều, vì nó dùng cho kiểu nguyên thủy C
Trang 37Chú ý: kiểu nguyên thủy C khi khai báo luôn trỏ vào một vùng nhớ mà không bị thay đổi vùng nhớ, chỉ tham chiếu giá trị cho biến chính vì thế Assign mới phát huy được ưu điểm là trỏ vào một vùng nhớ
XII Điều hướng sử dụng Navigation controller
Ở bài này mình sẽ hướng dẫn cho các bạn về cách điều hướng các màn hình tuỳ chỉnh theo nhu cầu ứng dụng của các bạn Hướng dẫn cụ thể về Navigation Navigation là gì ? …
Navigation là một trong phong cách chuyển tiếp sử dụng rất phổ biến trong ứng dụng IOS, Giống như vào lâu đài chỉ có một lối đi và phải qua nhiều cách cửa sau mỗi cánh cửa là một thế giới khác nhau!, chúng ta muốn quay lại một thế giới,hay đi tiếp đều phải qua các cửa trên mội lối đi
đó Như thế Navigation là các cách cửa giúp ta vào các thế giới khác nhau, Ở trong IOS nó là các điều hướng NEXT or BACK để mở ra các màn hình khác nhau 🙂
Để cụ thể hơn, trong Setting Iphone khi ta cài ứng dụng thì nó luôn có danh sách các ứng dụng, click vào sẽ mở ra chi tiết thông tin của ứng dụng đó, khi back lại quay lại list ứng dụng đó chính
là navigation
Bắt đầu cụ thể nào :
Khởi tạo project mới đặt tên:
Mình sẽ thiết kế ứng dụng với nội dung sau :
Sau khi thiết kế nó sẽ trông như thế này :
Trang 38[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
– ViewController 1: Danh sách ảnh và thông tin về ảnh đó!
– ViewController 1: Khi click vào một ảnh thì ảnh sẽ chuyển sang chế độ xem lớn hơn, và hiển thị thông tin về ảnh
Thiết kế giao diện: Vào Main.storyboard!
Kéo vào thêm một ViewController :
– Đối với ViewController 1:
Kéo vào một TabelView, và một TableViewCell Thêm imageView ể hiển thị ảnh ở dạng list, và một label để hiển thị thông tin ảnh!, thay đổi màu nền cho ViewController
=> Sau khi căn chỉnh ta sẽ trông như thế này:
Trang 40[Tự học lập trình iOS từ Cơ Bản – Chuyên Sâu]
Link tải ảnh : http://www.mediafire.com/download/qbi32hamm5vgpmb/Archive.zip
Sau khi tải ảnh về , giải nén ra và kéo vào dự án: