雖然如今身處大公司,可是由於是內部創業團隊,產品、native、前端、服務器端所有坐在一塊兒開發,你們很容易作零距離交流,也由於最近內部有一個前端要轉崗過來,因而手裏的前端任務好像能夠拋一大坨出去了,這個時候馬上想到了切入IOS開發!!!html
事實上,前端開發作到必定時間,要進步很難了,最近幾個月撲到業務上便感受突破不了目前的瓶頸,自身的前端瓶頸主要在兩方面:技術深度、技術廣度前端
其實不論深度或者廣度來講都不是簡單前端能說清楚的事情,不能說了解了angularJS、react等框架技術深度就深了,由於事實上angular中包含了不少設計思想,學習他是編程思想的提高,並不單是js功力的提高。node
要說自身職業規劃,前端固然能夠往nodeJS發展走大前端方向,可是這個真的須要項目支持,屢次嘗試自學nodeJS皆收效甚微,即是由於沒有實際項目支持,說白了沒有人帶着作項目。react
而團隊內部有人帶着作IOS開發,我竟然能夠從零開始自學而後參與生產項目開發,想一想真的使人興奮!!!ios
可是天下沒有不要錢的午飯,切入IOS開發的前提是保證現有H5任務的工期以及質量,因此加班什麼的在所不免,但是我怎麼可能放棄這種百年不遇的好事呢?因而立馬給技術老大說了願意多承擔工做的意願,老大也很nice的答應我能夠切入IOS開發,因而這一切便如此美好的開始了!因此接下來一段時間只須要fighting就夠了!!!web
感謝慕課網的入門教程,一樣感謝網上諸多資料,特別是該園友博客:http://www.cnblogs.com/kenshincui/編程
今時不一樣往日,已經不可能有太多的空閒時間給我學習了,剛開始也想過應該系統的學習,一章一章的鞏固知識,可是這樣效率過低,等我學完都猴年馬月了,項目早結束了數組
因此如今適合個人學習方法是作簡單而且熟悉多項目,好比大一的C語言考試,學生管理系統xcode
簡單設計一個學生管理系統,要求具備如下功能:服務器
1 能夠錄入學生姓名,性別、課程等信息
2 能夠給各門課程錄入考試成績
3 支持姓名排序,班級排序,成績排序
由於最初作項目是爲了熟悉語言,因此不須要太複雜,因而咱們便開始吧!!!
你要開發IOS程序,首先得有一臺Mac機,其次須要安裝xcode開發工具,我反正是去借了一臺,而後讓同事考了一個最新版的xcode,因而開始開發吧。
OC中的類皆繼承至NSObject類,會帶有一些特有而且常常會用到的方法,具體細節咱們不去糾結,直接建立類吧
新建一個類會造成兩個文件:file.h頭文件與file.m爲類的具體實現文件,咱們這裏新建一個Student類:
1 #import <Foundation/Foundation.h>
2
3 @interface Student : NSObject
4
5 @end
#import "Student.h"
@implementation Student
@end
咱們這裏不去吐槽OC的怪異語法,由於咱們若是得去學習一個東西,就不要吐槽他,這樣會分散你的注意力而且會讓學習難以繼續,因此回到正題
OC的屬性定義在頭文件中,以學生來講咱們規定其有如下屬性,其中課程真實場景會被抽象爲一個類,因此咱們也這樣作吧,新建Course類,而且給學生的屬性以下:
1 #import <Foundation/Foundation.h>
2 #import "Course.h"
3
4 @interface Student : NSObject
5 { 6 NSString *_name; 7 int _age; 8 NSString *_sex; 9 Course *_chinese; 10 Course *_math; 11 //錄入時間 12 NSDate *_dateCreate; 13 } 14 @end
課程類只具備名字與得分兩個屬性:
1 #import <Foundation/Foundation.h>
2
3 @interface Course : NSObject
4 { 5 NSString *_name; 6 float _score; 7 } 8 @end
其中下劃線定寫法爲OC的規則,咱們不須要知道他爲何要這樣作,先作再說,後面熟悉了天然就知道了,與C#同樣,屬性會有getter與setter方法,OC這裏提供了語法糖,咱們暫不使用,老老實實的寫代碼,下面爲兩個類的具體實現:
構造函數是每一個類實例化的入口點,每個繼承至NSObject的對象都會有一個init的實例方法,這個即是其構造函數,咱們這裏自定義構造函數,Course與Student的構造函數
1 #import <Foundation/Foundation.h>
2 #import "Student.h"
3 #import "Course.h"
4
5 int main(int argc, const char * argv[]) {
6 @autoreleasepool { 7 8 //alloc方法建立實例空間,init初始化 9 Course *c = [[Course alloc] initWithName:@"葉小釵" andScore:90]; 10 11 NSLog(@"%@, %f", c.name, c.score); 12 13 } 14 return 0; 15 }
成功打印出咱們想要的代碼,因此這個時候再將Student類的構造方法加上,而且給Student釋放一個對外實例方法:showData
1 #import <Foundation/Foundation.h>
2 #import "Student.h"
3 #import "Course.h"
4
5 int main(int argc, const char * argv[]) {
6 @autoreleasepool { 7 8 //alloc方法建立實例空間,init初始化 9 Course *chinese = [[Course alloc] initWithName:@"語文" andScore:90]; 10 Course *math = [[Course alloc] initWithName:@"數學" andScore:95]; 11 12 Student *s = [[Student alloc] initWithName:@"葉小釵" andAge:27 andSex:@"男" andChinese:chinese andMath:math]; 13 14 [s showData]; 15 16 } 17 return 0; 18 }
2015-08-06 23:42:24.853 student[3394:246243] 姓名:葉小釵
2015-08-06 23:42:24.854 student[3394:246243] 性別:男 2015-08-06 23:42:24.854 student[3394:246243] 年齡:27 2015-08-06 23:42:24.855 student[3394:246243] 課程名:語文 2015-08-06 23:42:24.855 student[3394:246243] 課程得分:90.000000 2015-08-06 23:42:24.855 student[3394:246243] 課程名:數學 2015-08-06 23:42:24.855 student[3394:246243] 課程得分:95.000000 Program ended with exit code: 0
顯然,學生不僅一個,咱們須要一個集合來裝載全部的學生,對於沒有OC經驗的我第一時間想到了數組,因此咱們首先來簡單瞭解下OC中的數組
數組屬於集合你們族中的一類,簡單來講有數組和字典,NSArray NSDictionary
NSArray是一個Cocoa類,用來存儲對象的有序列表,咱們能夠在NSArray中放入任意類型的對象:字符串、對象,基本類型等。
NSArray有兩個限制,首先是隻能存儲OC類型的對象,同時不要在裏面存儲nil(對應其它語言中的NULL),咱們可使用類方法arrayWithObjects建立一個數組對象,好比:
1 //nil表明數組結束 2 NSArray *array = [NSArray arrayWithObjects:@"葉小釵", 23, math, nil]; 3 4 //或者這樣,注意這裏會報錯,由於NSArray只能保存對象,但23倒是基本類型 5 //前面能處理是由於內部發生了裝箱拆箱的過程 6 //NSArray *array2 = @[@"葉小釵", 23, math]; 7 NSNumber *num1 = [[NSNumber alloc] initWithInt:23]; 8 NSArray *array2 = @[@"葉小釵", num1, math]; 9 10 NSLog(@"%d", array[1]); 11 NSLog(@"%d", [array2[1] intValue]);
下面是數組的一些其它操做:
PS:這裏插一根nslog相關的類型映射
1 %@ 對象 2 %d, %i 整數 3 %u 無符整形 4 %f 浮點/雙字 5 %x, %X 二進制整數 6 %o 八進制整數 7 %zu size_t 8 %p 指針 9 %e 浮點/雙字 (科學計算) 10 %g 浮點/雙字 11 %s C 字符串 12 %.*s Pascal字符串 13 %c 字符 14 %C unichar 15 %lld 64位長整數(long long) 16 %llu 無符64位長整數 17 %Lf 64位雙字
18 %i 布爾型
1 //nil表明數組結束 2 NSArray *array = [NSArray arrayWithObjects:@"葉小釵", @"111", @"ddd", @"dd11", nil]; 3 4 //數組遍歷 5 //array count求得數組長度 6 for (int i = 0; i < [array count]; i++) { 7 NSLog(@"%@", array[i]); 8 } 9 10 //更好的遍歷方式 11 for(id item in array){ 12 NSLog(@"%@", item); 13 } 14 15 //判斷是否包含某個對象=>1 16 NSLog(@"%i", [array containsObject:@"1111"]); 17 //判斷是否包含某個對象=>0 18 NSLog(@"%i", [array containsObject:@"葉小釵"]); 19 20 //返回第一個找到對象的索引=>2 21 NSLog(@"%d", [array indexOfObject:@"ddd"]); 22 23 //簡單排序語法糖,很實用,後面會使用這裏不詳說 24 NSArray *array1 = [array sortedArrayUsingSelector:@selector(compare:)]; 25 26 for(id item in array1){ 27 NSLog(@"%@", item); 28 }
這裏排序後面會有更多的應用
與NSSting一致,NSArray建立的是不可變數組,一旦建立包含特定數量的數組便不能再增減,爲了彌補NSArray的不足,便有了NSMutabeArray類,經過arrayWithCapacity來建立可變數組,這裏以一例子作說明:
1 //建立空數組 2 NSMutableArray *array = [[NSMutableArray alloc] init]; 3 4 //插入5個數字,這裏發生了裝箱 5 for (int i = 0; i < 5; i++) { 6 NSNumber *n = [NSNumber numberWithInt:i]; 7 [array addObject:n]; 8 } 9 10 //打印當前長度 11 NSLog(@"%d", [array count]); 12 13 //在第二個元素後插入程咬金 14 [array insertObject:@"程咬金" atIndex:2]; 15 16 //刪除第一個元素 17 [array removeObjectAtIndex:0]; 18 19 NSString *s =[array componentsJoinedByString:@"|"]; 20 21 //輸出字符串,|隔開 22 NSLog(@"%@", s); 23 24 //字符串轉回來 25 NSArray *a = [s componentsSeparatedByString:@"1"]; 26 27 for(id item in array){ 28 NSLog(@"%@", item); 29 } 30 31 for(id item in a){ 32 NSLog(@"%@", item); 33 }
前面簡單介紹了OC中的數組,咱們繼續回到咱們原本的需求
後面會用到字符串相關的知識點,咱們這裏順便說一下OC的字符串,事實上NSString是一個類,因此咱們實例化的時候是指針引用,字符串的實例化不是咱們關注的重點,此次的重點放在,字符串的比較與操做,這個是咱們後面項目會遇到的。
length能夠返回字符串長度
1 NSString *s = @"sdsdsdds"; 2 NSLog(@"%d", [s length]);//=>8
字符串比較的場景必定會碰到,OC的字符串比較
1 NSString *s = @"sdsdsdds"; 2 NSString *s1 = @"sdsdsdds"; 3 NSString *s2 = @"sdsdsdds1"; 4 5 NSLog(@"%i", [s isEqualToString:s1]);//=>1 6 NSLog(@"%i", [s isEqualToString:s2]);//=>0
1 NSString *s = @"sdsdsdds"; 2 NSString *s1 = @"1sdsdsdds"; 3 NSString *s2 = @"2sdsdsdds1"; 4 5 NSLog(@"%i", [s isEqualToString:s1]);//=>1 6 NSLog(@"%i", [s isEqualToString:s2]);//=>0 7 8 //NSOrderedDescending|NSOrderedAscending 9 //NSOrderedAscending判斷兩對象值的大小(按字母順序進行比較) 10 BOOL result = [s1 compare:s2] == NSOrderedAscending; 11 NSLog(@"result:%d",result);//=>1=>true
1 NSString *s1 = @"1sdsdsdds"; 2 NSString *s2 = @"2sdsdsdds1"; 3 4 NSLog(@"%@", [s1 stringByAppendingString:s2]);
咱們使用一個可變數組裝在咱們的學生,而且錄入3條數據,最後以他們的總分排序,咱們這裏先
1 //建立學生集合 2 NSMutableArray *students = [[NSMutableArray alloc] init]; 3 Student *student; 4 5 //下面代碼可能會出現警告信息,以我如今的熟悉度是確定不知道爲何,並且我暫時也不會關注 6 for(int i = 0; i < 5; i++) { 7 //初始化臨時學生變量,插入數組 8 student = [[Student alloc] 9 initWithName:[@"姓名_" stringByAppendingString: [NSString stringWithFormat:@"%d", i]] 10 andAge:(18 + arc4random() % 4) 11 andSex:(arc4random() % 2 == 0 ? @"男" : @"女") 12 andChinese:[[Course alloc] initWithName:@"語文" andScore:arc4random() % 101] 13 andMath:[[Course alloc] initWithName:@"數學" andScore:arc4random() % 101]]; 14 [students addObject:student]; 15 } 16 17 for(id item in students){ 18 [item showData]; 19 }
這裏會打印出每一個學生的東西:
2015-08-09 11:46:23.380 student[5454:444911] 姓名:姓名_0 2015-08-09 11:46:23.382 student[5454:444911] 性別:女 2015-08-09 11:46:23.382 student[5454:444911] 年齡:20 2015-08-09 11:46:23.387 student[5454:444911] 入學時間:2015-08-09 03:46:23 +0000 2015-08-09 11:46:23.387 student[5454:444911] 課程名:語文 2015-08-09 11:46:23.388 student[5454:444911] 課程得分:59.000000 2015-08-09 11:46:23.388 student[5454:444911] 課程名:數學 2015-08-09 11:46:23.388 student[5454:444911] 課程得分:7.000000 2015-08-09 11:46:23.388 student[5454:444911] 姓名:姓名_1 2015-08-09 11:46:23.388 student[5454:444911] 性別:女 2015-08-09 11:46:23.389 student[5454:444911] 年齡:20 2015-08-09 11:46:23.389 student[5454:444911] 入學時間:2015-08-09 03:46:23 +0000 2015-08-09 11:46:23.389 student[5454:444911] 課程名:語文 2015-08-09 11:46:23.389 student[5454:444911] 課程得分:79.000000 2015-08-09 11:46:23.389 student[5454:444911] 課程名:數學 2015-08-09 11:46:23.390 student[5454:444911] 課程得分:13.000000 2015-08-09 11:46:23.390 student[5454:444911] 姓名:姓名_2 2015-08-09 11:46:23.390 student[5454:444911] 性別:女 2015-08-09 11:46:23.390 student[5454:444911] 年齡:18 2015-08-09 11:46:23.390 student[5454:444911] 入學時間:2015-08-09 03:46:23 +0000 2015-08-09 11:46:23.391 student[5454:444911] 課程名:語文 2015-08-09 11:46:23.391 student[5454:444911] 課程得分:87.000000 2015-08-09 11:46:23.391 student[5454:444911] 課程名:數學 2015-08-09 11:46:23.391 student[5454:444911] 課程得分:52.000000 2015-08-09 11:46:23.391 student[5454:444911] 姓名:姓名_3 2015-08-09 11:46:23.392 student[5454:444911] 性別:女 2015-08-09 11:46:23.392 student[5454:444911] 年齡:18 2015-08-09 11:46:23.392 student[5454:444911] 入學時間:2015-08-09 03:46:23 +0000 2015-08-09 11:46:23.392 student[5454:444911] 課程名:語文 2015-08-09 11:46:23.393 student[5454:444911] 課程得分:13.000000 2015-08-09 11:46:23.393 student[5454:444911] 課程名:數學 2015-08-09 11:46:23.393 student[5454:444911] 課程得分:74.000000 2015-08-09 11:46:23.393 student[5454:444911] 姓名:姓名_4 2015-08-09 11:46:23.393 student[5454:444911] 性別:女 2015-08-09 11:46:23.394 student[5454:444911] 年齡:18 2015-08-09 11:46:23.394 student[5454:444911] 入學時間:2015-08-09 03:46:23 +0000 2015-08-09 11:46:23.394 student[5454:444911] 課程名:語文 2015-08-09 11:46:23.394 student[5454:444911] 課程得分:77.000000 2015-08-09 11:46:23.394 student[5454:444911] 課程名:數學 2015-08-09 11:46:23.395 student[5454:444911] 課程得分:58.000000 Program ended with exit code: 0
1 //建立學生集合 2 NSMutableArray *students = [[NSMutableArray alloc] init]; 3 Student *student; 4 5 6 //下面代碼可能會出現警告信息,以我如今的熟悉度是確定不知道爲何,並且我暫時也不會關注 7 for(int i = 0; i < 5; i++) { 8 //初始化臨時學生變量,插入數組 9 student = [[Student alloc] 10 initWithName:[@"姓名_" stringByAppendingString: [NSString stringWithFormat:@"%d", i]] 11 andAge:(18 + arc4random() % 4) 12 andSex:(arc4random() % 2 == 1 ? @"男" : @"女") 13 andChinese:[[Course alloc] initWithName:@"語文" andScore:arc4random() % 101] 14 andMath:[[Course alloc] initWithName:@"數學" andScore:arc4random() % 101]]; 15 [students addObject:student]; 16 } 17 18 //這裏作按考試總分排序的功能,也許是我不夠熟悉,但這裏真心不得不說寫慣了js,尼瑪OC的語法真使人蛋疼!!! 19 NSArray *sortArray = [students sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ 20 //這裏不知道爲何不能使用obj1的點語法了 21 if ([obj1 chinese].score + [obj1 math].score > [obj2 chinese].score + [obj2 math].score) { 22 return (NSComparisonResult)NSOrderedDescending; 23 } 24 if ([obj1 chinese].score + [obj1 math].score < [obj2 chinese].score + [obj2 math].score) { 25 return (NSComparisonResult)NSOrderedAscending; 26 } 27 return (NSComparisonResult)NSOrderedSame; 28 }]; 29 30 for(id item in students){ 31 [item showData]; 32 } 33 34 NSLog(@"=====排序後======\n"); 35 36 for(id item in sortArray){ 37 [item showData]; 38 }
輸出:
2015-08-09 12:59:45.483 student[5720:468194] 姓名:姓名_0 2015-08-09 12:59:45.484 student[5720:468194] 性別:女 2015-08-09 12:59:45.484 student[5720:468194] 年齡:19 2015-08-09 12:59:45.485 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.485 student[5720:468194] 課程得分:54.0 2015-08-09 12:59:45.485 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.485 student[5720:468194] 課程得分:60.0 2015-08-09 12:59:45.485 student[5720:468194] 考試總分:114.0 2015-08-09 12:59:45.486 student[5720:468194] ------------- 2015-08-09 12:59:45.486 student[5720:468194] 姓名:姓名_1 2015-08-09 12:59:45.486 student[5720:468194] 性別:男 2015-08-09 12:59:45.486 student[5720:468194] 年齡:18 2015-08-09 12:59:45.486 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.486 student[5720:468194] 課程得分:33.0 2015-08-09 12:59:45.487 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.487 student[5720:468194] 課程得分:85.0 2015-08-09 12:59:45.487 student[5720:468194] 考試總分:118.0 2015-08-09 12:59:45.487 student[5720:468194] ------------- 2015-08-09 12:59:45.487 student[5720:468194] 姓名:姓名_2 2015-08-09 12:59:45.487 student[5720:468194] 性別:女 2015-08-09 12:59:45.540 student[5720:468194] 年齡:19 2015-08-09 12:59:45.541 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.541 student[5720:468194] 課程得分:98.0 2015-08-09 12:59:45.541 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.541 student[5720:468194] 課程得分:37.0 2015-08-09 12:59:45.541 student[5720:468194] 考試總分:135.0 2015-08-09 12:59:45.542 student[5720:468194] ------------- 2015-08-09 12:59:45.542 student[5720:468194] 姓名:姓名_3 2015-08-09 12:59:45.542 student[5720:468194] 性別:男 2015-08-09 12:59:45.542 student[5720:468194] 年齡:18 2015-08-09 12:59:45.542 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.542 student[5720:468194] 課程得分:69.0 2015-08-09 12:59:45.543 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.543 student[5720:468194] 課程得分:1.0 2015-08-09 12:59:45.543 student[5720:468194] 考試總分:70.0 2015-08-09 12:59:45.543 student[5720:468194] ------------- 2015-08-09 12:59:45.543 student[5720:468194] 姓名:姓名_4 2015-08-09 12:59:45.543 student[5720:468194] 性別:女 2015-08-09 12:59:45.543 student[5720:468194] 年齡:20 2015-08-09 12:59:45.544 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.544 student[5720:468194] 課程得分:88.0 2015-08-09 12:59:45.560 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.560 student[5720:468194] 課程得分:16.0 2015-08-09 12:59:45.561 student[5720:468194] 考試總分:104.0 2015-08-09 12:59:45.561 student[5720:468194] ------------- 2015-08-09 12:59:45.561 student[5720:468194] =====排序後====== 2015-08-09 12:59:45.562 student[5720:468194] 姓名:姓名_3 2015-08-09 12:59:45.562 student[5720:468194] 性別:男 2015-08-09 12:59:45.562 student[5720:468194] 年齡:18 2015-08-09 12:59:45.563 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.563 student[5720:468194] 課程得分:69.0 2015-08-09 12:59:45.563 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.563 student[5720:468194] 課程得分:1.0 2015-08-09 12:59:45.564 student[5720:468194] 考試總分:70.0 2015-08-09 12:59:45.564 student[5720:468194] ------------- 2015-08-09 12:59:45.564 student[5720:468194] 姓名:姓名_4 2015-08-09 12:59:45.564 student[5720:468194] 性別:女 2015-08-09 12:59:45.565 student[5720:468194] 年齡:20 2015-08-09 12:59:45.565 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.565 student[5720:468194] 課程得分:88.0 2015-08-09 12:59:45.565 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.566 student[5720:468194] 課程得分:16.0 2015-08-09 12:59:45.566 student[5720:468194] 考試總分:104.0 2015-08-09 12:59:45.603 student[5720:468194] ------------- 2015-08-09 12:59:45.603 student[5720:468194] 姓名:姓名_0 2015-08-09 12:59:45.603 student[5720:468194] 性別:女 2015-08-09 12:59:45.603 student[5720:468194] 年齡:19 2015-08-09 12:59:45.604 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.604 student[5720:468194] 課程得分:54.0 2015-08-09 12:59:45.604 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.604 student[5720:468194] 課程得分:60.0 2015-08-09 12:59:45.604 student[5720:468194] 考試總分:114.0 2015-08-09 12:59:45.605 student[5720:468194] ------------- 2015-08-09 12:59:45.605 student[5720:468194] 姓名:姓名_1 2015-08-09 12:59:45.605 student[5720:468194] 性別:男 2015-08-09 12:59:45.605 student[5720:468194] 年齡:18 2015-08-09 12:59:45.605 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.605 student[5720:468194] 課程得分:33.0 2015-08-09 12:59:45.606 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.606 student[5720:468194] 課程得分:85.0 2015-08-09 12:59:45.606 student[5720:468194] 考試總分:118.0 2015-08-09 12:59:45.606 student[5720:468194] ------------- 2015-08-09 12:59:45.606 student[5720:468194] 姓名:姓名_2 2015-08-09 12:59:45.606 student[5720:468194] 性別:女 2015-08-09 12:59:45.607 student[5720:468194] 年齡:19 2015-08-09 12:59:45.607 student[5720:468194] 課程名:語文 2015-08-09 12:59:45.626 student[5720:468194] 課程得分:98.0 2015-08-09 12:59:45.626 student[5720:468194] 課程名:數學 2015-08-09 12:59:45.626 student[5720:468194] 課程得分:37.0 2015-08-09 12:59:45.627 student[5720:468194] 考試總分:135.0 2015-08-09 12:59:45.627 student[5720:468194] ------------- Program ended with exit code: 0
完整的代碼:
1 #import <Foundation/Foundation.h> 2 3 @interface Course : NSObject 4 { 5 NSString *_name; 6 float _score; 7 } 8 9 -(instancetype)initWithName:(NSString *)newName andScore:(float)newScore; 10 11 -(void)setName: (NSString *)str; 12 -(NSString *)name; 13 14 -(void)setScore: (float)fl; 15 -(float)score; 16 17 -(void)showData; 18 19 @end 20 21 #import "Course.h" 22 23 @implementation Course 24 25 //自定義構造方法 26 -(instancetype)initWithName:(NSString *)newName andScore:(float)newScore 27 { 28 self = [super init]; 29 if (self) { 30 _name = newName; 31 _score = newScore; 32 } 33 return self; 34 } 35 36 -(void) setName:(NSString *)str 37 { 38 _name = str; 39 } 40 41 -(NSString *) name 42 { 43 return _name; 44 } 45 46 -(void) setScore:(float)fl 47 { 48 _score = fl; 49 } 50 51 -(float) score 52 { 53 return _score; 54 } 55 56 -(void) showData 57 { 58 NSLog(@"課程名:%@", _name); 59 NSLog(@"課程得分:%.1f",_score); 60 } 61 62 @end 63 64 #import <Foundation/Foundation.h> 65 #import "Course.h" 66 67 @interface Student : NSObject 68 { 69 NSString *_name; 70 int _age; 71 NSString *_sex; 72 Course *_chinese; 73 Course *_math; 74 //錄入時間 75 NSDate *_dateCreate; 76 } 77 78 -(instancetype)initWithName:(NSString *)newName andAge:(int)newAge andSex:(NSString *)newSex andChinese:(Course *) newChinese andMath:(Course *) newMath; 79 80 -(void)setName: (NSString *)str; 81 -(NSString *)name; 82 83 -(void)setAge: (int)a; 84 -(int)age; 85 86 -(void)setSex: (NSString *)str; 87 -(NSString *)sex; 88 89 -(void)setChinese: (Course *)c; 90 -(Course *)chinese; 91 92 -(void)setMath: (Course *)c; 93 -(Course *)math; 94 95 //只暴露讀取接口 96 -(NSDate *)dateCreate; 97 98 -(void) showData; 99 100 @end 101 102 #import "Student.h" 103 104 @implementation Student 105 106 -(instancetype)initWithName:(NSString *)newName andAge:(int)newAge andSex:(NSString *)newSex andChinese:(Course *) newChinese andMath:(Course *) newMath 107 { 108 self = [super init]; 109 if (self) { 110 _name = newName; 111 _age = newAge; 112 _sex = newSex; 113 _chinese = newChinese; 114 _math = newMath; 115 _dateCreate = [[NSDate alloc] init]; 116 } 117 return self; 118 } 119 120 -(void) setName:(NSString *)str 121 { 122 _name = str; 123 } 124 125 -(NSString *) name 126 { 127 return _name; 128 } 129 130 -(void)setAge: (int)a 131 { 132 _age = a; 133 } 134 135 -(int)age 136 { 137 return _age; 138 } 139 140 -(void)setSex: (NSString *)str 141 { 142 _sex = str; 143 } 144 145 -(NSString *)sex 146 { 147 return _sex; 148 } 149 150 -(void)setChinese: (Course *)c 151 { 152 _chinese = c; 153 } 154 155 -(Course *)chinese 156 { 157 return _chinese; 158 } 159 160 -(void)setMath: (Course *)c 161 { 162 _math = c; 163 } 164 165 -(Course *)math 166 { 167 return _math; 168 } 169 170 //只暴露讀取接口 171 -(NSDate *)dateCreate 172 { 173 return _dateCreate; 174 } 175 176 -(void) showData 177 { 178 NSLog(@"姓名:%@", _name); 179 NSLog(@"性別:%@", _sex); 180 NSLog(@"年齡:%d", _age); 181 //NSLog(@"入學時間:%@", _dateCreate); 182 [_chinese showData]; 183 [_math showData]; 184 NSLog(@"考試總分:%.1f", _chinese.score + _math.score); 185 NSLog(@"-------------\n"); 186 } 187 188 @end 189 190 #import <Foundation/Foundation.h> 191 #import "Student.h" 192 #import "Course.h" 193 194 int main(int argc, const char * argv[]) { 195 @autoreleasepool { 196 197 //建立學生集合 198 NSMutableArray *students = [[NSMutableArray alloc] init]; 199 Student *student; 200 201 202 //下面代碼可能會出現警告信息,以我如今的熟悉度是確定不知道爲何,並且我暫時也不會關注 203 for(int i = 0; i < 5; i++) { 204 //初始化臨時學生變量,插入數組 205 student = [[Student alloc] 206 initWithName:[@"姓名_" stringByAppendingString: [NSString stringWithFormat:@"%d", i]] 207 andAge:(18 + arc4random() % 4) 208 andSex:(arc4random() % 2 == 1 ? @"男" : @"女") 209 andChinese:[[Course alloc] initWithName:@"語文" andScore:arc4random() % 101] 210 andMath:[[Course alloc] initWithName:@"數學" andScore:arc4random() % 101]]; 211 [students addObject:student]; 212 } 213 214 //這裏作按考試總分排序的功能,也許是我不夠熟悉,但這裏真心不得不說寫慣了js,尼瑪OC的語法真使人蛋疼!!! 215 NSArray *sortArray = [students sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2){ 216 //這裏不知道爲何不能使用obj1的點語法了 217 if ([obj1 chinese].score + [obj1 math].score > [obj2 chinese].score + [obj2 math].score) { 218 return (NSComparisonResult)NSOrderedDescending; 219 } 220 if ([obj1 chinese].score + [obj1 math].score < [obj2 chinese].score + [obj2 math].score) { 221 return (NSComparisonResult)NSOrderedAscending; 222 } 223 return (NSComparisonResult)NSOrderedSame; 224 }]; 225 226 for(id item in students){ 227 [item showData]; 228 } 229 230 NSLog(@"=====排序後======\n"); 231 232 for(id item in sortArray){ 233 [item showData]; 234 } 235 236 } 237 return 0; 238 }
控制檯輸出部分完成後,咱們的功能也就實現了一半,如今要作的是,如何將上述功能寫到app中,意思是咱們如今就要開始作app開發了,由於我沒有開發者帳號,只能在mac上模擬。
既然是app就應該有更加完善的功能了,這裏給本身的需求是:
1 有界面錄入學生信息
2 有列表可展現學生信息
3 學生信息可排序
4 可編輯、刪除學生
需求很少,多了可能就作不完,因而咱們便愉快的開始吧,此次新建項目會有所不一樣:選擇的是最簡單的single View application
這裏取個名字student_app,完了就會在模擬器中新增一個app,瞬間以爲好牛B的樣子:
而後,項目中的文件以及界面讓我感受到了陌生,這裏也不一一去了解了,直接朝着需求方向進發吧。
PS:學習過程當中最初會有意的忽略一些基礎知識,可是這些知識是咱們後面能走多遠的基礎,因此在快速熟悉後須要一個過渡期從新回來整理基礎,不然走不遠的
模型-視圖-控制器,是咱們常常聽到的mvc,爲各類與界面相關的系統都會頻繁使用的一種模式,其意義在於代碼解耦,OC APP開發遵循這一規則
視圖簡單來講即是界面,好比咱們後面要作的展現學生相關信息的界面
模型即是界面的數據來源
而控制器即是管理者,用於控制視圖與模型之間的交互,好比新增刪除什麼的
因而,咱們便開始瞭解OC中MVC是如何使用的吧,也許學事後會幫助咱們更加了解web中的MVC,偶爾我仍然以爲本身瞭解的不夠深入
在此以前,咱們先來了解幾個ios開發的基本組件,不然將使咱們的開發沒法繼續。
PS:從IOS5開始進行了改進,使用「.storyboard」文件進行設計
UILabel繼承至UIView,這個名字讓我想起了多年前作.net2.0拖控件的時光,可能他們完成的功能也差很少,作展現性工做
這裏新建一個文件:StudentViewController,繼承至UIViewController,這裏記得勾選also create xib file,會生成以下文件:
file.h 頭文件 file.m 實現文件 file.xib xml interface build
這個xml文件有點相似與html文件,作佈局用的,最初在左.net開發winform窗體軟件時,也會出現相似的文件,這裏點擊打開,果真是一個白板窗體。
這裏使用一種界面工具打開該文件(interface builder),左側是dock,右邊是畫布,那坨東西與html同樣,事實上是一坨代碼:
1 <?xml version="1.0" encoding="UTF-8" standalone="no"?> 2 <document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6211" systemVersion="14A298i" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES"> 3 <dependencies> 4 <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6204"/> 5 </dependencies> 6 <objects> 7 <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="StudentViewController"> 8 <connections> 9 <outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/> 10 </connections> 11 </placeholder> 12 <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> 13 <view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT"> 14 <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 15 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 16 <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 17 </view> 18 </objects> 19 </document>
placeholder爲佔位符對象,下面那個是view對象,雖然不知道是什麼,好像很厲害的樣子。
要使用UILabel,根據以前的開發經驗估計會有兩種:
1 本身編輯代碼
2 ide會有工具箱讓咱們拖
果不其然,這裏便出現了對象庫:在工具區域打開對象庫,位於編輯區的右側,分爲上下兩部分,檢視面板與庫面板,前者負責顯示編輯區域當前選擇文件的各類設置;後者即是可拖拽的工具了:
由於咱們創建的是sigile page application,因此上述文件不須要咱們建立,系統自動爲咱們建立好了Main.storyboard,咱們之間在這之上開發就行
我一次性拖了3個組件上去,視圖效果有所不一樣了,能夠經過檢視面板調整屬性,雙擊按鈕能夠編輯一些title,並能夠設置居中等操做,這些須要咱們慢慢熟悉
這個時候能夠看到起代碼(相似與html的代碼)也發生了改變,我我的暫時沒有意願去讀取,也但願之後都不須要去讀取......
全部的xib文件都會被編譯成nib文件,其體積更小,更容易解析,而後Xcode會將nib拷貝至程序包,包含可運行的全部資源,這個不是咱們現在關注的重點
在瞭解如何設置關聯前,咱們來看看代碼組織,咱們知道OC的入口函數爲main函數,這裏的main函數是:
1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int main(int argc, char * argv[]) { 5 @autoreleasepool { 6 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 7 } 8 }
這裏製造了一個內部消息循環,我猜想這裏開了一個監聽進程,不停的監聽view的變化,應該有一個頻率,可是這與咱們沒有一毛錢關係
這裏調用了4個參數,開始兩個是main函數自帶的參數。
第三個參數爲一個UIApplication(或子類)字符串,爲nil便默認爲UIApplication,這個參數幹什麼的也暫時不知道
最後一個參數爲UIApplication的代理字符串,默認生成AppDelegate類,用於監聽整個應用程序週期的各個事件,當某個系統事件觸發便會執行其代理中對應方法
雖然不知道這一段代碼真實作了什麼事情,但可猜想是這裏會根據參數3建立UIApplication對象,而後根據第一個參數建立並指定UIApplication的代理,而後UIApplication便開啓消息循環直到進程被殺死,因此詳細表明在AppDelegate中:
1 #import <UIKit/UIKit.h> 2 3 @interface AppDelegate : UIResponder <UIApplicationDelegate> 4 5 @property (strong, nonatomic) UIWindow *window; 6 7 8 @end
1 #import "AppDelegate.h" 2 3 @interface AppDelegate () 4 5 @end 6 7 @implementation AppDelegate 8 9 10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 11 // Override point for customization after application launch. 12 return YES; 13 } 14 15 - (void)applicationWillResignActive:(UIApplication *)application { 16 // 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. 17 // 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. 18 } 19 20 - (void)applicationDidEnterBackground:(UIApplication *)application { 21 // 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. 22 // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 23 } 24 25 - (void)applicationWillEnterForeground:(UIApplication *)application { 26 // 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. 27 } 28 29 - (void)applicationDidBecomeActive:(UIApplication *)application { 30 // 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. 31 } 32 33 - (void)applicationWillTerminate:(UIApplication *)application { 34 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 35 } 36 37 @end
這個類中定義了應用程序生命週期中各個事件的執行方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
程序啓動以後執行,只有在第一次程序啓動後才執行,之後再也不執行;
- (void)applicationWillResignActive:(UIApplication *)application;
程序將要被激活時(得到焦點)執行,程序激活用戶才能操做;
- (void)applicationDidEnterBackground:(UIApplication *)application;
程序進入後臺後執行,注意進入後臺時會先失去焦點再進入後臺;
- (void)applicationWillEnterForeground:(UIApplication *)application;
程序將要進入前臺時執行;
- (void)applicationDidBecomeActive:(UIApplication *)application;
程序被激活(得到焦點)後執行,注意程序被激活時會先進入前臺再被激活;
- (void)applicationWillTerminate:(UIApplication *)application;
程序在終止時執行,包括正常終止或異常終止,例如說一個應用程序在後太運行(例如音樂播放軟件、社交軟件等)佔用太多內存這時會意外終止調用此方法;
這個有點相似與.net application的事件管道,在一條程序生命週期內,當達到某一個特定的時期便會執行相關函數,這裏咱們不去深刻了解,事實上與咱們當前需求意義不大
下面是其文件具體含義:
AppDelegate(.h/.m):應用程序代理,主要用於監聽整個應用程序生命週期中各個階段的事件;
ViewController(.h/.m):視圖控制器,主要負責管理UIView的生命週期、負責UIView之間的切換、對UIView事件進行監聽等;
Main.storyboard:界面佈局文件,承載對應UIView的視圖控件;
Images.xcassets:應用程序圖像資源文件;
Info.plist:應用程序配置文件;
main.m:應用程序入口函數文件;
xxx-prefix.pch:項目公共頭文件,此文件中的導入語句在編譯時會應用到全部的類文件中,至關於公共引入文件(注意在Xcode6中沒有提供此文件)
以上有3個UI對象,可是是沒有交互的,interface builder能夠建立兩種關聯:
① 插座變量
一種指向對象的指針
② 動做變量
一種方法,好比點擊、拖拽等事件
根據以前的經驗,插座變量應該即是id相關映射,動做變量即是事件回調
咱們知道關聯相關的代碼確定在控制器中,這個時候便須要對控制器文件進行操做,咱們首先在頭文件中建立3個對象,兩個插座對象,一個事件對象:
1 #import <UIKit/UIKit.h> 2 3 @interface ViewController : UIViewController 4 5 //屬性簡單建立的語法糖,後續須要詳細瞭解其用法 6 @property (nonatomic, strong) IBOutlet UILabel *msg; 7 8 @property (nonatomic, strong) IBOutlet UITextField *txt; 9 10 //點擊按鈕後的事件回調 11 -(IBAction)myClick:(UIButton *)btn; 12 13 @end
IBOutlet 沒有實際意義,他會告訴interface builder這個屬性會被關聯到某個控件,代碼前面也確實出現了小圓點:
所謂的關聯即是在畫板中將對應的控件拖向小圓點,這裏OC又一次沒有讓咱們失望,依舊那麼噁心,當我得知我要拖動時,我感受整個智商又下降了!步驟爲:
點擊右上方的show the assistant editor,打開控制器文件與視圖文件開始拖拽吧!!!
這裏只說明拖動,可關聯,不要關注實際代碼。下面看看改動controller代碼會如何,這裏增長按鈕點擊時的實現:
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 // Do any additional setup after loading the view, typically from a nib. 12 } 13 14 - (void)didReceiveMemoryWarning { 15 [super didReceiveMemoryWarning]; 16 // Dispose of any resources that can be recreated. 17 } 18 19 //讓label顯示文本框的文字 20 -(void) myClick:(UIButton *)btn{ 21 _msg.text = _txt.text; 22 } 23 24 @end
其中UI組件的具體使用咱們暫時不予關注,再後面的章節中再好好鞏固基礎,或者後續項目中好好總結......
說是使用面部作簡單界面設計是能夠的,也是同意的,可是要使用拖拽的方式關聯控件和事件仍是算了吧,詳細.net的雙擊按鈕生成事件真心優雅多了,固然OC也是能夠純代碼作這些事情的,這個留待咱們下次處理,不然今天的學習任務便結束不了了。
這裏先回答學生管理系統自己學生類與課程類以前已經建立結束,這裏咱們看界面應該如何開發其界面,因爲時間關係,也不去使用什麼單選框,直接所有上文本框吧,尼瑪過久沒寫博客發現竟然會有點累!!!
這裏首先創建了這樣的視圖,而且按照以前拖拽的方式創建了管理,其中按鈕只有事件關聯
這裏簡單測試,效果仍是可行的:
1 //這裏實例化一個Student對象試試 2 //這裏若是數字輸入錯誤會致使解析出問題,可能會報錯,不知道OC生產項目應該如何處理 3 Student *student = [[Student alloc] 4 initWithName:_stuName.text 5 andAge:[_stuAge.text intValue] 6 andSex:_stuSex.text 7 andChinese:[[Course alloc] initWithName:@"語文" andScore:[_stuChinese.text floatValue]] 8 andMath:[[Course alloc] initWithName:@"數學" andScore:[_stuMath.text floatValue]]]; 9 10 [student showData];
2015-08-09 20:01:10.273 student_app[7140:619984] 姓名:11 2015-08-09 20:01:10.274 student_app[7140:619984] 性別:男 2015-08-09 20:01:10.275 student_app[7140:619984] 年齡:22 2015-08-09 20:01:10.275 student_app[7140:619984] 課程名:語文 2015-08-09 20:01:10.276 student_app[7140:619984] 課程得分:33.0 2015-08-09 20:01:10.276 student_app[7140:619984] 課程名:數學 2015-08-09 20:01:10.276 student_app[7140:619984] 課程得分:44.0 2015-08-09 20:01:10.277 student_app[7140:619984] 考試總分:77.0 2015-08-09 20:01:10.277 student_app[7140:619984] -------------
因而咱們回到最初的作法,每次錄入皆將數據放進一個數組中,因爲這個數組是固定的,這裏將之做爲控制器的一個屬性,生產是怎麼樣的咱們後面看看,因而在控制器上創建students的成員屬性。
每次添加到數組中,而後將數組中的數組展現出來便可,這裏展現數據得使用一個很是常見的列表組件:UITableView
UITableView是OC中常用的組件,主要用於顯示列表,這個組件比較複雜真的要研究恐怕得研究1,2天,咱們這邊就直接看其如何使用便可,這裏的目標即是將錄入的數據顯示在界面上,咱們今天的任務便完成。
這裏在控制器頭文件中新增一個UITableView組件,而後嘗試綁定便可,通過漫長的研究,最終成果是:
雖然有點醜,可是基本符合預期,而編輯等功能就等下次再完成了,今天沒有精力了,一下是一些代碼:
1 #import <Foundation/Foundation.h> 2 3 @interface Course : NSObject 4 { 5 NSString *_name; 6 float _score; 7 } 8 9 -(instancetype)initWithName:(NSString *)newName andScore:(float)newScore; 10 11 -(void)setName: (NSString *)str; 12 -(NSString *)name; 13 14 -(void)setScore: (float)fl; 15 -(float)score; 16 17 -(void)showData; 18 19 @end 20 21 #import "Course.h" 22 23 @implementation Course 24 25 //自定義構造方法 26 -(instancetype)initWithName:(NSString *)newName andScore:(float)newScore 27 { 28 self = [super init]; 29 if (self) { 30 _name = newName; 31 _score = newScore; 32 } 33 return self; 34 } 35 36 -(void) setName:(NSString *)str 37 { 38 _name = str; 39 } 40 41 -(NSString *) name 42 { 43 return _name; 44 } 45 46 -(void) setScore:(float)fl 47 { 48 _score = fl; 49 } 50 51 -(float) score 52 { 53 return _score; 54 } 55 56 -(void) showData 57 { 58 NSLog(@"課程名:%@", _name); 59 NSLog(@"課程得分:%.1f",_score); 60 } 61 62 @end 63 64 #import <Foundation/Foundation.h> 65 #import "Course.h" 66 67 @interface Student : NSObject 68 { 69 NSString *_name; 70 int _age; 71 NSString *_sex; 72 Course *_chinese; 73 Course *_math; 74 //錄入時間 75 NSDate *_dateCreate; 76 } 77 78 -(instancetype)initWithName:(NSString *)newName andAge:(int)newAge andSex:(NSString *)newSex andChinese:(Course *) newChinese andMath:(Course *) newMath; 79 80 -(void)setName: (NSString *)str; 81 -(NSString *)name; 82 83 -(void)setAge: (int)a; 84 -(int)age; 85 86 -(void)setSex: (NSString *)str; 87 -(NSString *)sex; 88 89 -(void)setChinese: (Course *)c; 90 -(Course *)chinese; 91 92 -(void)setMath: (Course *)c; 93 -(Course *)math; 94 95 //只暴露讀取接口 96 -(NSDate *)dateCreate; 97 98 -(void) showData; 99 -(NSString *) getData; 100 101 @end 102 103 #import "Student.h" 104 105 @implementation Student 106 107 -(instancetype)initWithName:(NSString *)newName andAge:(int)newAge andSex:(NSString *)newSex andChinese:(Course *) newChinese andMath:(Course *) newMath 108 { 109 self = [super init]; 110 if (self) { 111 _name = newName; 112 _age = newAge; 113 _sex = newSex; 114 _chinese = newChinese; 115 _math = newMath; 116 _dateCreate = [[NSDate alloc] init]; 117 } 118 return self; 119 } 120 121 -(void) setName:(NSString *)str 122 { 123 _name = str; 124 } 125 126 -(NSString *) name 127 { 128 return _name; 129 } 130 131 -(void)setAge: (int)a 132 { 133 _age = a; 134 } 135 136 -(int)age 137 { 138 return _age; 139 } 140 141 -(void)setSex: (NSString *)str 142 { 143 _sex = str; 144 } 145 146 -(NSString *)sex 147 { 148 return _sex; 149 } 150 151 -(void)setChinese: (Course *)c 152 { 153 _chinese = c; 154 } 155 156 -(Course *)chinese 157 { 158 return _chinese; 159 } 160 161 -(void)setMath: (Course *)c 162 { 163 _math = c; 164 } 165 166 -(Course *)math 167 { 168 return _math; 169 } 170 171 //只暴露讀取接口 172 -(NSDate *)dateCreate 173 { 174 return _dateCreate; 175 } 176 177 -(void) showData 178 { 179 NSLog(@"姓名:%@", _name); 180 NSLog(@"性別:%@", _sex); 181 NSLog(@"年齡:%d", _age); 182 //NSLog(@"入學時間:%@", _dateCreate); 183 [_chinese showData]; 184 [_math showData]; 185 NSLog(@"考試總分:%.1f", _chinese.score + _math.score); 186 NSLog(@"-------------\n"); 187 } 188 189 -(NSString *) getData 190 { 191 return [[_name stringByAppendingString:@"總分 "] 192 stringByAppendingString: [NSString stringWithFormat:@"%.1f",_chinese.score + _math.score]]; 193 } 194 195 @end 196 197 #import <UIKit/UIKit.h> 198 #import "Student.h" 199 200 //這裏須要實現一個協議,就是咱們說的接口,緣由後續再研究 201 //delegate是爲了數據更新時刷新視圖 202 @interface ViewController : UIViewController<UITableViewDataSource, UITableViewDelegate> 203 204 //存儲學生的集合 205 @property (nonatomic, strong) NSMutableArray *students; 206 207 //屬性簡單建立的語法糖,後續須要詳細瞭解其用法 208 @property (nonatomic, strong) IBOutlet UITextField *stuName; 209 210 @property (nonatomic, strong) IBOutlet UITextField *stuSex; 211 212 @property (nonatomic, strong) IBOutlet UITextField *stuAge; 213 214 @property (nonatomic, strong) IBOutlet UITextField *stuChinese; 215 216 @property (nonatomic, strong) IBOutlet UITextField *stuMath; 217 218 @property (nonatomic, strong) IBOutlet UITableView *stuList; 219 220 221 //點擊按鈕後的事件回調 222 -(IBAction)onAdd:(UIButton *)btn; 223 224 //點擊按鈕後的事件回調 225 -(IBAction)onRead:(UIButton *)btn; 226 227 @end 228 229 #import "ViewController.h" 230 #import "Course.h" 231 #import "Student.h" 232 233 @interface ViewController () 234 @end 235 236 @implementation ViewController 237 238 ////重寫初始化方法,控制器對象建立結束後會執行 239 // 240 //-(id) initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil{ 241 // 242 // self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 243 // 244 // if(self) { 245 // self.students= [NSMutableArray alloc]; 246 // } 247 // 248 // return self; 249 //} 250 251 - (void)viewDidLoad { 252 [super viewDidLoad]; 253 254 //在頁面準備前對數組進行初始化 255 _students = [[NSMutableArray alloc] init]; 256 257 // _students = [NSMutableArray arrayWithObjects:@"武漢",@"上海",@"北京",@"深圳",@"廣州",@"重慶",@"香港",@"臺海",@"天津", nil]; 258 // 259 _stuList = [[UITableView alloc] initWithFrame:CGRectMake(0, 250, 520, 420)]; 260 261 //設置數據源,注意必須實現對應的UITableViewDataSource協議 262 _stuList.dataSource = self; 263 264 //動態添加 265 [self.view addSubview:_stuList]; 266 267 } 268 269 - (void)didReceiveMemoryWarning { 270 [super didReceiveMemoryWarning]; 271 } 272 273 -(void) onAdd:(UIButton *)btn{ 274 //這裏實例化一個Student對象試試 275 //這裏若是數字輸入錯誤會致使解析出問題,可能會報錯,不知道OC生產項目應該如何處理 276 Student *student = [[Student alloc] 277 initWithName:_stuName.text 278 andAge:[_stuAge.text intValue] 279 andSex:_stuSex.text 280 andChinese:[[Course alloc] initWithName:@"語文" andScore:[_stuChinese.text floatValue]] 281 andMath:[[Course alloc] initWithName:@"數學" andScore:[_stuMath.text floatValue]]]; 282 283 //這裏每次點擊,皆將結果存於全局數組中 284 [_students addObject:student]; 285 286 //每次數據更新便將對應數據顯示在UITableView中 287 [_stuList performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 288 289 } 290 291 -(void) onRead:(UIButton *)btn{ 292 for(id item in _students){ 293 [item showData]; 294 } 295 } 296 297 //必須實現 298 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 299 { 300 static NSString *CellWithIdentifier = @"Cell"; 301 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier]; 302 if (cell == nil) { 303 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellWithIdentifier]; 304 } 305 NSUInteger row = [indexPath row]; 306 cell.textLabel.text = [[_students objectAtIndex:row] getData]; 307 308 return cell; 309 } 310 311 //每一個section下cell的個數(必須實現) 312 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 313 return _students.count; 314 } 315 316 @end
核心代碼爲:
1 #import "ViewController.h" 2 #import "Course.h" 3 #import "Student.h" 4 5 @interface ViewController () 6 @end 7 8 @implementation ViewController 9 10 ////重寫初始化方法,控制器對象建立結束後會執行 11 // 12 //-(id) initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil{ 13 // 14 // self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 15 // 16 // if(self) { 17 // self.students= [NSMutableArray alloc]; 18 // } 19 // 20 // return self; 21 //} 22 23 - (void)viewDidLoad { 24 [super viewDidLoad]; 25 26 //在頁面準備前對數組進行初始化 27 _students = [[NSMutableArray alloc] init]; 28 29 // _students = [NSMutableArray arrayWithObjects:@"武漢",@"上海",@"北京",@"深圳",@"廣州",@"重慶",@"香港",@"臺海",@"天津", nil]; 30 // 31 _stuList = [[UITableView alloc] initWithFrame:CGRectMake(0, 250, 520, 420)]; 32 33 //設置數據源,注意必須實現對應的UITableViewDataSource協議 34 _stuList.dataSource = self; 35 36 //動態添加 37 [self.view addSubview:_stuList]; 38 39 } 40 41 - (void)didReceiveMemoryWarning { 42 [super didReceiveMemoryWarning]; 43 } 44 45 -(void) onAdd:(UIButton *)btn{ 46 //這裏實例化一個Student對象試試 47 //這裏若是數字輸入錯誤會致使解析出問題,可能會報錯,不知道OC生產項目應該如何處理 48 Student *student = [[Student alloc] 49 initWithName:_stuName.text 50 andAge:[_stuAge.text intValue] 51 andSex:_stuSex.text 52 andChinese:[[Course alloc] initWithName:@"語文" andScore:[_stuChinese.text floatValue]] 53 andMath:[[Course alloc] initWithName:@"數學" andScore:[_stuMath.text floatValue]]]; 54 55 //這裏每次點擊,皆將結果存於全局數組中 56 [_students addObject:student]; 57 58 //每次數據更新便將對應數據顯示在UITableView中 59 [_stuList performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 60 61 } 62 63 -(void) onRead:(UIButton *)btn{ 64 for(id item in _students){ 65 [item showData]; 66 } 67 } 68 69 //必須實現 70 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 71 { 72 static NSString *CellWithIdentifier = @"Cell"; 73 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier]; 74 if (cell == nil) { 75 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellWithIdentifier]; 76 } 77 NSUInteger row = [indexPath row]; 78 cell.textLabel.text = [[_students objectAtIndex:row] getData]; 79 80 return cell; 81 } 82 83 //每一個section下cell的個數(必須實現) 84 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 85 return _students.count; 86 } 87 88 @end
1 #import "ViewController.h" 2 #import "Course.h" 3 #import "Student.h" 4 5 @interface ViewController () 6 @end 7 8 @implementation ViewController 9 10 ////重寫初始化方法,控制器對象建立結束後會執行 11 // 12 //-(id) initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil{ 13 // 14 // self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 15 // 16 // if(self) { 17 // self.students= [NSMutableArray alloc]; 18 // } 19 // 20 // return self; 21 //} 22 23 - (void)viewDidLoad { 24 [super viewDidLoad]; 25 26 //在頁面準備前對數組進行初始化 27 _students = [[NSMutableArray alloc] init]; 28 29 // _students = [NSMutableArray arrayWithObjects:@"武漢",@"上海",@"北京",@"深圳",@"廣州",@"重慶",@"香港",@"臺海",@"天津", nil]; 30 // 31 _stuList = [[UITableView alloc] initWithFrame:CGRectMake(0, 250, 520, 420)]; 32 33 //設置數據源,注意必須實現對應的UITableViewDataSource協議 34 _stuList.dataSource = self; 35 36 //動態添加 37 [self.view addSubview:_stuList]; 38 39 } 40 41 - (void)didReceiveMemoryWarning { 42 [super didReceiveMemoryWarning]; 43 } 44 45 -(void) onAdd:(UIButton *)btn{ 46 //這裏實例化一個Student對象試試 47 //這裏若是數字輸入錯誤會致使解析出問題,可能會報錯,不知道OC生產項目應該如何處理 48 Student *student = [[Student alloc] 49 initWithName:_stuName.text 50 andAge:[_stuAge.text intValue] 51 andSex:_stuSex.text 52 andChinese:[[Course alloc] initWithName:@"語文" andScore:[_stuChinese.text floatValue]] 53 andMath:[[Course alloc] initWithName:@"數學" andScore:[_stuMath.text floatValue]]]; 54 55 //這裏每次點擊,皆將結果存於全局數組中 56 [_students addObject:student]; 57 58 //每次數據更新便將對應數據顯示在UITableView中 59 [_stuList performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 60 61 } 62 63 -(void) onRead:(UIButton *)btn{ 64 for(id item in _students){ 65 [item showData]; 66 } 67 } 68 69 //必須實現 70 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 71 { 72 static NSString *CellWithIdentifier = @"Cell"; 73 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellWithIdentifier]; 74 if (cell == nil) { 75 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:CellWithIdentifier]; 76 } 77 NSUInteger row = [indexPath row]; 78 cell.textLabel.text = [[_students objectAtIndex:row] getData]; 79 80 return cell; 81 } 82 83 //每一個section下cell的個數(必須實現) 84 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 85 return _students.count; 86 } 87 88 @end
幾天來,咱們在沒有OC的基礎下搞上面那個東西出來,一路磕磕碰碰,算是有了一個開始,接下來的章節,我準備鞏固下基礎知識,再下週的時候考慮作一點更加實際的東西
由於我也是初學,文中確定有不少不足,各位就不要噴了