【IOS開發筆記02】學生管理系統

端到端的機會

雖然如今身處大公司,可是由於是內部創業團隊,產品、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中的類

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這裏提供了語法糖,咱們暫不使用,老老實實的寫代碼,下面爲兩個類的具體實現:

Student-Course

構造函數

構造函數是每一個類實例化的入口點,每個繼承至NSObject的對象都會有一個init的實例方法,這個即是其構造函數,咱們這裏自定義構造函數,Course與Student的構造函數

View Code
 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

View Code
 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中的數組

OC的數組

數組屬於集合你們族中的一類,簡單來講有數組和字典,NSArray NSDictionary

NSArray

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 }

這裏排序後面會有更多的應用

NSMutableArray 可變數組

與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
View Code

完整的代碼:

  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 }
View Code

APP開發簡介

控制檯輸出部分完成後,咱們的功能也就實現了一半,如今要作的是,如何將上述功能寫到app中,意思是咱們如今就要開始作app開發了,由於我沒有開發者帳號,只能在mac上模擬。

既然是app就應該有更加完善的功能了,這裏給本身的需求是:

1 有界面錄入學生信息

2 有列表可展現學生信息

3 學生信息可排序

4 可編輯、刪除學生

需求很少,多了可能就作不完,因而咱們便愉快的開始吧,此次新建項目會有所不一樣:選擇的是最簡單的single View application

這裏取個名字student_app,完了就會在模擬器中新增一個app,瞬間以爲好牛B的樣子:

而後,項目中的文件以及界面讓我感受到了陌生,這裏也不一一去了解了,直接朝着需求方向進發吧。

PS:學習過程當中最初會有意的忽略一些基礎知識,可是這些知識是咱們後面能走多遠的基礎,因此在快速熟悉後須要一個過渡期從新回來整理基礎,不然走不遠的

OC的MVC

模型-視圖-控制器,是咱們常常聽到的mvc,爲各類與界面相關的系統都會頻繁使用的一種模式,其意義在於代碼解耦,OC APP開發遵循這一規則

視圖簡單來講即是界面,好比咱們後面要作的展現學生相關信息的界面

模型即是界面的數據來源

而控制器即是管理者,用於控制視圖與模型之間的交互,好比新增刪除什麼的

因而,咱們便開始瞭解OC中MVC是如何使用的吧,也許學事後會幫助咱們更加了解web中的MVC,偶爾我仍然以爲本身瞭解的不夠深入

在此以前,咱們先來了解幾個ios開發的基本組件,不然將使咱們的開發沒法繼續。

UI相關視圖

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>
View Code

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
View Code

核心代碼爲:

 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的基礎下搞上面那個東西出來,一路磕磕碰碰,算是有了一個開始,接下來的章節,我準備鞏固下基礎知識,再下週的時候考慮作一點更加實際的東西

由於我也是初學,文中確定有不少不足,各位就不要噴了

相關文章
相關標籤/搜索