UIViewController---彙總

 1 UIWindow、UILabel、UIColor、UIScreen、UIViewController、UIView、UIControl、UIButton、IBOutlet、IBAction、UIStepper、 UISlider、 UISwitch、UITextField、UIAlertView、UIActionSheet、UINavigationController、UIBarButtonItem、UIImageView、UIScrollView、UIPageContro、UITableView、UITableViewController、UITableViewCell、UITabBarController、NSTimer、UICollectionViewController、UISegmentedControl  2 =======================================================================
 3 在類內的init…方法中、get、set方法中,用_xxx實例變量。其餘地方的訪問都用self.屬性  4 內存管理修飾:  5  copy:NSString,block  6  copy:將對象的拷貝賦給引用,拷貝完的是不可變的。  7  爲何用copy?  8  NSString類型的特色就是內容不可變的,可是給NSString賦值時,能夠將NSMutableString賦過來,可能就會有其餘持有MutableString的引用修改了這個字符串,結果你再用NSString訪問字符串時就會發現,原本不可變的字符串在不知情的狀況下被改變了。因此爲了不這種狀況,就是用copy將內容複製成不可變以後再給NSString  9 
 10  使用copy會更安全,但內存會被佔用,通常狀況下用strong不影響程序運行  11 
 12  strong:除NSString之外的引用類型  13         徹底的擁有對象,引用計數器+1
 14     
 15  assign:基本數據類型、結構體、枚舉  16 ==========================================================================
 17 1、調試  18 
 19 
 20 0.警告  21  儘可能一個警告都不要有  22 
 23 1.錯誤  24         1)紅色提示  25  編譯過不去的緣由大部分是語法,檢查括號的匹配,變量名稱,做用域範圍  26 
 27         2)編譯能夠經過,能夠運行  28  a。運行過程當中程序崩潰  29  在debug區域的右側,觀察提示信息,信息的最上面會說明出錯的類及方法的位置,而後找「reason」單詞,看後面的提示  30 
 31  b。運行過程當中沒有問題,可是結果與期待不符  32 
 33 2.問題的解決方法  34             
 35     2.1 核心理念:掌控每一步中變量的變化  36         
 37  使用debug工具,下斷點,逐行跟蹤程序的運行,查看每一行代碼運行時,各個變量內存放的數據是否與期待存儲的數據相一致,若是某一行代碼執行後,發現變量中存儲的值與期待不符,那麼基本上緣由就找到了,而後根據變量的整個賦值、運算過程再來分析爲何數據不符,解決了無數據或數據有誤的狀況後,程序基本就正常運行了。  38 
 39     2.2 下斷點位置的選擇  40  變量被改變以前的位置以及變量被改變以後的位置  41 
 42     
 43 3工具的使用  44         3.1 遇到斷點停下來後,debug區域的三角按鈕,點擊後,程序繼續自動 運行;若是後續運行中遇到了下一個斷點,則停下來;若是後續運行中沒有斷點了,那麼程序自動運行完才停下來  45         3.2 step over:將一個方法總體做爲執行的一步,一次性執行完,但,若是方法中有斷點,則會進斷點。進入斷點後,能夠經過點擊三角號或step out均可以回到進入方法前的那個位置  46         3.3 step into:能夠進入方法的內部,繼續逐行跟蹤代碼的執行過程  47         3.4 step out:在方法內部中調試時,若是不想再繼續跟蹤,能夠經過點擊此按鈕,快速回到進入該方法的那個位置  48         3.5 調試過程當中,若是想快速略過一段循環的話,能夠在循環的後面添加斷點,而後點擊三角號,就會再也不跟蹤循環的過程,而快速執行到下一個斷點的位置  49 =============================================================================
 50 User Interface UIKit  51 知識點  52 1、UIWindow  53 今天的目標:  54 寫出第一個iOS的程序,在界面上顯示「Hello World」  55 
 56 1.如何新建一個工程  57     iOS—>Single View Application—>工程名、保存位置  58 
 59 2.運行App  60  點擊三角符號或使用快捷鍵(Command + R)  61  快捷鍵:Command+B 只是編譯,不是運行  62 
 63 3.工程的文件組成  64 
 65 4.應用程序是如何運行起來的?  66     1)main方法  67                 int main(int argc, char * argv[])  68  {  69  @autoreleasepool {  70                 return UIApplicationMain(argc, argv, nil,                 NSStringFromClass([AppDelegate class]));  71  }  72  }  73  UIApplicationMain()全局函數,一共作了三件事:  74  a)根據第三個參數建立應用程序類的實例(nil默認UIApplication 系統默認)  75  b)根據第四個參數建立應用程序代理類的實例  76  (Application Delegate代理 本身任意建立的類,遵照了協議才能夠成爲代理類)  77  c)啓動事件循環  78  d)在代理類的didFinishLaunchingWithOptions:方法中編寫啓動程序後的界面建立及顯示  79 
 80 
 81 5.UIWindow  82           1)是什麼  83  是界面顯示的根本對象,要想出現顯示的內容,那麼必定是先建立window的實例  84           2)做用是什麼?  85  是界面要顯示的內容的父容器,在window的上面添加其餘顯示的內容  86 
 87 6.frame  88         1)是什麼  89  是CGRect類型的結構體  90         2)描述了控件在父容器中的位置和大小  91  CGRect{  92  CGPoint origin,  93  CGSize size  94  }  95  CGPoint{  96  CGFloat x,  97  CGFloat y  98  }  99  CGSize{  100  CGFloat width,  101  CGFloat height  102  }  103   3)如何建立結構體的變量?  104  使用全局函數 xxxMake();  105         CGRect  —> CGRectMake(x,y,width,height)  106         CGPoint -> CGPointMake(x,y);  107         CGSize  -> CGSizeMake(width,height);  108 
 109 例:  110 AppDelegate.m  111 #import "AppDelegate.h"
 112 
 113 @implementation AppDelegate  114 
 115 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  116 {  117     //應用程序啓動後,第一個要執行動做的時機點,能夠作第一個要出現的界面的設置  118 
 119     //1.建立window的實例
 120     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];//讀屏幕的大小  121    //2.設置window的背景色
 122     self.window.backgroundColor = [UIColor whiteColor];  123     
 124     //3.建立並添加顯示文本信息的標籤
 125      UILabel *label = [[UILabel alloc]init];  126     label.frame = CGRectMake(100, 150, 200, 40);  127     label.text = @"Hello World";  128     [self.window addSubview:label];//子試圖添加到界面  129     
 130     //4.設置窗口可見(顯示)
 131  [self.window makeKeyAndVisible];  132     return YES;  133 }  134 =================================================================================================
 135 知識點  136 2、應用程序設計理念:視圖控制器(UIViewController)、視圖(UIView)  137       *利用視圖控制器(底層)管理視圖(外觀),一對一  138      1.視圖的做用:負責顯示的外觀  139      2.視圖控制器的做用:建立界面、管理視圖的生命週期  140      3.UIViewController的UIView關係:系統的UIViewController中天生自帶一個視圖,UIView經過self.view屬性來訪問控制器自帶的這個視圖  141      4.viewDidLoad方法:建立視圖時會自動調用,並且只被調用一次,有關視圖的初始化工做都會放在這個方法中  142     5.使用VC的步驟:  143  step1:編寫一個類,繼承自UIViewController  144  step2:重寫類中的viewDidLoad方法,建立界面內容  145  step3:在didFinishLaunching方法中,建立window的實例,建立vc的實例,將vc設置爲window的rootViewController(根vc),顯示window  146            
 147 1.建立控制器  148 AppDelegate.m  149 #import "AppDelegate.h"
 150 #import "MyViewController.h"
 151 
 152 @implementation AppDelegate  153 
 154 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  155 {  156     self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];  157     self.window.backgroundColor=[UIColor greenColor];  158     //1.建立控制器的實例 myVC自帶一個視圖
 159     MyViewController* myVC=[[MyViewController alloc]init];  160     //2.將控制器設置爲window的根視圖控制器
 161     self.window.rootViewController=myVC;  162  [self.window makeKeyAndVisible];  163     return YES;  164 }  165 2.視圖控制器viewDidLoad方法  166      1).控制器擁有對其自帶的視圖的生命週期(建立--->銷燬)管理權  167   2).在視圖的生命週期的第一個階段就是執行viewDidLoad方法  168   3).做用:用於建立視圖,如:初始化界面、建立界面的顯示元素  169   4).特色:在整個生命週期中,只會被執行一次  170 例:  171 MyViewController.m  172 (本身建立的類,繼承了UIViewController父類方法,並重寫了viewDidLoad方法)  173 #import "MyViewController.h"
 174 
 175 @interface MyViewController ()  176 @end
 177 
 178 @implementation MyViewController  179 
 180 //控制器擁有對其自帶的視圖的生命週期(建立--->銷燬)管理權  181 //在視圖的生命週期的第一個階段就是執行viewDidLoad方法  182 //做用:用於建立視圖,如:初始化界面、建立界面的顯示元素  183 //特色:在整個生命週期中,只會被執行一次
 184 - (void)viewDidLoad  185 {  186  [super viewDidLoad];  187     //設計view
 188     UILabel* label=[[UILabel alloc]init];  189     label.frame=CGRectMake(110, 200, 100, 40);  190     label.text=@"HelloWlord";  191     //添加到控制器自帶的那個視圖裏面
 192  [self.view addSubview:label];  193 }  194 @end
 195 ==========================================================================================================================
 196 知識點  197 3、視圖(UIView)與控件(UIControl)  198 1.UIView類  199    1.什麼是視圖  200  看得見的都是視圖  201    2.什麼是控件  202  一種特殊的視圖,都是UIControl的子類,不只具備必定的顯示外觀,還能響應高級事件,與用戶交互。嚴格意義上UILabel不是控件,由於label不能響應用戶交互事件。  203   3 術語的理解:  204  視圖:一個大一點的顯示區域,裏面能夠容納控件,作容器講  205  控件:容器中包含的子元素  206 2.UILabel標籤  207  1. 是什麼?  208  靜態文本內容的展現控件  209  2.label屬性  210     1)text:顯示文本的內容  211     2)font:顯示文本的字體  212     3)numberOfLines:默認爲1,顯示的最大行數,0表示無上限  213     4) lineBreakMode:換行模式, 省略頭或尾  214           NSLineBreakByTruncatingHead,    /* Truncate at head of line: "...wxyz" */
 215           NSLineBreakByTruncatingTail,    /* Truncate at tail of line: "abcd..." */
 216           NSLineBreakByTruncatingMiddle    /* Truncate middle of line: "ab...yz"  217  5)adjustsFontSizeToWidth:是否調整字體大小適應控件寬度 yes;  218  6) textColor:設置文本的顏色  219     
 220 例:  221 MyViewController.m  222 - (void)viewDidLoad  223 {  224  [super viewDidLoad];  225  //設計view  226  UILabel* label=[[UILabel alloc]init];  227  label.frame=CGRectMake(110, 200, 100, 60);  228  //設置字體顏色  229  label.textColor=[UIColor whiteColor];  230  //設置最大顯示行數  231  label.numberOfLines=2;  232  //設置標籤內容的字體  233  label.font=[UIFont systemFontOfSize:20];  234  //設置換行模式  235  label.lineBreakMode=NSLineBreakByTruncatingHead;  236  //調整字體大小  237  //label.adjustsFontSizeToFitWidth=YES;  238  label.text=@"HelloWlord HelloWlord HelloWlord";  239  //添加到控制器自帶的那個視圖裏面  240  [self.view addSubview:label];  241     
 242 }  243 3.UIButton按鈕  244  1.什麼是按鈕?  245  能夠與用戶交互,可以點擊的一種控件  246  2.建立方式  247  工廠方法建立,使用系統模式  248  3.經常使用屬性  249  1)frame :按鈕大小  250  2)backgroundColor:按鈕背景色  251  3)setBackgroundImage:按鈕背景圖  252  1.點擊images.xcassets文件,將要添加的圖片拖拉進文本框,左邊框修改圖片名字  253  2.點擊下方Show Slicing按鈕  254  3.在下方進行縮小放大操做  255  4.點擊圖片中Start Slicing按鈕進行裁剪,再點擊中間按鈕  256  5.九切片:橫3線:1線範圍不變,1-2線之間複製,2-3線裁剪省掉,3線不變  257  6.將照片名字添加到程序  258  [button setBackgroundImage:[UIImage imageNamed:@"bg"]forState:UIControlStateNormal];  259  4)tintColor:按鈕字體顏色  260  5) setTitle:點擊按鈕的狀態  261  UIControlStateNormal = 0, 正常按下  262  UIControlStateHighlighted = 1 << 0, 長按狀態  263  UIControlStateDisabled = 1 << 1,  264  UIControlStateSelected = 1 << 2,  265  4.添加事件  266 ***點一次按鈕,執行調用一次方法  267  addTarget:爲按鈕添加響應事件,即點擊按鈕時需實現的功能  268  參數: 1.target:讓當前控制器對象成爲處理響應的對象  269  2.action:處理事件的對象所使用的方法  270  3.events:添加對按鈕的什麼事件的處理  271  [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];  272  例:  273 MyViewController.m  274 #import "MyViewController.h"  275 
 276 @interface MyViewController ()  277 @property(nonatomic,strong)UILabel *label;//設置全局變量  278 
 279 @end  280 
 281 @implementation MyViewController  282 
 283 - (void)viewDidLoad  284 {  285  [super viewDidLoad];  286  //使用工廠方法建立button對象  287  UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];  288  //設置frame屬性  289  button.frame = CGRectMake(100, 200, 100, 40);  290  //設置按鈕上的文字  291  [button setTitle:@"OK" forState:UIControlStateNormal];  292  [button setTitle:@"KO" forState:UIControlStateHighlighted];  293  //設置按鈕的背景色  294  //button.backgroundColor = [UIColor lightGrayColor];  295  //設置按鈕的背景圖  296  [button setBackgroundImage:[UIImage imageNamed:@"bg"] forState:UIControlStateNormal];  297  //設置按鈕的圖片  298  //[button setImage:[UIImage imageNamed:@"wifi"] forState:UIControlStateNormal];  299  //爲按鈕添加響應事件  300  //target:讓當前控制器對象成爲處理響應的對象  301  //action:處理事件的對象所使用的方法  302  //events:添加對按鈕的什麼事件的處理  303  [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];  304  //添加按鈕到視圖中  305  [self.view addSubview:button];  306     
 307  //添加一個UILable  308  UILabel *label = [[UILabel alloc]init];  309  self.label = label;  310  label.frame = CGRectMake(110, 50, 100, 40);  311  label.text = @"Hello World";  312  [self.view addSubview:label];  313 }  314 
 315 //處理事件的對象所使用的方法  316 -(void)click  317 {  318  self.label.text = @"Hello Kitty";  319  //NSLog(@"click.....");  320 }  321 
 322 @end  323 AppDelegate.h  324 @implementation AppDelegate  325 
 326 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  327 {  328  self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];  329  self.window.backgroundColor=[UIColor whiteColor];  330  MyViewController* vc=[[MyViewController alloc]init];  331  self.window.rootViewController=vc;  332  [self.window makeKeyAndVisible];  333     
 334  return YES;  335 }  336 做業:  337 2.作一個小的應用  338  界面中有一個按鈕,每次按下按鈕,界面多一個UILabel  339  要求:  340  1)label之間間隔10個點的距離  341  2)全部label和屏幕左邊距離20個點  342  3)全部label寬280,高20  343  4)每一個Label的內容進行疊加(Hello,HelloWorld,HelloWorldWorld,......)  344 #import "MyViewController.h"  345 
 346 @interface MyViewController ()  347 //@property(nonatomic,strong)UILabel* label;  348 @property(nonatomic,assign)int y;  349 @property(nonatomic,strong)NSMutableString* str;  350 
 351 @end  352 
 353 @implementation MyViewController  354 
 355 - (void)viewDidLoad  356 {  357  [super viewDidLoad];  358  UIButton* button=[UIButton buttonWithType:UIButtonTypeSystem];  359     
 360  button.frame=CGRectMake(130, 40, 60, 20);  361  button.backgroundColor=[UIColor yellowColor];  362  button.tintColor=[UIColor redColor];  363  [button setTitle:@"on" forState:UIControlStateNormal];  364  [button setTitle:@"off" forState:UIControlStateHighlighted];  365     
 366  //響應事件  367  [button addTarget:self action:@selector(show) forControlEvents:UIControlEventTouchUpInside];  368  [self.view addSubview:button];  369  self.y=100;//初始化  370  self.str=[[NSMutableString alloc]initWithString:@"Hello"];//初始化  371 }  372 -(void)show{  373  UILabel* label=[[UILabel alloc]init];  374  label.backgroundColor=[UIColor greenColor];  375  label.text=self.str;  376  label.frame=CGRectMake(20, self.y, 280, 20);  377  label.adjustsFontSizeToFitWidth=YES;  378  label.textColor=[UIColor redColor];  379  [self.view addSubview:label];  380  //只改變當前使用的值,出了範圍就是改變後的值  381  self.y+=30;  382  [self.str appendString:@"Wlord"];  383     
 384 }  385 
 386 @end  387 =======================================================================================================================  388 知識點  389 4、interface Builder(簡稱 IB) 界面構建器  390 
 391 1.interface Builder  392 設置界面  393  1.1 是什麼?  394  一個可視化的界面編輯工具軟件,在xcode4以後整合到了xcode中  395 
 396  1.2 做用?  397  經過可視化的界面設置,可以少寫或不寫代碼而完成界面的設計,從而減小在控制器的viewDidLoad中寫的大量有關建立控件及設置屬性的代碼  398 
 399  1.3 工做原理  400  將界面所需控件的設置保存到xib文件中,在建立控制器實例的時候,系統會根據指定的xib文件來自動建立視圖中的各個控件的實例、設置實例的屬性,將其用於對控制器自帶的視圖的初始化中。因此,在建立控制器實例時,須要使用initWithNibName方法來指定有關視圖的配置須要加載的文件是哪個  401 MyViewController* vc=[[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];//參數1:文件名 參數2:nil一般  402 
 403  1.4 所需文件  404  XxxxYyyy.h  405  XxxxYyyy.m  406  XxxxYyyy.xib (xml interface builder)  407 
 408 2. IBOutlet,IBAction  409  因爲控制器的視圖中所需的控件都由系統根據xib文件自動建立完成,因此view已經對這些控件對象是strong強引用了,可是,此時控制器沒法訪問系統建立的這些控件,因而須要經過特殊的方法來獲取系統建立的這些對象的引用。  410  1.1使用方式  411  1. 若是,是對IB中的對象添加屬性訪問,讓控件成爲一個外界能夠訪問的輸出口,則經過連線的方式,使其成爲控制其的IBOutlet屬性  412 @property (weak, nonatomic) IBOutlet UILabel *infolabel;//經過連線後生成的屬性(Ctrl+鼠標左鍵)  413 
 414  2.若是,是對IB中的對象添加事件的響應,則經過連線的方式,爲控件添加IBAction行爲事件  415 
 416  添加連線的方式:  417  a。打開拆分視圖,左邊爲xib文件,右邊爲xib對應的控制器m文件  418  b。選中控件,按下control  419  c。在控件上按下鼠標左鍵,拖拽到右側的指定位置  420  d。若是是添加輸出口,則拖拽到擴展中  421  @property (weak, nonatomic) IBOutlet UILabel *valueLabel;  422  e。若是是添加action,則拖拽到類的實現中,change方法  423  - (IBAction)changeValue:(UIStepper *)sender {  424    
 425  }  426  1.2 action的參數  427  在爲控件添加事件響應時,能夠添加一個參數,默認爲id類型,表明的是發生事件的源頭是哪一個控件,或者說本次事件的發送者是誰  428  在須要用到這個參數來區分連到同一個方法上的多個控件的時候,能夠在連線時,選擇type參數,設置爲具體的某種控件類型,不須要再在方法內進行類型轉換了。  429 例:  430 三個button控制一個label,而且將button的內容賦給label。只需將三個button都連線到一個方法當中。  431 - (IBAction)click:(UIButton *)sender {  432  self.infolabel.text=[sender titleForState:UIControlStateNormal];  433 }  434 
 435  1.3 使用IB連線時的注意事項  436  若是對IB中的控件連線後,又刪除,那麼此時刪掉的只是代碼中的變量或方法,並無刪掉界面中控件記錄的連線,必定要在xib中,選中控件,右鍵,查看綁定的線有幾條,將不須要的連線刪掉,纔不會出錯。  437 =================================================================================  438 知識點  439 5、基礎控件(UIStepper UISlider UISwitch UITextField )  440 1.UIStepper 步進控件  441 精確掌握  442      
 443  1.重要屬性:  444  .value 初始值  445  .maximumValue 最大值  446  .minimumValue 最小值  447  .stepValue 間隔  448  2.經常使用事件:  449  value Changed事件:當數值改變時觸發  450 
 451 2 .UISlider 滑塊控件  452 快速滑動的方式獲得一個可變數值  453  1.重要屬性:  454  .value  455  2.重要事件:  456  value Changed事件:當數值改變時觸發  457  //顯示滑塊控件的初始值  458  self.sliderLabel.text = [NSString stringWithFormat:@"%.2lf",self.slider.value];  459 例:三個滑塊控件控制一個label的漸變色,紅、綠、藍  460 #import "ColorViewController.h"  461 
 462 @interface ColorViewController ()  463 @property (weak, nonatomic) IBOutlet UISlider *redSlider;  464 @property (weak, nonatomic) IBOutlet UISlider *greenSlider;//鏈接控件生成屬性  465 @property (weak, nonatomic) IBOutlet UISlider *blueSlider;  466 
 467 @property (weak, nonatomic) IBOutlet UILabel *label;  468 
 469 @end  470 
 471 @implementation ColorViewController  472 
 473 
 474 - (void)viewDidLoad  475 {  476  [super viewDidLoad];  477  self.label.backgroundColor = [UIColor colorWithRed:self.redSlider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];  478 }  479 
 480 - (IBAction)changeRedColor:(UISlider *)sender {  481  self.label.backgroundColor = [UIColor colorWithRed:self.redSlider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];//三個控件共用一個方法,賦給label  482 }  483 
 484 @end  485 
 486 3. UISwitch 開關控件  487  1.重要屬性:  488  .on (BOOL) 獲取或設置開關的狀態  489  .enabled(BOOL) 獲取或設置控件是否可用  490  //修改switch狀態  491  [self.switchControl setOn:NO animated:YES];  492  //設置switch不可用  493  self.switchControl.enabled = NO;  494  2.重要的事件:  495  valueChanged事件  496 例:兩個開關。主控制輔,主開,則輔能夠開關。主關,則輔不可操做  497 - (IBAction)mainSwitchChanged:(UISwitch *)sender {  498  //根據當前sender的狀態來決定下面的switch的狀態  499  [self.otherSwitch setOn:sender.on animated:YES];  500  //下面的switch能不能用,取決於sender的狀態  501  //sender 若是爲YES,enabled爲YES  502  //sender 若是爲NO,enabled爲NO  503  self.otherSwitch.enabled = sender.on;  504 }  505 
 506 4.UITextField 文本框控件  507  4.1 是什麼?  508  是單行的文本輸入框,支持用戶的輸入  509 
 510  4.2 屬性  511  .text 獲取或設置文本框內的文本  512  … …  513         
 514  4.3 系統彈出的鍵盤  515  第一響應者:當用戶觸摸界面時,系統會根據手指觸摸的位置層層定位到具體的控件,若是,本次觸點在文本框控件的區域內,那麼文本框就負責對本次的觸碰事件進行響應,因爲文本框比較特殊,因此係統自動將文本框設置爲響應事件的第一關,而且自動彈出鍵盤。  516 
 517  插播:  518  當用戶點擊屏幕後,首先開啓的是查找hit-View的過程。從window開始,給全部直接子視圖發hit-Test的消息,直到某一個控件沒有子視圖了,而且這個觸點在這個子視圖中,則返回這個控件,因而hit-View找到了  519  找到hit-View後,view則成爲了須要第一個爲這個事件提供響應的對象,若是,該對象沒有提供事件響應,則該事件對象會向視圖的父視圖繼續傳遞,若是父視圖依然沒有提供響應,則繼續向上傳遞,直到傳遞到UIApplication對象,依然沒有處理的話,則拋棄該事件。這個過程叫作響應者鏈。  520 
 521  4.4 如何關閉鍵盤  522  方法一:讓鍵盤放棄第一響應者的身份便可  523  [self.textField resignFirstResponder];  524 
 525  方法二:讓鍵盤所在的父視圖結束編輯狀態  526  [self.view endEditing:YES];  527 
 528  4.5何時關閉鍵盤呢?(關閉鍵盤的時機)  529  時機一:點擊鍵盤右下角的按鍵 選擇Did End On Exit事件 爲文本框添加一個 事件  530 
 531  時機二:點擊屏幕的空白部分  532  重寫控制器的touchesBegan:withEvent:方法 (不用鏈接方法)  533                         
 534         
 535 例:  536 #import "MyViewController.h"  537 
 538 @interface MyViewController ()  539 @property (weak, nonatomic) IBOutlet UITextField *textField;  540 
 541 @end  542 
 543 @implementation MyViewController  544 
 545 - (void)viewDidLoad  546 {  547  [super viewDidLoad];  548  //self.textField.text = @"xxxxxxx";  549     
 550 }  551 
 552 - (IBAction)openKeyboard:(UIButton *)sender {  553  //讓文本框成爲第一響應者  554  [self.textField becomeFirstResponder];  555     
 556 }  557 - (IBAction)closeKeyboard:(UIButton *)sender {  558  //方式一:讓文本框放棄第一響應者的身份  559  //[self.textField resignFirstResponder];  560  //方式二:讓文本框的父視圖放棄編輯狀態  561  [self.view endEditing:YES];  562 }  563 
 564 //時機一:點擊鍵盤右下角的按鍵,該事件觸發 鍵盤收起  565 - (IBAction)tapReturn:(UITextField *)sender {  566  //[sender resignFirstResponder];  567  [self.view endEditing:YES];  568 }  569 
 570 //時機二:點擊空白屏幕 鍵盤收起  571 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{  572  [self.view endEditing:YES];  573 }  574 
 575  
 576 做業:  577 1.界面以下:  578  [輸入框][發送按鈕]  579  1)當點擊發送按鈕後,界面上會出現一個UILabel,內容就是輸入框中的內容,此時要求,收起鍵盤,清空輸入框  580  2)當用戶點擊鍵盤右下角的按鍵時,功能和1相同  581  3)label自己設置爲寬280,高40,距離左邊20個點  582  4)多個label不能重合  583 #import "MyViewController.h"  584 
 585 @interface MyViewController ()  586 //發送按鈕  587 @property (weak, nonatomic) IBOutlet UIButton *sendButton;  588 //文本框  589 @property (weak, nonatomic) IBOutlet UITextField *textField;  590 
 591 @property(nonatomic,assign)float y;  592 
 593 @end  594 
 595 @implementation MyViewController  596 
 597 - (void)viewDidLoad  598 {  599  [super viewDidLoad];  600  //設置按鈕屬性  601  self.sendButton.backgroundColor=[UIColor redColor];  602  self.y=100;  603     
 604  }  605 //點擊發送按鈕,響應事件  606 - (IBAction)openKeyBound:(UIButton *)sender {  607  UILabel*label=[[UILabel alloc]init];  608  label.frame=CGRectMake(20, self.y, 280, 40);  609  NSLog(@"%@",self.textField.text);  610  label.text=self.textField.text;  611  [self.view addSubview:label];  612  self.y+=60;  613  [self.view endEditing:YES];  614  self.textField.text=nil;  615     
 616  }  617 
 618 //點擊左下角收起鍵盤  619 - (IBAction)tapReturn:(UITextField *)sender {  620  UILabel*label=[[UILabel alloc]init];  621  label.frame=CGRectMake(20, self.y, 280, 40);  622  NSLog(@"%@",self.textField.text);  623  label.text=self.textField.text;  624  [self.view addSubview:label];  625  self.y+=60;  626  [self.view endEditing:YES];  627  self.textField.text=nil;  628  [self.view endEditing:YES];  629 }  630 
 631         
 632 
 633 2.界面以下:  634  [輸入框 帳號]  635  [輸入框 密碼]  636  [登陸 按鈕]  637  [UILabel 顯示當前狀態(登陸後顯示用戶名,沒登陸顯示未登陸)]  638  1)用戶輸入完用戶名和密碼後,點擊登陸,判斷是否能夠登陸,若是登陸成功,label上顯示當前用戶的用戶名,若是沒有登陸,顯示未登陸  639  2)當用戶沒有填寫用戶名和密碼時,點擊登陸,提供用戶輸入用戶名和密碼  640  3)第一個textField支持Next功能,第二是Done  641 #import "MyViewController.h"  642 
 643 @interface MyViewController ()  644 
 645 @property (weak, nonatomic) IBOutlet UITextField *textUse;//文本框1連線  646 @property (weak, nonatomic) IBOutlet UITextField *textPassword;//文本框2連線  647 
 648 @property (weak, nonatomic) IBOutlet UILabel *labelShow;//顯示登錄成功的連線  649 @property (weak, nonatomic) IBOutlet UILabel *label;//顯示輸入有誤的連線  650 
 651 
 652 @end  653 
 654 @implementation MyViewController  655 
 656 
 657 - (void)viewDidLoad  658 {  659  [super viewDidLoad];  660     
 661 }  662 
 663 - (IBAction)buttonValue:(UIButton *)sender {  664  if ([self.textUse.text isEqualToString:@"fcp"]&&[self.textPassword.text isEqualToString:@"123"]) {  665  self.labelShow.text=@"fcp用戶登錄成功";  666  self.label.text=@"";  667  }else{  668  self.label.text=@"用戶名或密碼錯誤";  669  self.labelShow.text=@"未登陸";  670         
 671  }  672  [self.view endEditing:YES];  673  self.textUse.text=nil;  674  self.textPassword.text=nil;  675   
 676     
 677 }  678 //實現next功能  679 - (IBAction)frist:(UITextField *)sender { //文本框1連線,實現點回車到next功能  680  [self.textPassword becomeFirstResponder];  681 }  682 - (IBAction)done:(UITextField *)sender {  683  [self.view endEditing:YES];  684 }  685 
 686 @end  687 
 688 =====================================================================  689 知識點  690 6、UIAlertView、UIActionSheet  691 
 692 1.UIAlertView(警告框)  693  1.1 建立警告框,設置樣式  694 - (IBAction)alertView:(UIButton *)sender {//建立button按鈕  695  //建立警告框的實例  696  //UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"警告" message:@"提示信息message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];  697 //若有多個otherButtonTitles,先顯示otherButtonTitles。otherButtonTitles有一個,cancelButtonTitle在左邊  698  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"警告" message:@"提示信息message" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES",nil];  699  //顯示警告框  700  [alert show];//系統自帶show方法  701 }  702  1.2建立有提示信息輸入的警告框  703 - (IBAction)alertViewInput:(id)sender {  704  //建立警告框  705  UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"enter your login info" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];  706  //設置警告框的樣式  707  alert.alertViewStyle = UIAlertViewStylePlainTextInput;  708  //顯示警告框  709  [alert show];  710 }  711  1.3建立有提示信息輸入的警告框  712  UIAlertViewStyleDefault  713  UIAlertViewStyleSecureTextInput,//單行密碼形式  714  UIAlertViewStylePlainTextInput, //單行正常形式  715  UIAlertViewStyleLoginAndPasswordInput//用戶名和密碼  716  alert.alertViewStyle = UIAlertViewStylePlainTextInput;  717 
 718  1.4 如何獲取用戶在警告框上的選擇——委託  719  a)什麼是委託:  720  一個對象(對象A)讓另外一個對象(對象B)幫它作事情(發消息)。  721  b)委託協議:  722  是委託方要求代理方所符合的規則,這些規則對應的就是一組方法,而且每一個方法的第一個參數都是委託方的引用,每一個方法的名稱用於描述方法的執行時機  723  c)設置控制器實例成爲alertView的代理方的步驟  724  1)控制器遵照協議//委託方定義協議的名稱要求"委託方name+Delegate"  725  2)控制器實現協議中的方法//要想成爲代理方,必須知足委託方定義的協議  726  //第一個參數永遠是委託方的引用,點進協議直接複製  727  3)在建立UIAlertView時設定控制器實例爲代理方法  728 
 729 例:經過輸入用戶名和密碼信息,點擊按鈕。取出用戶名和密碼  730 /*1.設置控制器成爲警告框的代理,須要控制器(代理方)遵照協議*/
 731 @interface AlertViewController ()<UIAlertViewDelegate>
 732 @end
 733 @implementation AlertViewController  734 
 735 - (IBAction)alertViewDelegate:(id)sender {  736 //3.設置了警告框的代理方爲當前控制器實例,因而,當用戶點擊了警告框上的某個按鈕時該動做的處理就交給了控制器實例來響應
 737     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"your choice" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES",nil];  //self
 738     alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;  739  [alert show];  740 }  741 /*2.設置控制器成爲警告框的代理,實現協議中的方法選擇哪一個方法實現,根據不一樣的方法對應的執行時機能夠從方法名判斷髮消息的時機。  742  方法的第一個參數必定是委託方的引用  743  */
 744 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  745 {  746     //目標:當點擊YES按鈕時,在控制器打印輸入的用戶名和密碼
 747     if (alertView.cancelButtonIndex != buttonIndex) {  748         //獲取用戶名
 749         NSString *loginName = [alertView textFieldAtIndex:0].text;  750         //獲取密碼
 751         NSString *pwd = [alertView textFieldAtIndex:1].text;  752         NSLog(@"name:%@ , pwd:%@",loginName,pwd);  753  }  754 
 755 結果:  756 name:ggfg , pwd:sgg  757 
 758         1.5 如何區分用戶點擊的按鈕  759             在  -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex方法中,第二個參數爲點擊的按鈕的索引,可使用如下幾種方法進行判斷  760  方法一:直接判斷索引值區分不一樣的按鈕  761  方法二:根據索引值獲取按鈕的title,進行區分  762  方法三:判斷索引是不是cancelButtonIndex進行區分  763 //根據點擊的按鈕的索引獲取點擊的按鈕的標題
 764     NSString *title = [alertView buttonTitleAtIndex:buttonIndex];  765  方法1:判斷標題來區分不一樣的動做  766     if ([title isEqualToString:@"YES"]) {  767     // NSLog(@"點擊了YES按鈕");//根據點擊了按鈕OK執行的動做 }else{  768     // NSLog(@"點擊了NO按鈕");
 769  }  770  方法3:也能夠經過判斷是否是cancel按鈕的索引  771     //來判斷是否點擊了cancel按鈕
 772     if (alertView.cancelButtonIndex == buttonIndex)  773  {  774     // NSLog(@"點擊了NO按鈕");
 775  }  776 }  777     778         
 779         1.6 如何獲取alertView中輸入框內的文本  780  利用alertView的textFieldAtIndex:方法,得到不一樣索引位置上的文本框,而後反問text屬性便可  781        NSString *pwd = [alertView textFieldAtIndex:1].text;  782 
 783 
 784 2.UIActionSheet(操做表)  785         2.1 建立操做表  786     //建立actionSheet的實例
 787     UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"cancel" destructiveButtonTitle:@"destructive" otherButtonTitles:@"微博",@"微信",@"朋友圈", nil];  788     //顯示actionSheet
 789  [sheet showInView:self.view];  790 
 791         2.2 判斷用戶點擊的不一樣的按鈕  792  a)須要控制器實例遵照協議  793  b)須要控制器實現協議中的方法  794 #import "ActionSheetViewController.h"
 795 
 796 @interface ActionSheetViewController ()<UIActionSheetDelegate>//遵照協議
 797 
 798 @end
 799  - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex  800 {  801     //區分點擊的按鈕  802     //NSLog(@"%d",buttonIndex);//獲取按鈕標題對應的值  803     //獲取按鈕上的標題  804     //NSLog(@"%@",[actionSheet buttonTitleAtIndex:buttonIndex]);
 805     if (actionSheet.cancelButtonIndex == buttonIndex) {  806         //....點擊了cancel
 807  }  808     if (actionSheet.destructiveButtonIndex == buttonIndex) {  809         //....點擊了有破壞性的那個危險按鈕
 810  }  811 }  812  813 =====================================================================
 814 知識點  815 7、MVC 界面開發  816  1.什麼是設計模式  817  mvc只是其中一種,對某一類具體問題,總結出來的一套最優的解決方案  818 1.MVC:  819    1.Model(模型) View(視圖)Controller(控制器) 的縮寫  820  Model:程序中處理數據邏輯 (數據存儲、業務邏輯、多線程、網絡傳輸、文件存儲)  821  View:程序中處理數據顯示  822  Controller:View和Model的媒介  823     2.優勢:  824  1.耦合性低  825  2.重用性高  826  3.可維護性高 (結構清晰、可重用、方便維護)  827 ***1.對引用數據類型,在保證在第一次訪問改屬性時,數組空間被建立出來。因此就得重寫屬性get和set方法:  828 //重寫suit屬性的set方法
 829 -(void)setSuit:(NSString *)suit{  830     if ([[Card allSuit]containsObject:suit]) {Card類,+(NSArray*)allSuit;  831         _suit=suit;  832         
 833  }  834 }  835 //重寫cardInfo屬性的get方法
 836 -(NSString*)cardInfo{  837     _cardInfo=[self.suit stringByAppendingString:self.rank];  838     return _cardInfo;  839 }  840 //保證在第一次訪問改屬性時,數組空間被建立出來
 841 -(NSMutableArray *)allCards{  842     if (!_allCards) {  843         _allCards=[NSMutableArray array];  844  }  845     return _allCards;  846 }  847 **2.隨機數  848 隨機數從0開始的一個無符號正整數  849    unsigned int index=arc4random()%52 0-51
 850  特色:不須要設置隨機算子  851        **3.lazy loading懶加載  852 
 853 例:  854 MVC案例(重在體會)  855  里程碑1:  856  可以隨機出12張紙牌,將紙牌信息顯示到界面上  857 
 858  里程碑2:  859  根據用戶選中的紙牌,進行判斷,生成新的結果,將結果顯示到界面上  860 
 861  里程碑3:  862  再根據遊戲規則統計分數  863 建立文件夾model:  864 Card.h  865 #import <Foundation/Foundation.h>
 866 /*
 867  用於描述一張紙牌  868  屬性:  869  花色,大小,牌面信息,朝向,是否匹配  870  方法:  871  872  */
 873 @interface Card : NSObject  874 
 875 @property(nonatomic,strong)NSString *suit;//花色
 876 @property(nonatomic,strong)NSString *rank;//大小
 877 @property(nonatomic,strong,readonly)NSString *cardInfo;  878 
 879 @property(nonatomic,getter=isFaceUp)BOOL faceUp;  880 @property(nonatomic,getter=isMatched)BOOL matched;  881 
 882 -(instancetype)initWithSuit:(NSString *)suit andRank:(NSString *)rank;  883 
 884 +(NSArray *)allSuit;  885 +(NSArray *)allRank;  886 
 887 @end
 888 
 889 Card.m  890 
 891 #import "Card.h"
 892 
 893 @interface Card ()  894 
 895 @property(nonatomic,strong,readwrite)NSString *cardInfo;  896 
 897 @end
 898 
 899 @implementation Card  900 
 901 //重寫suit屬性的set方法
 902 - (void)setSuit:(NSString *)suit{  903     if ([[Card allSuit] containsObject:suit]) {  904         _suit = suit;  905  }  906 }  907 //重寫rank屬性的set方法
 908 - (void)setRank:(NSString *)rank{  909     if ([[Card allRank] containsObject:rank]) {  910         _rank = rank;  911  }  912 }  913 
 914 //重寫cardInfo屬性的get方法
 915 - (NSString *)cardInfo{  916     _cardInfo = [self.suit stringByAppendingString:self.rank];  917     return _cardInfo;  918 }  919 
 920 - (instancetype)initWithSuit:(NSString *)suit andRank:(NSString *)rank{  921     self = [super init];  922     if (self) {  923         self.suit = suit;  924         self.rank = rank;  925         self.faceUp = NO;  926         self.matched = NO;  927  }  928     return self;  929 }  930 
 931 + (NSArray *)allSuit  932 {  933     return @[@"♠️",@"❤️",@"♣️",@"♦️"];  934 }  935 
 936 + (NSArray *)allRank  937 {  938     return @[@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"];  939 }  940 
 941 @end
 942 
 943 Poker.h  944 #import <Foundation/Foundation.h>
 945 
 946 /*用於描述一副撲克牌,可以容納52張紙牌對象*/
 947 @interface Poker : NSObject  948 
 949 @property(nonatomic,strong)NSMutableArray *allCards;  950 
 951 @end
 952 Poker.m  953 #import "Poker.h"
 954 #import "Card.h"
 955 
 956 @implementation Poker  957 
 958 //重寫allCards屬性的get方法  959 //保證在第一次訪問該屬性時,數組空間被建立出來
 960 - (NSMutableArray *)allCards{  961     if (!_allCards) {  962         _allCards  = [NSMutableArray array];  963  }  964     return _allCards;  965 }  966 
 967 -(id)init{  968     self = [super init];  969     if (self) {  970         //建立52張紙牌對象,並放入到allCards中
 971         for (NSString *suit in [Card allSuit]) {  972             for (NSString *rank in [Card allRank]) {  973                 Card *card = [[Card alloc]initWithSuit:suit andRank:rank];  974  [self.allCards addObject:card];  975  }  976  }  977  }  978     return self;  979 }  980 
 981 @end
 982 Poker.h  983 #import <Foundation/Foundation.h>
 984 #import "Poker.h"
 985 /*
 986  用於描述遊戲類,存儲遊戲的數據,  987  及對數據的處理邏輯  988  */
 989 @interface Game : NSObject  990 
 991 @property(nonatomic,strong)NSMutableArray *randomCards;  992 @property(nonatomic)NSInteger score;  993 
 994 -(instancetype)initWithCountCard:(NSInteger)count inPoker:(Poker *)poker;  995 
 996 -(void)tapCardAtIndex:(NSInteger)index;  997 
 998 @end
 999 
1000 Poker.m 1001 #import "Game.h"
1002 #import "Card.h"
1003 
1004 @implementation Game 1005 
1006 - (NSMutableArray *)randomCards{ 1007     if (!_randomCards) { 1008         _randomCards = [NSMutableArray array]; 1009  } 1010     return _randomCards; 1011 } 1012 
1013 -(instancetype)initWithCountCard:(NSInteger)count inPoker:(Poker *)poker{ 1014     self = [super init]; 1015     if (self) { 1016         //根據指定的count做爲隨機的次數 1017         //從poker中隨機一張牌,將牌放入到randomCards
1018         for (NSInteger i=0; i<count; i++) { 1019             //使用隨機函數獲得一個0-51的下標
1020             unsigned int index = arc4random()%poker.allCards.count; 1021             //從poker中找到隨機位置對應的牌
1022             Card *card = poker.allCards[index]; 1023             //將牌從poker中移除
1024  [poker.allCards removeObject:card]; 1025             //記錄牌到randomCards中
1026  [self.randomCards addObject:card]; 1027  } 1028         self.score=0; 1029  } 1030     return self; 1031 } 1032 
1033 /*
1034  1.獲取index位置上的card對象 1035  2.若是card面兒朝上,則修改成面兒朝下 1036  3.若是card面兒朝下,首先修改成面兒朝上 1037  將card與數組中其餘的(已經朝上而且尚未被matched)牌進行比對 1038  4.比對的原則: 1039  若是兩張牌的花色相同,則兩張牌被matched 1040  若是兩張牌的大小相同,則兩張牌被matched 1041  不然,將被比對的牌翻回背面便可 1042  */
1043 - (void)tapCardAtIndex:(NSInteger)index{ 1044     Card *card = self.randomCards[index]; 1045     if (card.isFaceUp) { 1046         card.faceUp = NO; 1047     }else{ 1048         card.faceUp = YES; 1049         for (NSInteger i=0;i<self.randomCards.count;i++) { 1050             if (i != index) { 1051                 Card *otherCard = self.randomCards[i]; 1052                 if (otherCard.isFaceUp && !otherCard.isMatched) { 1053                     //比對花色
1054                     if ([card.suit isEqualToString:otherCard.suit]) { 1055                         card.matched = YES; 1056                         otherCard.matched = YES; 1057                         self.score+=1; 1058                     }else if([card.rank isEqualToString:otherCard.rank]){ 1059                         card.matched = YES; 1060                         otherCard.matched = YES; 1061                         self.score+=4; 1062                     }else{ 1063                         otherCard.faceUp = NO; 1064  } 1065  } 1066  } 1067  } 1068  } 1069 } 1070 
1071 @end
1072 GameViewController.h 繼承ViewController的控制器 1073 GameViewController.m 1074 #import "GameViewController.h"
1075 #import "Game.h"
1076 #import "Poker.h"
1077 #import "Card.h"
1078 
1079 @interface GameViewController () 1080 @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons; 1081 //構成遊戲而增長的屬性
1082 @property(nonatomic,strong)Game *game; 1083 @property(nonatomic,strong)Poker *poker; 1084 @property (weak, nonatomic) IBOutlet UILabel *scoreLabel; 1085 
1086 @end
1087 
1088 @implementation GameViewController 1089 
1090 //經過重寫屬性的get方法,實現lazy loading
1091 - (Poker *)poker{ 1092     if (!_poker) { 1093         _poker = [[Poker alloc]init]; 1094  } 1095     return _poker; 1096 } 1097 
1098 - (void)viewDidLoad 1099 { 1100  [super viewDidLoad]; 1101     self.game = [[Game alloc]initWithCountCard:self.buttons.count inPoker:self.poker]; 1102  [self updateCard]; 1103     self.scoreLabel.text=@"0"; 1104 } 1105 
1106 //更新Model中的牌信息到界面上
1107 -(void)updateCard{ 1108     //遍歷每個按鈕,根據按鈕的座標找到位置相同的隨機的紙牌,並顯示
1109     for (NSUInteger index = 0; index<self.buttons.count; index++) { 1110         //獲取該位置的紙牌對象
1111         Card *card = self.game.randomCards[index]; 1112         UIButton *button = self.buttons[index]; 1113  [button setTitle:[self titleForCard:card] forState:UIControlStateNormal]; 1114  [button setBackgroundImage:[UIImage imageNamed:[self imageNameForCard:card]]forState:UIControlStateNormal]; 1115         button.enabled = !card.isMatched; 1116  } 1117     //更新分數標籤
1118     self.scoreLabel.text=[NSString stringWithFormat:@"%d",self.game.score]; 1119 } 1120 //根據紙牌信息返回按鈕上要顯示的文字
1121 -(NSString *)titleForCard:(Card *)card{ 1122     return card.isFaceUp?card.cardInfo:@""; 1123 } 1124 
1125 //根據紙牌信息返回按鈕上要顯示的圖片
1126 -(NSString *)imageNameForCard:(Card *)card{ 1127     return card.isFaceUp?@"cardfront.png":@"cardback.png"; 1128 } 1129 
1130 
1131 - (IBAction)chooseCard:(UIButton *)sender 1132 { 1133     NSInteger index = [self.buttons indexOfObject:sender]; 1134     //將索引值傳遞給Model
1135  [self.game tapCardAtIndex:index]; 1136    
1137     //更新界面
1138  [self updateCard]; 1139 } 1140 
1141 @end
1142 AppDelegate.h 1143 AppDelegate.m 1144 #import "AppDelegate.h"
1145 #import "GameViewController.h"
1146 
1147 @implementation AppDelegate 1148 
1149 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 1150 { 1151     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 1152     GameViewController *vc = [[GameViewController alloc]initWithNibName:@"GameViewController" bundle:nil]; 1153     self.window.rootViewController = vc; 1154  [self.window makeKeyAndVisible]; 1155     return YES; 1156 } 1157 1158 ================================================================================================================
1159  知識點 1160 8、多MVC開發 ( 多界面開發) 1161 1.多MVC 1162  每個界面的顯示都是一套獨立的MVC,因爲應用程序須要多個界面,因此構成了多套MVC。 1163       注意:其中C和V是綁在一塊兒的,可是M因爲實現了程序中的數據存儲以及業務邏輯,是與C和V分開的一套體系,因此多套C+V組合,能夠共用一個M。可是,不容許v的共用,每個c都有本身的v,不能由於要切換界面,而讓某一個c拋棄本身帶的v,換別的c下面的v。 1164         
1165         1.1 多界面的切換 1166  原理:更換了c就實現了更換了v 1167 
1168         1.2 如何實現c的更換? 1169                 方向:從controlA  —> 推出controlB 1170  [controlA presentViewController:] 1171 
1172  方向:A推出B以後,想從B再回到A 1173  [controlB dismissViewController:]; 1174 
1175 例: 1176 建立兩個控制器類A和B,每一個類的xib界面拉入一個button按鈕,而後添加方法。 1177 功能:點擊A界面的按鈕回到B界面。點擊B界面按鈕返回到A 界面 1178 FristViewController.h 1179 FristViewController.m 1180 #import "FristViewController.h"
1181 #import "SecondViewController.h"
1182 
1183 @interface FristViewController () 1184 
1185 @end
1186 
1187 @implementation FristViewController 1188 
1189 
1190 - (void)viewDidLoad 1191 { 1192  [super viewDidLoad]; 1193     
1194 } 1195 - (IBAction)gotoSecondView:(id)sender {//A界面的方法 1196     //建立要推出的vc的實例
1197     SecondViewController* secondVc=[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; 1198     
1199     //從當前控制器下方推出新的vc
1200  [self presentViewController:secondVc animated:YES completion:nil]; 1201 } 1202 SecondViewController.h 1203 SecondViewController.m 1204 #import "SecondViewController.h"
1205 
1206 @interface SecondViewController () 1207 
1208 @end
1209 
1210 @implementation SecondViewController 1211 
1212 
1213 - (void)viewDidLoad 1214 { 1215  [super viewDidLoad]; 1216     
1217 } 1218 //返回到第一個界面
1219 - (IBAction)goBack:(id)sender {//B界面的方法
1220  [self dismissViewControllerAnimated:YES completion:nil]; 1221 } 1222 
1223 @end
1224 2.界面之間的正向傳值 1225             2.1 什麼是正向傳值: 1226 當從控制器A推出新的控制器B的時候,A將界面中接受的數據同時也傳給了B,由B進行展現或處理的過程 1227 
1228         2.2 如何實現正向傳值: 1229  step1:爲控制器B增長公開的屬性用於接收外界傳入的值 1230  step2:控制器A爲了推出B,會建立B的實例,建立完實例後,在推出以前,將要傳遞的屬於存到B公開的屬性中便可 1231  step3:推出的控制器B在viewWillAppear中將數據展現到界面中 1232 
1233 例: 1234 控制器A界面的內容能夠傳到B界面顯示 1235 FristViewController.h 1236 FristViewController.m 1237 #import "FristViewController.h"
1238 #import "SecondViewController.h"
1239 
1240 @interface FristViewController () 1241 @property (weak, nonatomic) IBOutlet UILabel *textField;//界面1中的文字信息屬性 連線A中的
1242 @end
1243 
1244 @implementation FristViewController 1245 
1246 
1247 - (void)viewDidLoad 1248 { 1249  [super viewDidLoad]; 1250     
1251 } 1252 - (IBAction)gotoSecondView:(id)sender {//A界面的方法 1253     //建立要推出的vc的實例
1254     SecondViewController* secondVc=[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; 1255 
1256     //將文本框的值賦到的secondVc公開屬性中
1257     secondVc.content=self.textField.text; 1258 
1259     //從當前控制器下方推出新的vc
1260  [self presentViewController:secondVc animated:YES completion:nil]; 1261 } 1262 SecondViewController.h 1263 #import <UIKit/UIKit.h>
1264 
1265 @interface SecondViewController : UIViewController 1266 @property(nonatomic,strong)NSString*content; 1267 //公開屬性
1268 @end
1269 
1270 SecondViewController.m 1271 #import "SecondViewController.h"
1272 
1273 @interface SecondViewController () 1274 @property (weak, nonatomic) IBOutlet UILabel *label;//界面2的文本屬性 連線B界面中的label
1275 @end
1276 
1277 @implementation SecondViewController 1278 
1279 
1280 //建立視圖時被執行一次
1281 - (void)viewDidLoad 1282 { 1283  [super viewDidLoad]; 1284     self.label.text=self.content; 1285 } 1286 //視圖顯示以前被執行,能夠執行屢次
1287 -(void)viewWillAppear:(BOOL)animated{ 1288  [super viewWillAppear:animated]; 1289     //顯示公開的屬性
1290      self.label.text=self.content; 1291 } 1292 //返回到第一個界面
1293 - (IBAction)goBack:(id)sender {//B界面的方法
1294  [self dismissViewControllerAnimated:YES completion:nil]; 1295 } 1296 
1297 @end
1298 3.界面之間的反向傳值 1299             3.1 什麼是反向傳值 ? 1300  從A推出了B以後,當從B返回到(dismiss)推出它的A時,傳遞了數據回來,由A進行顯示的過程 1301 
1302         3.2 如何實現 1303  step1:B中公開一個能夠接收A引用的屬性aVC 1304  step2:A中公開一個能夠接收返回數據的屬性message 1305  step3:A推出B以前,將本身的引用傳給B 1306  step4:B在dismiss以前,將要返回的數據傳給持有的A的引用中公開的message屬性 1307  step5:在A的viewWillAppear中,顯示message的內容 1308 
1309 例: 1310 B界面的內容返回到A界面 1311 
1312 1.方法一:缺點耦合度過高 1313 AViewController.h 1314 #import <UIKit/UIKit.h>
1315 
1316 @interface AViewController : UIViewController 1317 
1318 @property(nonatomic,strong)NSString *message;公開屬性 1319 
1320 @end
1321 
1322 AViewController.m 1323 #import "AViewController.h"
1324 #import "BViewController.h"
1325 @interface AViewController () 1326 @property (weak, nonatomic) IBOutlet UILabel *label; 連線label,顯示返回的值 1327 
1328 @end
1329 
1330 @implementation AViewController 1331 
1332 
1333 - (void)viewDidLoad 1334 { 1335  [super viewDidLoad]; 1336    
1337 } 1338 - (void)viewWillAppear:(BOOL)animated{ 1339  [super viewWillAppear:animated]; 1340     //呈現界面以前將message內的數據顯示到標籤上
1341     self.label.text = self.message; 1342 } 1343 
1344 - (IBAction)gotoBViewController:(id)sender { 1345     BViewController *bVC = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 1346     //將當前控制器(A)引用傳給B
1347     bVC.aVC = self; 1348  [self presentViewController:bVC animated:YES completion:nil]; 1349 } 1350 @end
1351 
1352 BViewController.h 1353 #import <UIKit/UIKit.h>
1354 #import "AViewController.h"
1355 
1356 @interface BViewController : UIViewController 1357 
1358 //公開一個屬性,存放A的引用
1359 @property(nonatomic,strong)AViewController *aVC; 1360 @end
1361 BViewController.m 1362 #import "BViewController.h"
1363 
1364 @interface BViewController () 1365 @property (weak, nonatomic) IBOutlet UITextField *textField; 連線文本框,B界面輸入的內容 1366 
1367 @end
1368 
1369 @implementation BViewController 1370 - (void)viewDidLoad 1371 { 1372  [super viewDidLoad]; 1373 } 1374 
1375 - (IBAction)goback:(id)sender { 1376     self.aVC.message = self.textField.text; 1377  [self dismissViewControllerAnimated:YES completion:nil]; 1378 } 1379 
1380 @end
1381 2.方法二: 1382 4.使用 委託 實現 反向傳值 1383  委託方:推出的B 代理方:推出B的那個A 1384 
1385  委託方要作的三件事: 1386         .h文件    a。定義協議1)協議名稱 : 類名+Delegate  2)方法的第一個參數必定是委託方本身      3)方法名儘可能體現發消息的時機 1387         .h文件    b。添加delegate屬性 @property(nonatomic,weak)id<BViewControllerDelegate>  delegate; 1388  .m文件c。選擇合適的時機給代理髮消息 1389 
1390 
1391  代理方要作的三件事: 1392  a。遵照協議 1393  b。實現方法 1394  c。將本身設置爲代理方 1395 AViewController.h 1396 AViewController.m 1397 #import "AViewController.h"
1398 #import "BViewController.h"
1399 //代理方要作的三件事 1400 //1.遵照協議
1401 @interface AViewController ()<BViewControllerDelegate>
1402 
1403 @property (weak, nonatomic) IBOutlet UILabel *label; 1404 
1405 @end
1406 
1407 @implementation AViewController 1408 
1409 
1410 - (void)viewDidLoad 1411 { 1412  [super viewDidLoad]; 1413    
1414 } 1415 - (IBAction)gotoB:(id)sender { 1416     BViewController *bVC = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 1417     //3.將本身設置爲bVC的代理方
1418     bVC.delegate = self; 1419  [self presentViewController:bVC animated:YES completion:nil]; 1420 } 1421 
1422 
1423 //2.實現方法
1424 - (void)bViewController:(BViewController *)bVC inputFinishedWithMessage:(NSString *)message{ 1425     self.label.text = message; 1426 } 1427 BViewController.h 1428 #import <UIKit/UIKit.h>
1429 @class BViewController; 1430 
1431 //1.定義協議
1432 /*
1433  要點: 1)協議名稱 : 類名+Delegate 1434  2)方法的第一個參數必定是委託方本身 1435  3)方法名儘可能體現發消息的時機 1436  */
1437 @protocol BViewControllerDelegate <NSObject>
1438 -(void)bViewController:(BViewController *)bVC inputFinishedWithMessage:(NSString *)message; 1439 @end
1440 
1441 @interface BViewController : UIViewController 1442 //2.添加一個公開的delegate屬性
1443 @property(nonatomic,weak)id<BViewControllerDelegate>  delegate; 1444 
1445 @end
1446 
1447 BViewController.m 1448 #import "BViewController.h"
1449 
1450 @interface BViewController () 1451 @property (weak, nonatomic) IBOutlet UITextField *textField; 1452 
1453 @end
1454 
1455 @implementation BViewController 1456 
1457 
1458 
1459 - (void)viewDidLoad 1460 { 1461  [super viewDidLoad]; 1462    
1463 } 1464 - (IBAction)goBack:(id)sender { 1465     //3.合適的時機,給代理方發消息
1466     [self.delegate bViewController:self inputFinishedWithMessage:self.textField.text]; 1467  [self dismissViewControllerAnimated:YES completion:nil]; 1468 } 1469 
1470 @end
1471 
1472 做業: 1473 
1474 1.做業1參考圖片 homework1.png 1475 
1476 2.星座運程App 1477  a。界面1:有一個按鈕「請選擇您的星座」,用戶點擊後,跳轉到第二個界面 1478  b。界面2:有12個星座(能夠作成12個按鈕)可選,選定後,返回到第一個界面 1479  c。界面1:顯示選擇的那個星座的運程 1480 AViewController.h 1481 AViewController.m 1482 #import "AViewController.h"
1483 #import "StarViewController.h"
1484 
1485 @interface AViewController ()<StarViewControllerDelegate>
1486 @property (weak, nonatomic) IBOutlet UILabel *resultLabel;連線返回值label的屬性 1487 
1488 @end
1489 
1490 @implementation AViewController 1491 
1492 
1493 - (void)starViewController:(StarViewController *)sVC chooseStarWithMessage:(NSString *)mes{ 1494     self.resultLabel.text = mes; 1495 } 1496 
1497 - (void)viewDidLoad 1498 { 1499  [super viewDidLoad]; 1500 
1501 } 1502 
1503 - (IBAction)chooseStar:(id)sender {連線按鈕的點擊方法 1504     StarViewController *svc = [[StarViewController alloc]initWithNibName:@"StarViewController" bundle:nil]; 1505     svc.delegate = self; 1506  [self presentViewController:svc animated:YES completion:nil]; 1507 } 1508 
1509 
1510 @end
1511 
1512 StarViewController.h 1513 #import <UIKit/UIKit.h>
1514 @class StarViewController; 1515 
1516 @protocol StarViewControllerDelegate <NSObject>
1517 
1518 -(void)starViewController:(StarViewController *)sVC chooseStarWithMessage:(NSString *)mes; 1519 
1520 @end
1521 
1522 
1523 
1524 @interface StarViewController : UIViewController 1525 @property(nonatomic,weak)id<StarViewControllerDelegate> delegate; 1526 
1527 @end
1528 
1529 StarViewController.m 1530 #import "StarViewController.h"
1531 
1532 @interface StarViewController () 1533 @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons; 連線創建4個星座的屬性 1534 @property(nonatomic,strong)NSArray *array; 1535 
1536 @end
1537 
1538 @implementation StarViewController 1539 
1540 //重寫array屬性的get方法
1541 - (NSArray *)array{ 1542     if (!_array) { 1543         _array = @[@"恭喜發財",@"萬事如意",@"順風順水",@"新年快樂"]; 1544  } 1545     return _array; 1546 } 1547 
1548 
1549 
1550 
1551 - (IBAction)chooseStar:(UIButton *)sender { 連線創建4個星座的方法 1552     
1553     NSInteger index = [self.buttons indexOfObject:sender]; 1554     
1555     [self.delegate starViewController:self chooseStarWithMessage:self.array[index]]; 1556  [self dismissViewControllerAnimated:YES completion:nil]; 1557 } 1558 
1559 3.文本建立器 1560  a。界面1:有一個按鈕「建立文本」,點擊後進入到界面2 1561  b。界面2: 1562  x:[TextField] width:[TextField] 1563  y:[TextField] height:[TextField] 1564  text:[TextField] 1565  【肯定按鈕】 1566  當用戶點擊確認按鈕後,返回到界面1 1567  c。界面1:根據用戶剛纔的輸入,建立一個UILabel對象,label的frame根據剛纔的輸入肯定,label的內容也是根據輸入肯定,將label加入到界面1中 1568 FirstViewController.h 1569 FirstViewController.m 1570 
1571 #import "FirstViewController.h"
1572 #import "SecondViewController.h"
1573 @interface FirstViewController ()<SecondViewControllerDelegate>
1574 @property(nonatomic,assign)NSInteger x; 1575 @property(nonatomic,assign)NSInteger y; 1576 @property(nonatomic,assign)NSInteger w; 1577 @property(nonatomic,assign)NSInteger h; 1578 
1579 @end
1580 
1581 @implementation FirstViewController 1582 -(void)secondViewController:(SecondViewController *)secondVC sendX:(NSString *)x sendY:(NSString *)y sendWidth:(NSString *)width sendHeight:(NSString *)height sendTextField:(NSString *)textField{ 1583     self.x=[x intValue] ; 1584     self.y=[y intValue] ; 1585     self.w=[width intValue] ; 1586     self.h=[height intValue] ; 1587     UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(self.x, self.y, self.w, self.h)]; 1588     label.text=textField; 1589  [self.view addSubview:label]; 1590 } 1591 
1592 
1593 - (void)viewDidLoad 1594 { 1595  [super viewDidLoad]; 1596 } 1597 
1598 
1599 - (IBAction)gotoSecond:(UIButton *)sender { 連線建立文本按鈕 1600     SecondViewController* second = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; 1601     second.delegate = self; 1602  [self presentViewController:second animated:YES completion:nil]; 1603 } 1604 
1605 @end
1606 SecondViewController.h 1607 c#import <UIKit/UIKit.h>
1608 @class SecondViewController; 1609 @protocol SecondViewControllerDelegate <NSObject>
1610 
1611 -(void)secondViewController:(SecondViewController*)secondVC sendX:(NSString*)x sendY:(NSString*)y sendWidth:(NSString*)width sendHeight:(NSString*)height sendTextField:(NSString*)textField; 1612 
1613 @end
1614 
1615 @interface SecondViewController : UIViewController 1616 @property(nonatomic,weak)id<SecondViewControllerDelegate> delegate; 1617 @end
1618 SecondViewController.m 1619 #import "SecondViewController.h"
1620 
1621 @interface SecondViewController () 1622 @property (weak, nonatomic) IBOutlet UITextField *x; 1623 @property (weak, nonatomic) IBOutlet UITextField *width; 1624 @property (weak, nonatomic) IBOutlet UITextField *y; 1625 @property (weak, nonatomic) IBOutlet UITextField *height; 1626 @property (weak, nonatomic) IBOutlet UITextField *textField; 連線5個文本框 1627 
1628 @end
1629 
1630 @implementation SecondViewController 1631 
1632 - (void)viewDidLoad 1633 { 1634  [super viewDidLoad]; 1635 
1636 } 1637 - (IBAction)goBack:(UIButton *)sender { 連線肯定按鈕 1638     
1639     [self.delegate secondViewController:self sendX:self.x.text sendY:self.y.text sendWidth:self.width.text sendHeight:self.height.text sendTextField:self.textField.text]; 1640  [self dismissViewControllerAnimated:YES completion:nil]; 1641     
1642 } 1643 
1644 
1645 @end
1646 
1647 =========================================================================
1648 知識點 1649 9、UINavigationController(導航控制器) 1650 
1651 1.UINavigationControlle 1652             1.1 是什麼? 1653  繼承自UIViewController,依然是一種控制器,可是,這種控制器沒有具體的view,是管理控制器的控制器 1654 
1655         1.2 優勢? 1656  可以管理和控制VC的走向,比present方式更清晰 1657 
1658         1.3 如何使用? 1659  step1:建立UINavigationController的實例 1660  step2:建立一個具體的vc實例,並將這個vc設置爲UINavigationController的根視圖控制器 1661  step3:設置navigationController爲window的根視圖控制器 1662  step4:想推出新的vc時,可使用pushViewController的方法 1663  step5:想回退到上一個vc時,能夠不寫代碼;或者是使用popViewController的方法 1664 
1665         1.4 內部原理 1666                 1)navi內部有一個能夠存儲多個vc的數組,就是self.navigationController.viewControllers屬性;而且這個數組使用「棧」的方式來管理數據。「棧」的特色:先進後出,後進先出。 1667                 2)navi必須 有一個根視圖控制器做爲第一個展現的vc 1668                 3)push出一個新的vc時,就是往棧屬性中入棧一個vc對象,新的vc入棧以前顯示的那個vc不會被釋放 1669                 4)pop現有vc時,纔是將這個vc釋放掉 1670                 5)不能pop根vc 1671 
1672 例: 1673 A界面退出B,B返回A 1674 AppDelegate.h 1675 AppDelegate.m 1676 #import "AppDelegate.h"
1677 #import "AViewController.h"
1678 
1679 @implementation AppDelegate 1680 
1681 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 1682 { 1683     self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 1684     AViewController* aVC=[[AViewController alloc]initWithNibName:@"AViewController" bundle:nil]; 1685     //建立導航控制器的實例
1686     UINavigationController*navi=[[UINavigationController alloc]initWithRootViewController:aVC]; 1687     //將navi設置爲window的跟視圖
1688     self.window.rootViewController=navi; 1689  [self.window makeKeyAndVisible]; 1690     return YES; 1691 } 1692 AViewController.h 1693 AViewController.m 1694 #import "AViewController.h"
1695 #import "BViewController.h"
1696 
1697 @interface AViewController () 1698 
1699 @end
1700 
1701 @implementation AViewController 1702 
1703 
1704 - (void)viewDidLoad 1705 { 1706  [super viewDidLoad]; 1707    
1708 } 1709 
1710 - (IBAction)gotoB:(id)sender { 1711     BViewController* bVC=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 1712     [self.navigationController pushViewController:bVC animated:YES];//經過navigationController屬性退出B界面
1713 
1714 } 1715 
1716 @end
1717 BViewController.h 1718 BViewController.m 1719 #import "BViewController.h"
1720 
1721 @interface BViewController () 1722 
1723 @end
1724 
1725 @implementation BViewController 1726 
1727 - (void)viewDidLoad 1728 { 1729  [super viewDidLoad]; 1730     
1731 } 1732 //返回(也能夠不寫,經過navigationController自帶的back返回)
1733 - (IBAction)goback:(id)sender { 1734  [self.navigationController popViewControllerAnimated:YES]; 1735 } 1736 @end
1737 2.配置導航欄 1738  只針對當前的界面 1739    1.訪問導航欄:self.navigationItem 1740    2.導航欄包含三部分: 1741 
1742          1)左側的按鈕區域 1743         self.navigationItem.leftBarButtonItem/s 1744               self.navigationItem.leftBarButtonItem=r;方法同右側 1745          2)中間的title 1746           self.title = @「」; 1747  中間title部分:在viewDidLoad中配置導航欄標題,在哪一個界面顯示就配置的哪一個界面的標題欄 1748 - (void)viewDidLoad 1749 { 1750  [super viewDidLoad]; 1751     //配置導航欄標題
1752     self.title=@"A界面"; 1753    
1754 } 1755     3)右側的按鈕區域 1756            self.navigationItem.rightBarButtonItem/s 1757 - (void)viewDidLoad 1758 { 1759  [super viewDidLoad]; 1760     //配置導航欄標題
1761     self.title=@"A界面"; 1762     //配置導航欄右側按鈕內容
1763     UIBarButtonItem* r=[[UIBarButtonItem alloc]initWithTitle:@"下一個" style:UIBarButtonItemStyleDone target:self action:@selector(gotoB:)]; 1764     //self.navigationItem.rightBarButtonItem=r;
1765     UIBarButtonItem* r2=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:nil action:nil];//系統自帶顯示圖標 搜索
1766     self.navigationItem.rightBarButtonItems=@[r,r2]; 1767         4)按鈕的類型:UIBarButtonItem類型 1768  可使用initWithTitle。。方法建立自定義 1769  文本內容的按鈕 1770  可使用initWithBarButtonSystemItem…方法建立系統定義好的,有固定外觀的按鈕 1771 
1772 3.配置工具欄 1773  默認是全局的 1774      1. 訪問工具欄:self.toolBarItem 1775      2.工具欄中加載的也是UIBarButtonItem類型的按鈕 1776      3.將默認隱藏的工具欄顯示出來,默認是隱藏 1777     self.navigationController.toolbarHidden = NO; 1778       1)只在一個界面顯示,其餘界面隱藏    ( 須要在其餘界面加上self.navigationController.toolbarHidden = YES;) 1779 //和顯示有關,和建立沒有關係
1780 -(void)viewWillAppear:(BOOL)animated{ 1781     //將默認隱藏的工具欄顯示出來
1782     self.navigationController.toolbarHidden = NO; 1783 } 1784       2)設置推出bvc時,底部區域全部bar隱藏 (其餘界面不須要修改) 1785              在須要設置導航的界面,經過viewDidLoad方法顯示出來,而後在建立推出其它界面時隱藏bvc.hidesBottomBarWhenPushed=YES; 1786 
1787 - (IBAction)gotoBViewController:(id)sender { 1788     BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 1789     //設置推出bvc時,底部區域隱藏
1790     bvc.hidesBottomBarWhenPushed=YES; 1791  [self.navigationController pushViewController: bvc animated:YES]; 1792 } 1793 
1794      4.特效按鈕:木棍(固定的) 調整工具欄的距離,通常放在最左、最右。能夠設置寬度width 1795  UIBarButtonSystemItemFixedSpace 1796    5.特效按鈕:彈簧(隨着之間的距離自動調整) 放在兩個對象之間 1797 
1798 例:暫停,前進,後退按鈕顯示在工具欄中。 1799 - (void)viewDidLoad 1800 { 1801  [super viewDidLoad]; 1802     //將默認隱藏的工具欄顯示出來
1803     self.navigationController.toolbarHidden = NO; 1804     //配置工具欄
1805     UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:nil action:nil]; 1806     UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:nil action:nil]; 1807     UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:nil action:nil]; 1808     //特效按鈕:木棍
1809     UIBarButtonItem *item4 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; 1810     item4.width = 40; 1811     //特效按鈕:彈簧
1812     UIBarButtonItem *item5 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 1813     
1814     self.toolbarItems = @[item4,item2,item5,item1,item5,item3,item4]; 1815 } 1816 
1817 @end
1818 4.多個導航之間切換 1819 是當前界面的導航跳轉到另外一個界面的導航,導航與導航之間的切換(從下面推出)。此時就不用push 和pop 來推出和返回了(從左面推出) 1820 1.推出時修改成: 1821 UINavigationController*navi2=[[UINavigationController alloc]initWithRootViewController:bvc]; 1822  [self.navigationController presentViewController:navi2 animated:YES completion:nil]; 1823 2.返回到推出的界面 1824 [self.navigationController dismissViewControllerAnimated:YES completion:nil]; 1825 
1826 小結:導航控制器能夠設置的屬性的做用於範圍 1827  屬性: 1828  .title 1829                          .navigationItem.leftBarButtonItem/s 1830                          .navigationItem.rightBarButtonItem/s 1831  .toolbarItems 1832  以上四個屬性的設置只負責當前所屬的vc 1833 
1834  屬性: 1835  .navigationController.toolbarHidden 1836  設置後,針對導航控制器管理的全部vc都生效 1837 
1838             *** 問:在不一樣的vc中均可以訪問self.navigationController,那麼是同一個導航控制器嗎? 1839  答:是 1840   推出的界面, 1841 ===============================================================================
1842 知識點 1843 10、UIImageView 1844 
1845 1.數據類型:NSString —>UILabel 顯示 1846              UIImage—>UIImageView 顯示 1847 
1848 2. 如何使用 1849 #import "MyViewController.h"
1850 
1851 @interface MyViewController () 1852 
1853 @end
1854 
1855 @implementation MyViewController 1856 
1857 
1858 - (void)viewDidLoad 1859 { 1860  [super viewDidLoad]; 1861     //建立圖片
1862     UIImage *image = [UIImage imageNamed:@"Elephant.jpg"];//圖片名稱 1863     //建立圖片控件,此時imageView的尺寸和建立時使用的圖片的尺寸同樣大
1864     UIImageView *imageView = [[UIImageView alloc]initWithImage:image]; 1865     //設置圖片view的frame
1866     imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);//必定要設置尺寸,否則不會顯示 1867 
1868     //設置imageView爲圓角
1869     imageView.layer.cornerRadius = 30; 1870     imageView.layer.masksToBounds = YES; 1871     //設置圖片view的內容顯示方式
1872     imageView.contentMode = UIViewContentModeScaleAspectFit; 1873     //將圖片控件添加到視圖中
1874  [self.view addSubview:imageView]; 1875 } 1876 
1877 @end
1878 3.擁有屬性 1879             1.屬性: 1880  contentMode用於設置view內容顯示的方式 1881                     1)UIViewContentModeScaleToFill: 1882  修改寬高比,適應imageView的區域大小,圖片會被拉伸,不留白邊 1883                     2)UIViewContentModeScaleAspectFit: 1884  維持寬高比不變的狀況下,將整張圖片可見,因爲圖片的寬高比和設置的imageView的frame的寬高好比果不協調的話,可能會留白邊兒。 1885                     3)UIViewContentModeScaleAspectFill: 1886  保持寬高比不變的狀況下,將imageView所佔的區域填滿,因此只會顯示圖片的一部分,不會留白 1887                 
1888             2.屬性: 1889  layer.cornerRadius設置圓角的半徑 1890  layer.masksToBounds開啓按邊緣遮罩 1891 ===========================================================================
1892 知識點 1893 11、UIScrollView 1894 
1895 1 .做用: 1896  在有限的區域內,顯示更多的數據或圖片 1897 
1898 2 .本質: 1899  管理view的view,scrollView自己沒有任何的外觀,依靠添加到scrollView中的其餘視圖來完成界面的顯示 1900             
1901 3 .如何使用 1902 //imageView尺寸比較大,與圖片同樣大
1903           UIImageView* iV=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Elephant.jpg"]]; 1904     UIScrollView*sV=[[UIScrollView alloc]init];//建立scrollView的實例
1905     sV.frame=CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);//設置scrollView的frame
1906 
1907     [sV addSubview:iV];//將圖片控件添加到scrollView中
1908     [self.view addSubview:sV];   //將滾動視圖添加的view中 
1909                 
1910 4.重要的屬性: 1911  .frame 設置scrollView用多大的窗口來顯示內容 1912  .contentSize設置了可滾動的區域的大小 1913  .contentOffset設置frame定點與內容的左頂點的偏移座標 1914  .contentInset設置內容與邊界之間的上、左、下、右的距離 1915  其餘屬性: 1916  .bounces 是否能夠邊緣彈跳 1917  .showsHorizontalScrollIndicator 1918  .showsVerticalScrollIndicator 1919  .indicatorStyle 1920   1. //設置scrollView可滾動查看的內容的區域大小
1921     scrollView.contentSize = imageView.frame.size; 1922 
1923     //設置滾動視圖不能夠彈跳
1924     scrollView.bounces = NO; 1925 
1926     //設置水平滾動條是否顯示
1927     scrollView.showsHorizontalScrollIndicator = NO; 1928     //設置豎直滾動條是否顯示
1929     scrollView.showsVerticalScrollIndicator = NO; 1930 
1931     //設置滾動條顏色
1932     scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite; 1933 
1934 2.//設置導航框,點擊移動按鈕,即可以跳到圖片的設定範圍
1935 self.title = @"scrollView"; 1936     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"移動" style:UIBarButtonItemStyleDone target:self action:@selector(move)]; 1937 -(void)move{ 1938     self.sV.contentOffset=CGPointMake(1000, 1000); 1939     self.sV.contentInset = UIEdgeInsetsMake(300, 300, 300, 300); 1940 } 1941 
1942 5.如何實現滾動視圖內容的縮放 1943  step1:設置滾動內容縮放的最大比率 1944  step2:設置滾動內容縮放的最小比率 1945  step3:回答問題,說明scrollView裏面的哪一個子視圖須要縮放 1946     //設置最大比率
1947     scrollView.maximumZoomScale = 1; 1948     CGFloat xScale = scrollView.frame.size.width/imageView.frame.size.width; 1949     CGFloat yScale = scrollView.frame.size.height/imageView.frame.size.height; 1950     //設置最小比率
1951     scrollView.minimumZoomScale = MIN(xScale, yScale); 1952     //設置當前控制器爲scrollView的代理
1953     scrollView.delegate = self; **需遵照協議@interface MyViewController ()<UIScrollViewDelegate>
1954 
1955     //返回要縮放的視圖 遵照協議
1956 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ 1957     return self.imageView; 1958 } 1959 6.UIPageControl 界面下方小圓點 1960     //建立pageControl
1961     UIPageControl *pageControl = [[UIPageControl alloc]init]; 1962   
1963     pageControl.frame = CGRectMake(0, self.view.frame.size.height-20-30, self.view.frame.size.width, 30); 1964     pageControl.numberOfPages = self.imageNames.count; 1965 
1966     //設置圓點的顏色
1967     pageControl.pageIndicatorTintColor = [UIColor whiteColor]; 1968     //設置被選中的圓點的顏色
1969     pageControl.currentPageIndicatorTintColor = [UIColor redColor]; 1970 
1971     //關閉用戶交互功能
1972     pageControl.userInteractionEnabled = NO; 1973  [self.view addSubview:pageControl]; 1974 做業: 1975     
1976     1.視力檢查器 1977             a。界面1:程序開始時,有一個檢查視力的字母」E」一個Label顯示E,font屬性比較大.=[UIFont systemFontOfSize:100],界面下方有兩個按鈕,分別是看的清,看不清 1978  b。點擊看的清,則推出第二個界面,第二個界面和第一個界面幾乎同樣,惟一不一樣的時E變小了,大小變成95 1979             c。點擊看的清,繼續推出第三個界面,E的字體繼續變小,90 。。。 85 。。。 80.。。 1980  d。直到用戶點擊了看不清,告訴他,視力是多少 1981  要求:必須是使用UINavigationController來控制vc的跳轉,每次應該推出新的vc對象,而不是修改原來的vc對象 1982 AppDelegate.h 1983 #import <UIKit/UIKit.h>
1984 
1985 @interface EViewController : UIViewController 1986 
1987 @property(nonatomic)CGFloat fontSize;//公開的屬性,字母的大小
1988 
1989 @end
1990 AppDelegate.m 1991 #import "AppDelegate.h"
1992 #import "EViewController.h"
1993 
1994 @implementation AppDelegate 1995 
1996 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 1997 { 1998     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 1999     EViewController *evc = [[EViewController alloc]initWithNibName:@"EViewController" bundle:nil]; 2000     evc.fontSize = 100.0; 2001     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:evc]; 2002     self.window.rootViewController = navi; 2003  [self.window makeKeyAndVisible]; 2004     return YES; 2005 } 2006 EViewController.h 2007 EViewController.m 2008 #import "EViewController.h"
2009 
2010 @interface EViewController () 2011 @property (weak, nonatomic) IBOutlet UILabel *label; 2012 
2013 @end
2014 
2015 @implementation EViewController 2016 
2017 
2018 
2019 - (void)viewDidLoad 2020 { 2021  [super viewDidLoad]; 2022     self.title = [NSString stringWithFormat:@"%f",self.fontSize]; 2023     self.label.font = [UIFont systemFontOfSize:self.fontSize]; 2024    
2025 } 2026 - (IBAction)canSee:(id)sender { 2027     if ((self.fontSize-5)<0) { 2028         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"視力太好了" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 2029  [alert show]; 2030         return; 2031  } 2032     EViewController *evc = [[EViewController alloc]initWithNibName:@"EViewController" bundle:nil]; 2033     evc.fontSize = self.fontSize-10; 2034  [self.navigationController pushViewController:evc animated:YES]; 2035 } 2036 
2037 - (IBAction)cannotSee:(id)sender { 2038     NSString *mes = [NSString stringWithFormat:@"視力是:%f",self.fontSize/100]; 2039     UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:mes delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 2040  [alert show]; 2041 } 2042 
2043 @end
2044 
2045         2. 完成scrollView 對圖片的縮放 2046 
2047 
2048         3.試作如 homework.png的效果圖 2049 
2050 要求:四張圖片拼接,經過滑動屏幕顯示出來,同時手機下方有圓形按鈕,隨着滑動圖片顯示原點位置,同時在滑動到第四張圖片時,添加一個按鈕,點擊按鈕響應事件 2051 WelcomeViewController.h 2052 WelcomeViewController.m 2053 #import "AppDelegate.h"
2054 #import "WelcomeViewController.h"
2055 
2056 @implementation AppDelegate 2057 
2058 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2059 { 2060     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 2061     WelcomeViewController *vc = [[WelcomeViewController alloc]initWithNibName:@"WelcomeViewController" bundle:nil]; 2062     self.window.rootViewController = vc; 2063  [self.window makeKeyAndVisible]; 2064     return YES; 2065 } 2066 
2067 WelcomeViewController.h 2068 #import <UIKit/UIKit.h>
2069 
2070 @interface WelcomeViewController : UIViewController 2071 
2072 //圖片的名稱
2073 @property(nonatomic,strong)NSArray *imageNames; 2074 
2075 @end
2076 WelcomeViewController.m 2077 #import "WelcomeViewController.h"
2078 
2079 @interface WelcomeViewController ()<UIScrollViewDelegate>
2080 @property(nonatomic,strong)UIPageControl *pageControl; 2081 @end
2082 
2083 @implementation WelcomeViewController 2084 //重寫初始化方法
2085 - (NSArray *)imageNames{ 2086     if (!_imageNames) { 2087         _imageNames = @[@"welcome1.png",@"welcome2.png",@"welcome3.png",@"welcome4.png"]; 2088  } 2089     return _imageNames; 2090 } 2091 
2092 - (void)viewDidLoad 2093 { 2094  [super viewDidLoad]; 2095     UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:self.view.frame]; 2096     //設置contentSize 大小:手機屏幕寬*4(圖片的個數)
2097     scrollView.contentSize = CGSizeMake(scrollView.frame.size.width*self.imageNames.count, scrollView.frame.size.height); 2098     
2099     //將全部圖片以子視圖的方式添加到scrollView中
2100     for (NSInteger i=0; i<self.imageNames.count; i++) { 2101         UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:self.imageNames[i]]]; 2102         //建立一個frame變量,並賦值
2103         CGRect imageFrame = CGRectZero; 2104         imageFrame.size = scrollView.frame.size; 2105         imageFrame.origin.y = 0; 2106         imageFrame.origin.x = i*scrollView.frame.size.width; 2107         //將設置到好的frame變量給image
2108         imageView.frame = imageFrame; 2109  [scrollView addSubview:imageView]; 2110  } 2111     
2112     //配置scrollView 2113     //設置整頁滾動
2114     scrollView.pagingEnabled = YES; 2115     //設置邊緣不彈跳
2116     scrollView.bounces = NO; 2117     //設置水平滾動條不顯示
2118     scrollView.showsHorizontalScrollIndicator =NO; 2119     //設置scrollView的代理
2120     scrollView.delegate = self; 2121     
2122  [self.view addSubview:scrollView]; 2123     
2124     
2125     //建立pageControl
2126     UIPageControl *pageControl = [[UIPageControl alloc]init]; 2127     self.pageControl = pageControl; 2128     pageControl.frame = CGRectMake(0, self.view.frame.size.height-20-30, self.view.frame.size.width, 30); 2129     pageControl.numberOfPages = self.imageNames.count; 2130     //設置圓點的顏色
2131     pageControl.pageIndicatorTintColor = [UIColor whiteColor]; 2132     //設置被選中的圓點的顏色
2133     pageControl.currentPageIndicatorTintColor = [UIColor redColor]; 2134     //關閉用戶交互功能
2135     pageControl.userInteractionEnabled = NO; 2136  [self.view addSubview:pageControl]; 2137     
2138     //爲最後一屏添加按鈕
2139     UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 2140     button.frame = CGRectMake(scrollView.frame.size.width*(self.imageNames.count-1), 0, scrollView.frame.size.width, scrollView.frame.size.height); 2141     //爲按鈕添加點擊事件
2142  [button addTarget:self action:@selector(enterApp) forControlEvents:UIControlEventTouchUpInside]; 2143  [scrollView addSubview:button]; 2144 } 2145 //委託代理
2146 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 2147     // 獲取移動的偏移定點座標
2148     CGPoint offSet = scrollView.contentOffset; 2149     //根據座標算出滾動到第幾屏的位置下標
2150     NSInteger index = offSet.x/scrollView.frame.size.width; 2151     self.pageControl.currentPage=index; 2152 } 2153 
2154 -(void)enterApp{ 2155     NSLog(@"........."); 2156 } 2157 
2158 @end
2159 ===========================================================================
2160 知識點 2161 12、表視圖 2162   
2163 1.UITableView(表視圖) 2164 
2165       1.1 什麼是表視圖? 2166  類型是:UITableView類 2167  表現形式:以一列多行的列表形式來展現數據的視圖 2168  表視圖的樣式:普通表視圖(Plain) 分組表視圖(Group) 2169 
2170      1.2 表視圖包含的部分? 2171             +UITableView 2172                     +TableHeaderView 2173                     +section1(分區) 2174                             +sectionHeader 2175                             +UITableViewCell (行、單元格) 2176                             +sectionFooter 2177                     +section2(分區) 2178                     +TableFooterView 2179  其中,表頭、尾,分區頭、尾能夠根據須要選擇的設置,可是在設定表格式,單元格是必須被設置的 2180 
2181    1.3 如何使用UITableView表視圖? 2182  step1:建立tableView的實例,設置frame,以子視圖的形式添加到self.view中 2183  step2:設置tableView的dataSource代理和delegate代理爲當前控制器 2184  step3:設置控制器遵照UITableViewDataSource和UITableViewDelegate協議 2185  step4:實現dataSource協議中的三個方法用於設定表格展現的外觀 2186  方法1:用於設定整個表格有幾個分區 2187  方法2:用於設定每一個分區有幾行 2188  方法3:用於設定每一個行是什麼樣子 2189  step5:實現delegate協議中的一個方法用於設定表格能夠對用戶的點擊某一行的動做的響應 2190             
2191  注:以上協議,dataSource協議必須遵照及實現方法2和方法3,方法1有默認的設置,能夠根據須要修改;delegate協議在須要響應用戶點擊動做時再遵照和實現方法;另,實現表視圖的過程能夠簡稱爲3問1答;3問指的是實現datasource協議中的三個方法,1答指的是實現delegate協議中的一個方法 2192 MyViewController.h 2193 #import <UIKit/UIKit.h>
2194 
2195 @interface MyViewController : UIViewController//繼承自UIViewController
2196 
2197 @end
2198 MyViewController.m 2199 #import "MyViewController.h"
2200 
2201 @interface MyViewController ()<UITableViewDataSource,UITableViewDelegate>
2202 
2203 @end
2204 
2205 @implementation MyViewController 2206 
2207 - (void)viewDidLoad 2208 { 2209  [super viewDidLoad]; 2210     //建立UITableView的實例
2211     UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.frame]; 2212     //設置表視圖的數據源代理
2213     tableView.dataSource = self; 2214     //設置表視圖的代理
2215     tableView.delegate = self; 2216     //將表視圖添加到view中
2217  [self.view addSubview:tableView]; 2218 } 2219 
2220 
2221 //問1:表格有幾個分區
2222 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 2223     return 1; 2224 } 2225 
2226 //問2:每一個分區有幾行
2227 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 2228     return 10; 2229 } 2230 
2231 //問3:每一行什麼樣
2232 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 2233     UITableViewCell *cell = [[UITableViewCell alloc]init]; 2234     cell.textLabel.text = @"Hello World"; 2235     return cell; 2236 } 2237 
2238 //答1:點擊某一行後的響應
2239 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 2240     NSLog(@"....."); 2241 } 2242 AppDelegate.h 2243 AppDelegate.m 2244 #import "AppDelegate.h"
2245 #import "MyViewController.h"
2246 
2247 @implementation AppDelegate 2248 
2249 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2250 { 2251     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 2252     MyViewController *vc = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 2253     self.window.rootViewController = vc; 2254  [self.window makeKeyAndVisible]; 2255     return YES; 2256 } 2257 
2258 
2259 2.表視圖控制器(UITableIViewController) 2260 
2261         2.1 是什麼? 2262  一種專門配置表視圖的控制器 2263 
2264         2.2特色? 2265  a)繼承自UITableViewController 2266  b)已經遵照了UITableViewDataSource和UITableViewDelegate協議 2267  c)該控制器自帶的視圖已是UITableView類型的了,而且能夠藉助於self.tableView屬性來訪問自帶的這個表視圖 2268  d)控制器已經成爲了自帶的表視圖的數據源代理對象和代理對象 2269 
2270         2.3 使用 2271  建立表視圖時,能夠繼承自UITableViewController,設置代理、遵照協議這些設置就都不須要單獨完成了,只須要將關注點放在三問一答上便可。 2272 MyTableViewController.h 2273 #import <UIKit/UIKit.h>
2274 
2275 @interface MyTableViewController : UITableViewController//繼承自UITableViewController
2276 
2277 @end
2278 MyTableViewController.m 2279 #import "MyTableViewController.h"
2280 #import "DetailViewController.h"
2281 
2282 @interface MyTableViewController () 2283 
2284 @end
2285 
2286 @implementation MyTableViewController 2287 
2288 
2289 #pragma mark - 視圖的生命週期    //方便從窗口快速定位到方法查看
2290 - (void)viewDidLoad 2291 { 2292  [super viewDidLoad]; 2293     self.title = @"表格"; 2294 } 2295 
2296 
2297 #pragma mark - dataSource協議
2298 
2299 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2300 { 2301     return 1; 2302 } 2303 
2304 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2305 { 2306     return 10; 2307 } 2308 
2309 
2310 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2311 { 2312     UITableViewCell *cell = [[UITableViewCell alloc]init]; 2313     cell.textLabel.text = @"Hello Kitty"; 2314     return cell; 2315 } 2316 #pragma mark - Table view delegate
2317 //一答
2318 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 2319 { 2320     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 2321  [self.navigationController pushViewController:detailViewController animated:YES]; 2322 } 2323 
2324 @end
2325 DetailViewController.h 2326 DetailViewController.m 2327 
2328 AppDelegate.h 2329 AppDelegate.m 2330 #import "AppDelegate.h"
2331 #import "MyTableViewController.h"
2332 @implementation AppDelegate 2333 
2334 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 2335 { 2336     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 2337     MyTableViewController *tvc = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil]; 2338     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:tvc]; 2339     self.window.rootViewController = navi; 2340  [self.window makeKeyAndVisible]; 2341     return YES; 2342 } 2343 3.多分區的UITableView(表視圖) 2344 
2345  3.1 NSIndexPath 2346  該類型描述的是一種路徑,爲了定位一個單元格的位置,須要兩個值,一個是分區號,一個是在分區內的行號;分區號的排序規則從0開始,單元格在每個分區內的排序規則也是從0開始。 2347  屬性: 2348  .section 記錄的是分區號 2349  .row 記錄的是行在某一個分區內的行號 2350 MyTableViewController.h 2351 #import <UIKit/UIKit.h>
2352 
2353 @interface MyTableViewController : UITableViewController 2354 
2355 @end
2356 MyTableViewController.m 2357 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2358 { 2359     
2360     return 3; 2361 } 2362 
2363 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section//分區號
2364 {   //第一個分區有三行
2365     if (section==0) { 2366         return 3; 2367     }else if (section==1){//第二個分區有兩行
2368         return 2; 2369     }else{ 2370       return 4; 2371  } 2372     
2373 } 2374 
2375 /**/
2376 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2377 { 2378     UITableViewCell *cell = [[UITableViewCell alloc]init]; 2379     //每一個區
2380     if (indexPath.section==0) {//第一個區
2381         if (indexPath.row==0) {//第一行
2382             cell.textLabel.text=@"hello"; 2383         }else{ 2384            cell.textLabel.text=@"Hello"; 2385  } 2386         
2387     }else if (indexPath.section==1){//第二個分區全部行的內容
2388         cell.textLabel.text=@"hello wlord"; 2389     }else{ 2390        cell.textLabel.text=@"hello kity"; 2391  } 2392     
2393     return cell; 2394 } 2395  3.2表頭視圖、表尾視圖內容 2396 一個表格中,只能有一個表頭和表尾視圖 2397  經過如下兩個屬性進行設置: 2398  .tableView.tableHeaderView 2399  .tableView.tableFooterView 2400   - (void)viewDidLoad 2401 { 2402  [super viewDidLoad]; 2403     //表頭視圖 能夠在表頭視圖添加標籤、文本框、按鈕等
2404     UIView* headerView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 100)]; 2405     UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(100, 10, 100, 50)];//標籤在視圖中的位置
2406     label.backgroundColor=[UIColor greenColor]; 2407     label.textAlignment=NSTextAlignmentCenter;//標籤上的文字居中
2408     label.text=@"header"; 2409     [headerView addSubview:label];//將標籤添加到表視圖
2410     self.tableView.tableHeaderView=headerView; 2411     //self.tableView.tableFooterView=headerView; 表尾視圖
2412     
2413 } 2414   3.3 分區頭、分區尾內容 2415  一個表格中,能夠有多個分區頭和分區尾,經過回答問題的方式進行設定;分區頭和分區尾能夠設置爲簡單的字符串描述,也能夠設置複雜的UIView 2416 
2417  1)第一種設定方法 2418 //表頭視圖、表尾視圖
2419 -(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 2420     if (section==0) { 2421         return @"title1";//第一個分區表視圖的表頭內容
2422     }else if(section==1){ 2423         return @"title2"; 2424     }else{ 2425        return @"title3"; 2426  } 2427 } 2428 
2429  2)第二種設定方法 2430 -(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ 2431     //能夠添加文本框、標籤等
2432 } 2433 ========================================================================================================
2434 4.UITableViewCell 單元格 2435 
2436     4.1是什麼? 2437  系統定義的單元格類型,表格中的每個都是一個UITableViewCell的實例 2438 
2439     4.2單元格具備系統提供的默認的樣式 2440  不一樣的演示,對於系統默認提供的三個視圖具備不一樣的擺放方式 2441 四種樣式: 2442 UITableViewCellStyleDefault (imageView和textLabel在最左邊,不顯示detailTextLabel) 2443 UITableViewCellStyleValue1 (imageView和textLabel在最左邊,detailTextLabel在最右邊) 2444 UITableViewCellStyleValue2 (textLabel和detailTextLabel在一行,前邊空幾格,不顯示圖片) 2445 UITableViewCellStyleSubtitle (imageView最左邊,detailTextLabel在textLabel的下方) 2446 
2447     4.3單元格具備系統提供的默認的組成視圖 2448  .textLabel 標題標籤 2449  .detailTextLabel 詳情標籤 .imageView 圖片視圖 2450 //每行的內容
2451 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2452 { 2453     UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 2454     cell.textLabel.text=@"title"; 2455     cell.detailTextLabel.text=@"title2";//詳細的內容
2456     cell.imageView.image=[UIImage imageNamed:@"wifi.png"]; 2457     return cell; 2458 } 2459   4.4設置單元格行高 2460 //設置單元格行高
2461 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 2462     return 70; 2463 } 2464 
2465 5.單元格的重用 2466 
2467     5.1 什麼是單元格的重用? 2468  將完整超出屏幕的單元格存到隊列中,屏幕一旦出現空白區域,須要單元格來填充時,先去隊列中按照指定的標示圖來試着取,看有沒有已經用完並存在隊列中的單元格,有,就拿來修改值後從新加到界面中,從隊列中取不出已用完的單元格時,則新建 2469 
2470    5.2 如何實現單元格的重用?
2471  前提:超出屏幕的單元格由系統自動竄到隊列中 2472  具體作的內容:在回答每行內容什麼樣的時候,先嚐試着從隊列中取單元格對象,取的結果有兩種,要麼取到,拿來繼續用,要麼取不到可重用的,那麼本身新建便可 2473 
2474         ***注意:存到隊列中的單元格能夠有多種多樣的,因此每一種進入隊列的單元格都須要指定給一個標示,去隊列中取單元格時,要說明按哪一種標示來找同樣的對象 2475 
2476 方法一:從隊列中取cell對象,本身判斷是否取到了cell,沒有取到時,本身用代碼建立cell對象 2477 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2478 {   //重複用單元格
2479     UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"abc"]; 2480     if (cell==nil) { 2481         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"abc"]; 2482  } 2483        cell.textLabel.text=@"hello"; 2484     return cell; 2485 } 2486 方法二:viewDidLoad中提在註冊單元格的類型,而後從隊列中取出cell對象後,就算沒有取到可重用的單元格,系統也會按照註冊的cell樣式建立新的cell對象 2487 - (void)viewDidLoad 2488 { 2489  [super viewDidLoad]; 2490     //註冊單元格
2491     [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"abc"]; 2492 } 2493 
2494 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2495 {   //重複用單元格
2496     UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"abc"]; 2497     cell.textLabel.text=@"hello"; 2498 
2499     return cell; 2500 } 2501    5.3如何進行表格的刷新,在原有的基礎上添加 2502 
2503 方法一:總體刷新 2504 [self.tableView reloadData]; 2505 方法二:局部刷新 2506     //從第四行開始刷新 局部刷新 最後一行
2507     NSIndexPath* newIndexPath=[NSIndexPath indexPathForRow:self.citys.count-1 inSection:0]; 2508 
2509  [self.tableView insertRowsAtIndexPaths:@[newIndexPath] 2510 withRowAnimation:UITableViewRowAnimationTop]; 2511 
2512 6.三問一答中的一答 2513     6.1 推出簡單的VC來顯示數據詳情 2514  【Demo3_SimpleVC】 2515  數據結構: 2516                                 + City : NSObject 2517                                 +name : NSString 2518                                 +population : NSInteger 2519 
2520  要求: 2521  a。有一組城市信息,以tableView的形式來展現全部城市的列表 2522  b。選中某一個城市後,推出新的普通vc,顯示選中的城市名稱和城市的人口數 2523 
2524 CityTableViewController.h 2525 #import <UIKit/UIKit.h>
2526 
2527 @interface CityTableViewController : UITableViewController 2528 
2529 @end
2530 CityTableViewController.m 2531 
2532 #import "CityTableViewController.h"
2533 #import "City.h"
2534 #import "DetailViewController.h"
2535 
2536 @interface CityTableViewController () 2537 
2538 @property(nonatomic,strong)NSArray *citys; 2539 
2540 @end
2541 
2542 @implementation CityTableViewController 2543 //重寫get方法
2544 - (NSArray *)citys{ 2545     if (!_citys) { 2546         _citys = [City demoData]; 2547  } 2548     return _citys; 2549 } 2550 
2551 
2552 
2553 
2554 - (void)viewDidLoad 2555 { 2556  [super viewDidLoad]; 2557     self.title = @"城市列表"; 2558 } 2559 
2560 
2561 #pragma mark - Table view data source
2562 
2563 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2564 { 2565     return 1; 2566 } 2567 
2568 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2569 { 2570     return self.citys.count; 2571 } 2572 
2573 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2574 { 2575     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 2576     if (cell == nil) { 2577         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 2578  } 2579     //根據row,去數組中取到city對象
2580     City *city = self.citys[indexPath.row]; 2581     cell.textLabel.text = city.name; 2582     return cell; 2583 } 2584 
2585 #pragma mark - Table view delegate
2586 
2587 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 2588 { 2589     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 2590     //根據行號找到選中的城市對象
2591     City *city = self.citys[indexPath.row]; 2592     //將city傳給推出的vc來顯示
2593     detailViewController.city = city; 2594  [self.navigationController pushViewController:detailViewController animated:YES]; 2595 } 2596 @end
2597 DetailViewController.h 2598 #import <UIKit/UIKit.h>
2599 #import "City.h"
2600 
2601 @interface DetailViewController : UIViewController 2602 @property(nonatomic,strong)City *city; 2603 
2604 @end
2605 DetailViewController.m 2606 #import "DetailViewController.h"
2607 
2608 @interface DetailViewController () 2609 @property (weak, nonatomic) IBOutlet UILabel *nameLabel; 連線 2610 @property (weak, nonatomic) IBOutlet UILabel *populationLabel; 2611 
2612 @end
2613 
2614 @implementation DetailViewController 2615 
2616 
2617 - (void)viewDidLoad 2618 { 2619  [super viewDidLoad]; 2620     self.title = @"城市詳情"; 2621 } 2622 
2623 - (void)viewWillAppear:(BOOL)animated{ 2624  [super viewWillAppear:animated]; 2625     self.nameLabel.text = self.city.name; 2626     self.populationLabel.text = [NSString stringWithFormat:@"%d萬",self.city.population]; 2627 } 2628 
2629 @end
2630 
2631 City.h 2632 #import <Foundation/Foundation.h>
2633 
2634 @interface City : NSObject 2635 
2636 @property(nonatomic,strong)NSString *name; 2637 @property(nonatomic)NSInteger population; 2638 
2639 -(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population; 2640 
2641 +(NSArray *)demoData; 2642 
2643 @end
2644 City.m 2645 #import "City.h"
2646 
2647 @implementation City 2648 
2649 -(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population{ 2650     self = [super init]; 2651     if (self) { 2652         self.name = name; 2653         self.population = population; 2654  } 2655     return self; 2656 } 2657 
2658 + (NSArray *)demoData{ 2659     City *t1 = [[City alloc]initWithName:@"北京" andPopulation:1000]; 2660     City *t2 = [[City alloc]initWithName:@"上海" andPopulation:900]; 2661     City *t3 = [[City alloc]initWithName:@"廣州" andPopulation:800]; 2662     City *t4 = [[City alloc]initWithName:@"深圳" andPopulation:700]; 2663     return @[t1,t2,t3,t4]; 2664 } 2665 @end
2666  6.2 推出tableView來顯示子數據 2667 
2668  【Demo4_TableVC】 2669 
2670  數據結構: 2671                                 + City : NSObject 2672                                 +name : NSString 2673                                 +population : NSInteger 2674                                 +areas(區域) : NSArray (NSString) 2675  例如: 2676  City: 2677  name:北京 2678                                         population:1000
2679  areas: @[@「東城區」,@「西城區」,@「朝陽區」] 2680  要求: 2681  a。有一組城市信息,以tableView的形式來展現全部城市的列表 2682  b。選中某一個城市後,推出新的tableVC,顯示選中的城市的全部areas信息 2683 City.h 2684 #import <Foundation/Foundation.h>
2685 
2686 @interface City : NSObject 2687 
2688 @property(nonatomic,strong)NSString *name; 2689 @property(nonatomic)NSInteger population; 2690 @property(nonatomic,strong)NSArray *areas;//地區
2691 
2692 -(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population; 2693 
2694 +(NSArray *)demoData; 2695 
2696 @end
2697 City.m 2698 #import "City.h"
2699 
2700 @implementation City 2701 
2702 -(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population{ 2703     self = [super init]; 2704     if (self) { 2705         self.name = name; 2706         self.population = population; 2707  } 2708     return self; 2709 } 2710 
2711 + (NSArray *)demoData{ 2712     City *t1 = [[City alloc]initWithName:@"北京" andPopulation:1000]; 2713     t1.areas = @[@"東城區",@"西城區",@"海淀區"]; 2714     
2715     City *t2 = [[City alloc]initWithName:@"上海" andPopulation:900]; 2716     t2.areas = @[@"浦東區",@"靜安區",@"徐彙區"]; 2717     
2718     City *t3 = [[City alloc]initWithName:@"廣州" andPopulation:800]; 2719     t3.areas = @[@"白雲區",@"越秀區",@"天河區"]; 2720     
2721     City *t4 = [[City alloc]initWithName:@"深圳" andPopulation:700]; 2722     t4.areas = @[@"未知區",@"未知2區"]; 2723     
2724     return @[t1,t2,t3,t4]; 2725 } 2726 @end
2727 CityTableViewController.h 2728 CityTableViewController.m 2729 同上 2730 DetailViewController.h 2731 #import <UIKit/UIKit.h>
2732 #import "City.h"
2733 
2734 @interface DetailViewController : UITableViewController ***繼承 2735 @property(nonatomic,strong)City *city; 2736 
2737 @end
2738 DetailViewController.m 2739 #import "DetailViewController.h"
2740 
2741 @interface DetailViewController () 2742 
2743 @end
2744 
2745 @implementation DetailViewController 2746 
2747 - (void)viewDidLoad 2748 { 2749  [super viewDidLoad]; 2750     self.title = self.city.name; 2751     [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"]; 2752 } 2753 
2754 
2755 #pragma mark - Table view data source
2756 
2757 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2758 { 2759     return 1; 2760 } 2761 
2762 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2763 { 2764     return self.city.areas.count; 2765 } 2766 
2767 
2768 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2769 { 2770     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 2771     cell.textLabel.text = self.city.areas[indexPath.row]; 2772     return cell; 2773 } 2774 
2775 
2776   6.3 使用多分區來顯示子數據 【Demo5_MutilSection】 2777 
2778  數據結構: 2779                                 + City : NSObject 2780                                 +name : NSString 2781                                 +population : NSInteger 2782                                 +areas(區域) : NSArray (NSString) 2783  例如: 2784  City: 2785  name:北京 2786                                         population:1000
2787  areas: @[@「東城區」,@「西城區」,@「朝陽區」] 2788  要求: 2789  a。使用一個tableView的多分區展現城市名稱及子地區名稱 2790  b。每一個分區的頭,顯示城市名稱 2791  c。每一個分區的尾,顯示城市的人口 2792  d。分區內的多行顯示城市的全部areas 2793 City.h 2794 City.m 2795 同上 2796 CityTableViewController.h 2797 CityTableViewController.m 2798 #import "CityTableViewController.h"
2799 #import "City.h"
2800 
2801 @interface CityTableViewController () 2802 
2803 @property(nonatomic,strong)NSArray *citys; 2804 
2805 @end
2806 
2807 @implementation CityTableViewController 2808 
2809 - (NSArray *)citys{ 2810     if (!_citys) { 2811         _citys = [City demoData]; 2812  } 2813     return _citys; 2814 } 2815 
2816 
2817 - (void)viewDidLoad 2818 { 2819  [super viewDidLoad]; 2820     self.title = @"城市列表"; 2821 } 2822 
2823 
2824 #pragma mark - Table view data source
2825 
2826 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2827 { 2828     //有幾個城市就是幾個分區
2829     return self.citys.count; 2830 } 2831 
2832 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2833 { 2834     //每一個城市的子地區有幾個,那麼該分區就有幾行
2835     City *city = self.citys[section]; 2836     return city.areas.count; 2837 } 2838 
2839 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2840 { 2841     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 2842     if (cell == nil) { 2843         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 2844  } 2845     //根據section找到對應的city
2846     City *city = self.citys[indexPath.section]; 2847     cell.textLabel.text = city.areas[indexPath.row]; 2848     return cell; 2849 } 2850 
2851 //設置section頭
2852 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 2853     City *city = self.citys[section]; 2854     return city.name; 2855 } 2856 
2857 //設置section尾
2858 -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{ 2859     City *city = self.citys[section]; 2860     return [NSString stringWithFormat:@"人口數:%d萬",city.population]; 2861 } 2862 
2863 @end
2864 
2865  6.4 向TableView中添加一行數據 2866  數據模型: 2867                                 + City : NSObject 2868                                 +name : NSString 2869                                 +population : NSInteger 2870  要求: 2871  a。第一個界面使用tableView展現全部的城市信息 2872  b。城市名稱在單元格的左側顯示 2873  c。城市的人口在單元格的右側顯示 2874  d。在導航欄的右上角有一個加號按鈕,點擊這個加號後,推出一個新的普通vc 2875  e。在推出的界面2中,包含兩個文本框,一個用於輸入新的城市名稱,一個用於輸入該城市的人口數 2876  f。界面2中下方有一個保存按鈕,點擊保存按鈕後,返回到界面1,而且將在界面2中輸入的數據回傳到界面1,保存在界面1中用於存放全部城市信息的數組中 2877  g。同時,更新表格,顯示增長完城市信息後的新數據(注:如何刷新整個表格?[ self.tableView reloadData];) 2878 TRCity.h 2879 #import <Foundation/Foundation.h>
2880 
2881 @interface TRCity : NSObject 2882 @property(nonatomic,strong)NSString* name; 2883 @property(nonatomic)NSInteger population; 2884 
2885 -(instancetype)initWithName:(NSString*)name andPopulation:(NSInteger)population; 2886 
2887 +(NSMutableArray*)cityArrays; 2888 @end
2889 TRCity.m 2890 #import "TRCity.h"
2891 
2892 @implementation TRCity 2893 -(instancetype)initWithName:(NSString*)name andPopulation:(NSInteger)population{ 2894     if ([super init]) { 2895         self.name=name; 2896         self.population=population; 2897  } 2898     return self; 2899 } 2900 
2901 +(NSMutableArray*)cityArrays{ 2902     TRCity* c1=[[TRCity alloc]initWithName:@"北京" andPopulation:1000]; 2903     TRCity* c2=[[TRCity alloc]initWithName:@"上海" andPopulation:800]; 2904     TRCity* c3=[[TRCity alloc]initWithName:@"廣州" andPopulation:600]; 2905     return [@[c1,c2,c3]mutableCopy]; 2906 } 2907 @end
2908 
2909 CityTableViewController.h 2910 #import <UIKit/UIKit.h>
2911 
2912 @interface CityTableViewController : UITableViewController 2913 
2914 @end
2915 CityTableViewController.m 2916 #import "CityTableViewController.h"
2917 #import "TRCity.h"
2918 #import "MyViewController.h"
2919 
2920 @interface CityTableViewController ()<MyViewControllerDelegate>
2921 @property(nonatomic,strong)NSMutableArray* citys; 2922 //@property(nonatomic,strong)NSMutableArray*message;
2923 @end
2924 
2925 @implementation CityTableViewController 2926 
2927 -(NSMutableArray*)citys{ 2928     if (!_citys) { 2929         _citys=[TRCity cityArrays]; 2930  } 2931     return _citys; 2932 } 2933 
2934 //添加導航欄配置
2935 - (void)viewDidLoad 2936 { 2937  [super viewDidLoad]; 2938     
2939      self.title=@"城市列表"; 2940     UIBarButtonItem* r=[[UIBarButtonItem alloc]initWithBarButtonSystemItem: target:self action:@selector(gotoNewVC)]; 2941     self.navigationItem.rightBarButtonItem=r; 2942     
2943 } 2944 //點擊加號切換到的界面
2945 -(void)gotoNewVC{ 2946     MyViewController* myVC=[[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 2947  [self.navigationController pushViewController:myVC animated:YES ]; 2948     myVC.delegate=self; 2949     
2950 } 2951 
2952 //實現方法
2953 -(void)myViewController:(MyViewController *)mVC gobackMessage:(NSArray *)message{ 2954     //self.citys=message;
2955     TRCity* city=[[TRCity alloc]init]; 2956     
2957     city.name=message[0]; 2958     city.population=[message[1] integerValue]; 2959  [self.citys addObject:city]; 2960     //刷新表格 從原有的刷新 2961     //[ self.tableView reloadData]; 2962     
2963     //從第四行開始刷新 局部刷新
2964     NSIndexPath* newIndexPath=[NSIndexPath indexPathForRow:self.citys.count-1 inSection:0]; 2965  [self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationTop]; 2966     
2967 } 2968 
2969 
2970 #pragma mark - Table view data source
2971 
2972 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 2973 { 2974 
2975     return 1; 2976 } 2977 
2978 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 2979 { 2980     
2981     return self.citys.count; 2982 } 2983 
2984 /**/
2985 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 2986 { 2987     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 2988     if (cell==nil) { 2989         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 2990  } 2991     
2992     TRCity* city=self.citys[indexPath.row]; 2993     cell.textLabel.text=city.name; 2994     cell.detailTextLabel.text=[NSString stringWithFormat:@"人口:%d",city.population]; 2995     
2996     
2997     return cell; 2998 } 2999 MyViewController.h 3000 #import <UIKit/UIKit.h>
3001 //定義協議
3002 @class MyViewController; 3003 @protocol MyViewControllerDelegate <NSObject>
3004 
3005 -(void)myViewController:(MyViewController*)mVC gobackMessage:(NSArray*)message; 3006 
3007 @end
3008 
3009 @interface MyViewController : UIViewController 3010 
3011 @property(nonatomic,weak)id<MyViewControllerDelegate>delegate; 3012 @end
3013 MyViewController.m 3014 #import "MyViewController.h"
3015 
3016 @interface MyViewController () 3017 
3018 @property (weak, nonatomic) IBOutlet UITextField *name; 連線文本框 3019 @property (weak, nonatomic) IBOutlet UITextField *population; 3020 @property(nonatomic,strong)NSArray* city; 3021 @end
3022 
3023 @implementation MyViewController 3024 
3025 - (void)viewDidLoad 3026 { 3027  [super viewDidLoad]; 3028     
3029 } 3030 - (IBAction)returnCS:(UITextField *)sender { 3031  [self.view endEditing:YES]; 3032 } 3033 - (IBAction)returnRK:(UITextField *)sender { 3034  [self.view endEditing:YES]; 3035 } 3036 //點擊保存按鈕返回到界面1
3037 - (IBAction)goBackCIty:(UIButton *)sender { 3038     NSString* str=self.name.text; 3039     NSString*str2=self.population.text; 3040     self.city=@[str,str2]; 3041     [self.delegate myViewController:self gobackMessage:self.city]; 3042  [self.navigationController popToRootViewControllerAnimated:YES]; 3043 } 3044 
3045 @end
3046 
3047 7.表格的編輯模式 3048 
3049    1.1 什麼是表格的編輯模式? 3050  在表格上能夠進行cell的刪除、增長、移動的操做 3051    1.2 如何實現數據的編輯(刪除、增長) 3052  實現步驟: 3053  a。啓動表格的編輯模式:經過修改tableView的editing屬性便可 3054  b。回答 兩問一答 三個問題 3055  問1:哪些行能夠進入編輯模式 3056  問2:行處於何種編輯模式 3057  答1:點擊編輯按鈕後要作的響應 3058 
3059   1.3 實現數據刪除或增長時,必定是先改數據模型,而後再刷新界面 3060 例: 3061 
3062    1).啓用編輯模式兩種方法 3063 - (void)viewDidLoad 3064 { 3065  [super viewDidLoad]; 3066     self.title = @"聯繫人"; 3067    ****//建立啓用編輯按鈕的方式一 3068     //self.navigationItem.rightBarButtonItem = self.editButtonItem;
3069     
3070    ****//建立啓用編輯按鈕的方式二
3071 
3072    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"編輯" style:UIBarButtonItemStyleDone target:self action:@selector(tableBeginEditing)]; 3073 } 3074 
3075 -(void)tableBeginEditing{ 3076     //self.tableView.editing = YES; 3077     //啓動表格的編輯模式
3078     [self.tableView setEditing:!self.tableView.editing animated:YES]; 3079     //修改右側按鈕上的顯示文字
3080     if (self.tableView.editing) { 3081         [self.navigationItem.rightBarButtonItem setTitle:@"完成"]; 3082     }else { 3083         [self.navigationItem.rightBarButtonItem setTitle:@"編輯"]; 3084  } 3085     
3086 } 3087   2).利用啓用編輯模式進行刪除、添加 3088 MyTableViewController.h 3089 MyTableViewController.m 3090 #import "MyTableViewController.h"
3091 
3092 @interface MyTableViewController () 3093 @property(nonatomic,strong)NSMutableArray *names; 3094 
3095 @end
3096 
3097 @implementation MyTableViewController 3098 
3099 - (NSMutableArray *)names{ 3100     if (!_names) { 3101         _names = [@[@"張三",@"李四",@"王五",@"趙六"] mutableCopy]; 3102  } 3103     return _names; 3104 } 3105 
3106 
3107 
3108 - (void)viewDidLoad 3109 { 3110  [super viewDidLoad]; 3111     self.title = @"聯繫人"; 3112     //建立啓用編輯按鈕的方式一 3113     //self.navigationItem.rightBarButtonItem = self.editButtonItem; 3114     
3115     //建立啓用編輯按鈕的方式二
3116     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"編輯" style:UIBarButtonItemStyleDone target:self action:@selector(tableBeginEditing)]; 3117 } 3118 
3119 -(void)tableBeginEditing{ 3120     //self.tableView.editing = YES; 3121     //啓動表格的編輯模式
3122     [self.tableView setEditing:!self.tableView.editing animated:YES]; 3123     //修改右側按鈕上的顯示文字
3124     if (self.tableView.editing) { 3125         [self.navigationItem.rightBarButtonItem setTitle:@"完成"]; 3126     }else { 3127         [self.navigationItem.rightBarButtonItem setTitle:@"編輯"]; 3128  } 3129     
3130 } 3131 
3132 #pragma mark - Table view data source
3133 
3134 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3135 { 3136     return 1; 3137 } 3138 
3139 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3140 { 3141     return self.names.count; 3142 } 3143 
3144 
3145 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3146 { 3147     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 3148     if (cell == nil) { 3149         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 3150  } 3151     cell.textLabel.text = self.names[indexPath.row]; 3152     return cell; 3153 } 3154 
3155 #pragma mark - table editing
3156 
3157 //問1:該行是否能夠進入編輯模式
3158 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ 3159         return YES; 3160 } 3161 
3162 //問2:該行使用什麼編輯樣式
3163 -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 3164     if (indexPath.row == self.names.count-1){ 3165         return UITableViewCellEditingStyleInsert; 3166     }else{ 3167         return UITableViewCellEditingStyleDelete; 3168  } 3169 } 3170 
3171 //答1:肯定編輯動做後的響應
3172 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ 3173     //若是提交的編輯樣式是刪除動做時
3174     if (editingStyle == UITableViewCellEditingStyleDelete) { 刪除模式 3175         //1.根據選擇的行的位置,修改數據模型
3176  [self.names removeObjectAtIndex:indexPath.row]; 3177         //2.刷新tableView
3178  [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 3179     }else if(editingStyle == UITableViewCellEditingStyleInsert){ 添加模式 3180         //1.修改數據模型
3181         [self.names addObject:@"test"]; 3182         //2.刷新tableView
3183         NSIndexPath *newPath = [NSIndexPath indexPathForRow:self.names.count-1 inSection:0]; 3184  [self.tableView insertRowsAtIndexPaths:@[newPath] withRowAnimation:UITableViewRowAnimationRight]; 3185  } 3186 } 3187 @end
3188     1.4 實現數據的移動 3189 //移動 3190 //一問
3191 -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{ 3192     return YES; 3193 } 3194 //一答
3195 -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{ 3196     //創建模型 3197     //獲取要移動的數據對象
3198     NSString* str=[self.names objectAtIndex:sourceIndexPath.row]; 3199     //將數據從數組中移除
3200  [self.names removeObjectAtIndex:sourceIndexPath.row]; 3201     //按照新的座標位置,將對象在插入回數組中
3202  [self.names insertObject:str atIndex:destinationIndexPath.row]; 3203 } 3204 
3205 8. 單元格的contentView內容視圖 3206  UITableViewCell繼承自UIView,其中又包含了左右兩個區域,其中左側用於顯示內容的區域叫作內容視圖,想訪問這個區域,能夠經過cell.contentView屬性便可 3207  a)系統爲內容視圖提供了默認的三個控件 3208  .textLabel 3209  .detailTextLabel 3210  .imageView 3211  b)能夠自定義內容視圖 3212  [cell.contentView addSubView:xxx] 3213 MyTableViewController.h 3214 MyTableViewController.m 3215 #import "MyTableViewController.h"
3216 
3217 @interface MyTableViewController () 3218 
3219 @property(nonatomic,strong)NSArray *citys; 3220 
3221 @end
3222 
3223 @implementation MyTableViewController 3224 
3225 - (NSArray *)citys{ 3226     if (!_citys) { 3227         _citys = @[@"北京",@"上海",@"廣州",@"深圳",@"杭州",@"蘇州",@"廈門",@"天津",@"重慶",@"呼和浩特",@"鄭州",@"烏魯木齊",@"拉薩",@"xx",@"yy",@"zz",@"mm",@"nn",@"qq",@"aa",]; 3228  } 3229     return _citys; 3230 } 3231 
3232 
3233 
3234 - (void)viewDidLoad 3235 { 3236  [super viewDidLoad]; 3237 } 3238 
3239 
3240 #pragma mark - Table view data source
3241 
3242 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3243 { 3244     return 1; 3245 } 3246 
3247 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3248 { 3249     return self.citys.count; 3250 } 3251 
3252 
3253 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3254 { 3255     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" ]; 3256     
3257     UILabel *label = nil; 3258     //通過一些步驟,label指向一個對象
3259     if (cell == nil) { 3260         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 3261         label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 60)]; 3262         label.font = [UIFont systemFontOfSize:22]; 3263         label.shadowColor = [UIColor redColor]; 3264         label.shadowOffset = CGSizeMake(2, 2); 3265         label.textAlignment = NSTextAlignmentCenter; 3266         //爲label添加一個容器內的對象標識
3267         label.tag = 1; 3268  [cell.contentView addSubview:label]; 3269     }else{ 3270         //獲取cell中已經添加了的那個label
3271         label = (UILabel *)[cell.contentView viewWithTag:1]; 3272  } 3273     label.text = self.citys[indexPath.row]; 3274     return cell; 3275 } 3276 
3277 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 3278     return 60; 3279 } 3280 
3281 @end
3282 
3283 9.單元格的accessoryView(輔助視圖) 3284 
3285  a)使用系統提供的輔助視圖樣式 3286  cell.accessoryType 3287  UITableViewCellAccessoryCheckmark:對勾 3288  UITableViewCellAccessoryDisclosureIndicator:大於號 3289  UITableViewCellAccessoryDetailButton:圓圈i 3290                 UITableViewCellAccessoryDetailDisclosureButton:圓圈i+大於號 3291  注意:包含detail按鈕時,cell能夠有兩種不一樣的單擊事件的響應。 3292  點擊圓圈i部分:響應accessoryButtonTapped:方法 3293  點擊圓圈i之外的部分:響應didSelectRowAtIndexPath: 3294   如:  cell.accessoryType = UITableViewCellAccessoryDetailButton; 3295 
3296  b)自定義輔助視圖 3297                      cell.accessoryView = [UIButton] 3298              如:cell.accessoryView = [[UISwitch alloc]init]; 3299 MyTableViewController.h 3300 MyTableViewController.m 3301 #import "MyTableViewController.h"
3302 
3303 @interface MyTableViewController () 3304 
3305 @end
3306 
3307 @implementation MyTableViewController 3308 
3309 - (void)viewDidLoad 3310 { 3311  [super viewDidLoad]; 3312 } 3313 #pragma mark - Table view data source
3314 
3315 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3316 { 3317     return 1; 3318 } 3319 
3320 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3321 { 3322     return 5; 3323 } 3324 
3325 static NSString *cellIdentifier = @"cell"; 3326 
3327 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3328 { 3329     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 3330     if (cell==nil) { 3331         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 3332  } 3333     if (indexPath.row == 2) { 3334         //系統定義的輔助視圖樣式
3335         cell.accessoryType = UITableViewCellAccessoryDetailButton; 3336         //自定義輔助視圖樣式
3337     }else if (indexPath.row == 3) { 3338         cell.accessoryView = [[UISwitch alloc]init]; 3339     }else if(indexPath.row == 1){ 3340         UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; 3341         [button setTitle:@"驗證碼" forState:UIControlStateNormal]; 3342         button.frame = CGRectMake(0, 0, 100, 40); 3343         cell.accessoryView = button; 3344  } 3345     cell.textLabel.text = @"Hello World"; 3346     return cell; 3347 } 3348 
3349 //一響應
3350 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 3351     NSLog(@"didSelectRowAtIndexPath"); 3352 } 3353 
3354 //響應用戶點擊圓圈i (Detail按鈕)
3355 -(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{ 3356     NSLog(@"...."); 3357 } 3358 
3359 @end
3360 10. 自定義單元格 3361     1.預備: 3362  根據要顯示的結果,分析底層的數據模型,建立模型類,cell類是模型類的一種顯示外觀 3363     2.實現步驟: 3364  step1:編寫一個類,繼承自UITableViewCell 3365  勾選xib 3366                //step2:建立能夠進行界面設置的xib文件,設計界面 3367                //step3:將xib文件與本身編寫的Cell類關聯起來
3368  step4:將xib中設計的各個可被修改的控件進行連線,且要變成公開的屬性 3369  step5:建立表格,回答第三問時,再也不建立UITableViewCell的實例,而是建立咱們本身編寫的cell類的實例,返回便可。 3370 News.h 3371 #import <Foundation/Foundation.h>
3372 
3373 @interface News : NSObject 3374 
3375 @property(nonatomic,strong)NSString *title; 3376 @property(nonatomic,strong)NSString *newsImageName; 3377 @property(nonatomic)NSUInteger commentNumber; 3378 
3379 -(instancetype)initWithTitle:(NSString *)title andImageName:(NSString *)imageName andCommentNumber:(NSUInteger)number; 3380 +(NSArray *)demoData; 3381 
3382 @end
3383 
3384 News.m 3385 #import "News.h"
3386 
3387 @implementation News 3388 
3389 -(instancetype)initWithTitle:(NSString *)title andImageName:(NSString *)imageName andCommentNumber:(NSUInteger)number{ 3390     self = [super init]; 3391     if (self) { 3392         self.title = title; 3393         self.newsImageName = imageName; 3394         self.commentNumber = number; 3395  } 3396     return self; 3397 } 3398 
3399 + (NSArray *)demoData{ 3400     News *n1 = [[News alloc]initWithTitle:@"xxx" andImageName:@"icon40.png" andCommentNumber:200]; 3401     News *n2 = [[News alloc]initWithTitle:@"yyyyyyy" andImageName:@"icon40.png" andCommentNumber:100]; 3402     News *n3 = [[News alloc]initWithTitle:@"zzzzzzz" andImageName:@"icon40.png" andCommentNumber:20]; 3403     News *n4 = [[News alloc]initWithTitle:@"mmmmmm" andImageName:@"icon40.png" andCommentNumber:0]; 3404     return @[n1,n2,n3,n4]; 3405 } 3406 @end
3407 
3408 NewsCell.h 3409 #import <UIKit/UIKit.h>
3410 
3411 @interface NewsCell : UITableViewCell //繼承自
3412 
3413 @property (weak, nonatomic) IBOutlet UIImageView *newsImageView; 3414 @property (weak, nonatomic) IBOutlet UILabel *title; 3415 @property (weak, nonatomic) IBOutlet UILabel *commentNumberLabel; 3416 @end
3417 NewsCell.m 3418 #import "NewsCell.h"
3419 
3420 @implementation NewsCell 3421 
3422 @end
3423 NewsTableViewController.h 3424 #import <UIKit/UIKit.h>
3425 
3426 @interface NewsTableViewController : UITableViewController 3427 @property(nonatomic,strong)NSArray *allNews; 3428 @end
3429 NewsTableViewController.m 3430 #import "NewsTableViewController.h"
3431 #import "News.h"
3432 #import "NewsCell.h"
3433 
3434 @interface NewsTableViewController () 3435 @end
3436 
3437 @implementation NewsTableViewController 3438 
3439 static NSString *cellIdentifier = @"cell"; 3440 
3441 - (void)viewDidLoad 3442 { 3443  [super viewDidLoad]; 3444     //註冊NewsCell類型,重用時由系統建立指定的類型 3445     //因爲自定義的cell類帶有xib文件 3446     //因此註冊時使用nib方法,說明,若是系統 3447     //幫助建立cell對象,則根據指定的xib文件來建立
3448     [self.tableView registerNib:[UINib nibWithNibName:@"NewsCell" bundle:nil] forCellReuseIdentifier:cellIdentifier]; 3449 } 3450 
3451 
3452 #pragma mark - Table view data source
3453 
3454 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3455 { 3456     return 1; 3457 } 3458 
3459 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3460 { 3461     return self.allNews.count; 3462 } 3463 
3464 
3465 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3466 { 3467     NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 3468     //按下標找到新聞對象
3469     News *news = self.allNews[indexPath.row]; 3470     cell.title.text = news.title; 3471     cell.newsImageView.image = [UIImage imageNamed:news.newsImageName]; 3472     cell.commentNumberLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber]; 3473     return cell; 3474 } 3475 //設置行高
3476 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 3477     return 60; 3478     
3479 } 3480 
3481 @end
3482             
3483 做業: 3484 見下發的資源包 3485   3486 
3487 
3488 1.qq音樂的配置界面 3489 MyTableViewController.h 3490 MyTableViewController.m 3491 #import "MyTableViewController.h"
3492 
3493 @interface MyTableViewController () 3494 
3495 @end
3496 
3497 @implementation MyTableViewController 3498 
3499 - (void)viewDidLoad 3500 { 3501  [super viewDidLoad]; 3502     
3503     self.title=@"更多"; 3504     
3505     UIView* headeView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 70)]; 3506     
3507     UILabel* label1=[[UILabel alloc]initWithFrame:CGRectMake(15, 40, 80, 30)]; 3508     label1.text=@"關注 3"; 3509     
3510     UILabel* label2=[[UILabel alloc]initWithFrame:CGRectMake(130, 40, 160, 30)]; 3511     label2.text=@"粉絲 0"; 3512     
3513     UILabel* label3=[[UILabel alloc]initWithFrame:CGRectMake(240, 40, 240, 30)]; 3514     label3.text=@"動態 0"; 3515     
3516     UILabel* label4=[[UILabel alloc]initWithFrame:CGRectMake(240, 20, 240, 20)]; 3517     label4.text=@"個人綠鑽"; 3518     label4.textColor=[UIColor greenColor]; 3519 
3520  [headeView addSubview:label1]; 3521  [headeView addSubview:label2]; 3522  [headeView addSubview:label3]; 3523  [headeView addSubview:label4]; 3524     
3525     UILabel* label5=[[UILabel alloc]initWithFrame:CGRectMake(60, 10, 90, 30)]; 3526     label5.text=@"傻丫頭"; 3527  [headeView addSubview:label5]; 3528     //照片
3529     UIImage* image=[UIImage imageNamed:@"header.png"]; 3530     UIImageView* imageView=[[UIImageView alloc]initWithImage:image]; 3531     imageView.frame=CGRectMake(10, 0, 40, 40); 3532  [headeView addSubview:imageView]; 3533     imageView.layer.cornerRadius=20; 3534     imageView.layer.masksToBounds=YES; 3535     
3536     self.tableView.tableHeaderView=headeView; 3537     
3538 } 3539 
3540 
3541 #pragma mark - Table view data source
3542 
3543 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3544 { 3545 
3546     return 3; 3547 } 3548 
3549 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3550 { 3551     if (section==0) { 3552         return 4; 3553     }else if (section==1){ 3554         return 3; 3555     }else{ 3556         return 1; 3557  } 3558 } 3559 
3560 /**/
3561 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3562 { 3563     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 3564     if (cell==nil) { 3565         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 3566  } 3567     cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 3568     
3569     if (indexPath.section==0) { 3570         if (indexPath.row==0) { 3571             cell.textLabel.text=@"個人綠鑽"; 3572         }else if (indexPath.row==1){ 3573             cell.textLabel.text=@"免流量服務"; 3574             cell.detailTextLabel.text=@"在線聽歌免流量費"; 3575         }else if (indexPath.row==2){ 3576             cell.textLabel.text=@"QPlay與車載互聯"; 3577             cell.detailTextLabel.text=@"開啓"; 3578         }else{ 3579             cell.textLabel.text=@"笛音傳歌"; 3580             cell.detailTextLabel.text=@"聲波傳送,一觸即發"; 3581  } 3582     }else if (indexPath.section==1){ 3583         if (indexPath.row==0) { 3584             cell.textLabel.text=@"設置"; 3585         }else if (indexPath.row==1){ 3586             cell.textLabel.text=@"定時關閉"; 3587             //設置輔視圖
3588             cell.accessoryView=[[UISwitch alloc]init]; 3589         }else if (indexPath.row==2){ 3590             cell.textLabel.text=@"關於QQ音樂"; 3591  } 3592     }else{ 3593         cell.textLabel.text=@"退出登陸"; 3594         cell.textLabel.textColor=[UIColor redColor]; 3595        // cell.textLabel.textAlignment=NSTextAlignmentCenter;
3596  } 3597     
3598     return cell; 3599 } 3600 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 3601     return 40; 3602 } 3603 
3604 -(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ 3605     
3606         return @" "; 3607     
3608 } 3609 
3610 
3611 2.新聞客戶端的首頁,新聞展現 3612 News.h 3613 #import <Foundation/Foundation.h>
3614 
3615 @interface News : NSObject 3616 
3617 @property(nonatomic,strong) NSString *title; 3618 @property(nonatomic,strong) NSString *newsImageName; 3619 @property(nonatomic) NSUInteger commentNumber; 3620 
3621 -(instancetype)initWithTitle:(NSString*)title 3622         andImageName:(NSString*)imageName 3623  andCommentNumber:(NSUInteger)commentNumber; 3624 
3625 +(NSArray *)demoData; 3626 
3627 @end
3628 News.m 3629 #import "News.h"
3630 
3631 @implementation News 3632 
3633 -(instancetype)initWithTitle:(NSString*)title 3634         andImageName:(NSString*)imageName 3635  andCommentNumber:(NSUInteger)commentNumber{ 3636     self = [super init]; 3637     if (self) { 3638         self.title = title; 3639         self.newsImageName = imageName; 3640         self.commentNumber = commentNumber; 3641  } 3642     return self; 3643     
3644 } 3645 
3646 + (NSArray *)demoData{ 3647     News *n1 = [[News alloc]initWithTitle:@"聯通被曝高危漏洞 或致用戶通話記錄等信息泄露" andImageName:@"n1.png" andCommentNumber:186]; 3648     News *n2 = [[News alloc]initWithTitle:@"CES2015回顧:民用無人機來襲 中國公司佔主導" andImageName:@"n2.png" andCommentNumber:17]; 3649     News *n3 = [[News alloc]initWithTitle:@"中企征戰CES:難尋顛覆性產品 未打通海外品牌渠道" andImageName:@"n3.png" andCommentNumber:17]; 3650     News *n4 = [[News alloc]initWithTitle:@"老話重提:「專車」是不是黑車?被查合不合法" andImageName:@"n4.png" andCommentNumber:178]; 3651     News *n5 = [[News alloc]initWithTitle:@"馬雲告誡員工千萬別碰京東:京東將會成悲劇" andImageName:@"n5.png" andCommentNumber:4374]; 3652     News *n6 = [[News alloc]initWithTitle:@"三星Q4營業利潤47億美圓超預期:內存芯片需求利好" andImageName:@"n6.png" andCommentNumber:6]; 3653     News *n7 = [[News alloc]initWithTitle:@"索尼宣佈PS4國行版延期上市 或因被舉報不鎖區" andImageName:@"n7.png" andCommentNumber:0]; 3654     News *n8 = [[News alloc]initWithTitle:@"微衆銀行開業前夕推「信用付」臨時核心系統過分" andImageName:@"n8.png" andCommentNumber:4]; 3655     
3656     return @[n1,n2,n3,n4,n5,n6,n7,n8]; 3657 } 3658 
3659 @end
3660 MyCell.xib 3661 3662 MyCell.h 3663 #import <UIKit/UIKit.h>
3664 
3665 @interface MyCell : UITableViewCell 3666 @property (weak, nonatomic) IBOutlet UIImageView *newsImageView; 與上圖連線 3667 @property (weak, nonatomic) IBOutlet UILabel *titleLabel; 3668 @property (weak, nonatomic) IBOutlet UILabel *commentNumberLabel; 3669 
3670 @end
3671 
3672 MyCell.m 3673 NewsViewController.h 3674 #import <UIKit/UIKit.h>
3675 
3676 @interface NewsViewController : UITableViewController 3677 @property(nonatomic,strong)NSArray *allNews; 3678 @end
3679 NewsViewController.m 3680 #import "NewsViewController.h"
3681 #import "News.h"
3682 #import "MyCell.h"
3683 
3684 @interface NewsViewController ()<UIScrollViewDelegate>
3685 
3686 @property(nonatomic,strong) UIScrollView *scrollView; 3687 @property(nonatomic,strong) NSArray *labels;; 3688 @end
3689 
3690 @implementation NewsViewController 3691 
3692 static NSString *cellIdentifier = @"cell"; 3693 
3694 -(NSArray*)allNews{ 3695     if (!_allNews) { 3696         _allNews=[News demoData]; 3697  } 3698     return _allNews; 3699 } 3700 
3701 
3702 - (void)viewDidLoad 3703 { 3704  [super viewDidLoad]; 3705 
3706     [self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:cellIdentifier]; 3707     
3708     
3709     
3710     self.scrollView=[[UIScrollView alloc]init]; 3711     self.scrollView.frame=CGRectMake(0, 0, self.view.frame.size.width, 30); 3712     
3713     self.scrollView.contentSize=CGSizeMake(610, 30); 3714     
3715      self.scrollView.showsHorizontalScrollIndicator=NO; 3716     
3717     self.scrollView.delegate=self; 3718     
3719     
3720     UILabel *titleLabel1=[[UILabel alloc]initWithFrame:CGRectMake(55, 00,100, 30)]; 3721     titleLabel1.text=@"體育"; 3722     UILabel *titleLabel2=[[UILabel alloc]initWithFrame:CGRectMake(155, 00, 100, 30)]; 3723     titleLabel2.text=@"非新聞"; 3724     UILabel *titleLabel3=[[UILabel alloc]initWithFrame:CGRectMake(255, 00, 100, 30)]; 3725     titleLabel3.text=@"科技"; 3726     UILabel *titleLabel4=[[UILabel alloc]initWithFrame:CGRectMake(355, 00, 100, 30)]; 3727     titleLabel4.text=@"軍事"; 3728     UILabel *titleLabel5=[[UILabel alloc]initWithFrame:CGRectMake(455, 00, 100, 30)]; 3729     titleLabel5.text=@"歷史"; 3730     
3731     self.labels=@[titleLabel1,titleLabel2,titleLabel3,titleLabel4,titleLabel5]; 3732     
3733     
3734     for (UILabel *label in self.labels) { 3735         label.textAlignment=NSTextAlignmentCenter; 3736  [self.scrollView addSubview:label]; 3737  } 3738     
3739     
3740     self.scrollView.bounces=NO; 3741     
3742     self.navigationItem.titleView=self.scrollView; 3743     
3744     self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil]; 3745     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:nil]; 3746     
3747     
3748     
3749     UIView *tableHeader=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)]; 3750     
3751     
3752     UIImageView *headerView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)]; 3753     headerView.image=[UIImage imageNamed:@"header.png"]; 3754     
3755  [tableHeader addSubview:headerView]; 3756     
3757     self.tableView.tableHeaderView=tableHeader; 3758     
3759     self.tableView.showsVerticalScrollIndicator=NO; 3760 } 3761 
3762 
3763 #pragma mark - Table view data source
3764 
3765 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3766 { 3767     return 1; 3768 } 3769 
3770 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3771 { 3772 
3773     return self.allNews.count; 3774 } 3775 
3776 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3777 { 3778     MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 3779     News *news = self.allNews[indexPath.row]; 3780     
3781     cell.titleLabel.text=news.title; 3782     cell.newsImageView.image = [UIImage imageNamed:news.newsImageName]; 3783     cell.commentNumberLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber]; 3784     
3785     
3786     return cell; 3787 } 3788 
3789 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 3790     return 100; 3791     
3792 } 3793 
3794 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 3795     CGPoint offSet=self.scrollView.contentOffset; 3796     
3797     for (int i=0; i<self.labels.count; i++) { 3798         if (i==(int)offSet.x/80) { 3799             UILabel* label=self.labels[i]; 3800  [label setTextColor:[UIColor redColor]]; 3801         } else { 3802             UILabel* label=self.labels[i]; 3803  [label setTextColor:[UIColor blackColor]]; 3804  } 3805  } 3806     
3807  [self.navigationItem.titleView setNeedsDisplay]; 3808     
3809     
3810 } 3811 
3812 做業: 3813 1.照片查看器 3814  在一個TableView中列出全部照片的縮小圖、照片名稱和拍攝的位置。當用戶點擊某一行時,推出一個vc,在此vc中顯示大的圖片,大的圖片容許縮放。 3815 Pictures.h 3816 #import <Foundation/Foundation.h>
3817 
3818 @interface Pictures : NSObject 3819 @property(nonatomic,strong)NSString *name; 3820 -(instancetype)initWithName:(NSString *)name; 3821 
3822 +(NSArray *)DemoData; 3823 @end
3824 Pictures.m 3825 #import "Pictures.h"
3826 
3827 @implementation Pictures 3828 -(instancetype)initWithName:(NSString *)name 3829 { 3830     if (self = [super init]) { 3831         self.name = name; 3832  } 3833     return self; 3834 } 3835 +(NSArray *)DemoData 3836 { 3837     Pictures *p1 = [[Pictures alloc]initWithName:@"welcome1.PNG"]; 3838     Pictures *p2 = [[Pictures alloc]initWithName:@"welcome2.PNG"]; 3839     Pictures *p3 = [[Pictures alloc]initWithName:@"welcome3.PNG"]; 3840     Pictures *p4 = [[Pictures alloc]initWithName:@"welcome4.PNG"]; 3841     return @[p1,p2,p3,p4]; 3842     
3843     
3844 } 3845 @end
3846 MyTableViewController.h 3847 MyTableViewController.m 3848 #import "MyTableViewController.h"
3849 #import "DetailViewController.h"
3850 @interface MyTableViewController () 3851 @property(nonatomic,strong)NSArray *pictures; 3852 
3853 @end
3854 
3855 @implementation MyTableViewController 3856 
3857 -(NSArray *)pictures 3858 { 3859     if (!_pictures) { 3860         _pictures = [Pictures DemoData]; 3861         
3862  } 3863     return _pictures; 3864 } 3865 
3866 - (void)viewDidLoad 3867 { 3868  [super viewDidLoad]; 3869  } 3870 
3871 
3872 #pragma mark - Table view data source
3873 
3874 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 3875 { 3876     return 1; 3877 } 3878 
3879 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 3880 { 3881     return self.pictures.count; 3882 } 3883 
3884 
3885 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 3886 { 3887     UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 3888     
3889     cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 3890     if (cell == nil) { 3891         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 3892         
3893  } 3894     Pictures *picture = self.pictures[indexPath.row]; 3895     
3896     if (indexPath.row == 0) { 3897         cell.textLabel.text =picture.name; 3898         cell.detailTextLabel.text = @"achao"; 3899         cell.imageView.image = [UIImage imageNamed:picture.name]; 3900     }else if (indexPath.row == 1) 3901  { 3902         cell.textLabel.text =picture.name; 3903         cell.detailTextLabel.text = @"achao"; 3904         cell.imageView.image = [UIImage imageNamed:picture.name]; 3905         
3906     }else if (indexPath.row == 2) 3907  { 3908         cell.textLabel.text =picture.name; 3909         cell.detailTextLabel.text = @"achao"; 3910         cell.imageView.image = [UIImage imageNamed:picture.name]; 3911         
3912     }else if (indexPath.row == 3) 3913  { 3914         cell.textLabel.text =picture.name; 3915         cell.detailTextLabel.text = @"achao"; 3916         cell.imageView.image = [UIImage imageNamed:picture.name]; 3917         
3918  } 3919 
3920     return cell; 3921 } 3922 
3923 
3924 #pragma mark - Table view delegate
3925 
3926 // In a xib-based application, navigation from a table can be handled in -tableView:didSelectRowAtIndexPath:
3927 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 3928 { 3929     
3930     DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; 3931     
3932     // Pass the selected object to the new view controller.
3933     Pictures *picture = self.pictures[indexPath.row]; 3934     detailViewController.picture = picture; 3935     // Push the view controller.
3936  [self.navigationController pushViewController:detailViewController animated:YES]; 3937 } 3938 @end
3939 DetailViewController.h 3940 #import <UIKit/UIKit.h>
3941 #import "Pictures.h"
3942 @interface DetailViewController : UIViewController 3943 @property(nonatomic,strong)Pictures *picture; 3944 
3945 @end
3946 DetailViewController.m 3947 #import "DetailViewController.h"
3948 #import "Pictures.h"
3949 @interface DetailViewController ()<UIScrollViewDelegate>
3950 
3951 @property(nonatomic,strong)UIScrollView *scrollView; 3952 @property(nonatomic,strong)UIImageView *imageView; 3953 
3954 @end
3955 
3956 @implementation DetailViewController 3957 
3958 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 3959 { 3960     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 3961     if (self) { 3962         // Custom initialization
3963  } 3964     return self; 3965 } 3966 
3967 - (void)viewDidLoad 3968 { 3969  [super viewDidLoad]; 3970 } 3971 
3972 -(void)viewWillAppear:(BOOL)animated 3973 { 3974  [super viewWillAppear:animated]; 3975     NSString *name = self.picture.name; 3976     NSLog(@"->%@",name); 3977     UIImage *image= [UIImage imageNamed:name]; 3978     UIImageView *imageView = [[UIImageView alloc]initWithImage:image]; 3979     //imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
3980     imageView.contentMode = UIViewContentModeScaleAspectFit; 3981     self.imageView = imageView; 3982     
3983     UIScrollView *scrollView = [[UIScrollView alloc]init]; 3984     self.scrollView = scrollView; 3985     scrollView.contentSize = imageView.frame.size; 3986     scrollView.contentMode = UIViewContentModeScaleAspectFit; 3987     scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); 3988     scrollView.maximumZoomScale = 1; 3989     CGFloat xScale = scrollView.frame.size.width/imageView.frame.size.width; 3990     CGFloat yScale = scrollView.frame.size.height/imageView.frame.size.height; 3991     scrollView.minimumZoomScale = MIN(xScale, yScale); 3992     
3993     scrollView.delegate = self; 3994  [scrollView addSubview:imageView]; 3995  [self.view addSubview:scrollView]; 3996 } 3997 
3998 -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 3999 { 4000     return self.imageView; 4001 } 4002 AppDelegate.h 4003 AppDelegate.m 4004 #import "AppDelegate.h"
4005 #import "MyTableViewController.h"
4006 @implementation AppDelegate 4007 
4008 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4009 { 4010     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4011     MyTableViewController *myVC = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil]; 4012     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:myVC]; 4013     self.window.rootViewController = navi; 4014  [self.window makeKeyAndVisible]; 4015     return YES; 4016 } 4017 
4018 1.靜態表格 4019  行數不變的表格 4020         
4021  實現方式: 4022  方法一:代碼方式 4023 
4024                 特色:使用大量的if  else 進行界面的硬編碼 4025  注意:靜態表格中的數據依然是可變的 4026 User.h 4027 #import <Foundation/Foundation.h>
4028 
4029 @interface User : NSObject 4030 
4031 @property(nonatomic,strong)NSString *weChatNumber; 4032 @property(nonatomic,strong)NSString *qqNumber; 4033 @property(nonatomic,strong)NSString *phoneNumber; 4034 @property(nonatomic,strong)NSString *email; 4035 
4036 @end
4037 User.m 4038 4039 SafeViewController.h 4040 SafeViewController.m 4041 #import "SafeViewController.h"
4042 
4043 @interface SafeViewController () 4044 
4045 @end
4046 
4047 @implementation SafeViewController 4048 
4049 - (void)viewDidLoad 4050 { 4051  [super viewDidLoad]; 4052     self.title = @"帳號與安全"; 4053     //設置導航欄的背景色
4054     self.navigationController.navigationBar.barTintColor = [UIColor grayColor]; 4055 } 4056 
4057 #pragma mark - Table view data source
4058 
4059 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 4060 { 4061     return 2; 4062 } 4063 
4064 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 4065 { 4066     if (section == 0) { 4067         return 1; 4068     }else{ 4069         return 3; 4070  } 4071 } 4072 
4073 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 4074 { 4075     UITableViewCell *cell = nil; 4076     switch (indexPath.section) { 4077         case 0://分區0
4078             cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 4079             cell.textLabel.text = @"微信號"; 4080             cell.detailTextLabel.text = self.user.weChatNumber; 4081             break; 4082         case 1://分區1
4083             if (indexPath.row == 0) { 4084                 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 4085                 cell.textLabel.text = @"QQ號"; 4086                 cell.detailTextLabel.text = self.user.qqNumber; 4087                 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 4088             }else if(indexPath.row == 1){ 4089                 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 4090                 cell.textLabel.text = @"手機號"; 4091                 cell.detailTextLabel.text = self.user.phoneNumber; 4092                 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 4093                 
4094             }else{ 4095                 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 4096                 cell.textLabel.text = @"郵箱"; 4097                 cell.detailTextLabel.text = self.user.email; 4098                 cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 4099  } 4100             break; 4101         default: 4102             break; 4103  } 4104     
4105     return cell; 4106 } 4107 AppDelegate.h 4108 AppDelegate.m 4109 #import "AppDelegate.h"
4110 #import "SafeViewController.h"
4111 #import "User.h"
4112 
4113 @implementation AppDelegate 4114 
4115 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4116 { 4117     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4118     User *user = [[User alloc]init]; 4119     user.weChatNumber = @"chat-num"; 4120     user.qqNumber = @"1234567"; 4121     user.phoneNumber = @"18600xxxx"; 4122     user.email = @"tom@tarena.com.cn"; 4123     SafeViewController *vc = [[SafeViewController alloc]initWithNibName:@"SafeViewController" bundle:nil]; 4124     vc.user = user; 4125     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc]; 4126     self.window.rootViewController = navi; 4127  [self.window makeKeyAndVisible]; 4128     return YES; 4129 } 4130 結果: 4131 4132 
4133  方法二:xib方法 4134     
4135  實現思路:在xib中將靜態表格中的每一行都經過拖拽一個對象來進行設計,系統會自動建立xib中包含的全部的控件對象,可是,默認每個xib文件只能有一個根元素被控制器加載,其餘拖拽後並由系統建立了的對象,能夠經過將這個對象連線到控制器中成爲屬性再訪問。 4136  【Demo2_StaticTable_Xib】 4137 
4138 SettingViewController.h 4139 SettingViewController.m 4140 #import "SettingViewController.h"
4141 @interface SettingViewController () 4142 4143 @property (strong, nonatomic) IBOutlet UIView *headerView; 連線 4144 @property (strong, nonatomic) IBOutlet UITableViewCell *greenDimand; 4145 @property (strong, nonatomic) IBOutlet UITableViewCell *freeMode; 4146 @property (strong, nonatomic) IBOutlet UITableViewCell *settingClose; 4147 @property (strong, nonatomic) IBOutlet UITableViewCell *exit; 4148 
4149 @end
4150 
4151 @implementation SettingViewController 4152 
4153 - (void)viewDidLoad 4154 { 4155  [super viewDidLoad]; 4156     self.title = @"更多"; 4157     self.tableView.tableHeaderView = self.headerView; 4158 } 4159 
4160 #pragma mark - Table view data source
4161 
4162 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 4163 { 4164     return 3; 4165 } 4166 
4167 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 4168 { 4169     switch (section) { 4170         case 0: 4171             return 2; 4172         case 1: 4173             return 1; 4174         case 2: 4175             return 1; 4176         default: 4177             return 0; 4178  } 4179 } 4180 
4181 
4182 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 4183 { 4184     UITableViewCell *cell = nil; 4185     switch (indexPath.section) { 4186         case 0: 4187             if (indexPath.row == 0 ) { 4188                 //根據分區號和行號,cell指向不一樣的對象,而後返回
4189                 cell = self.greenDimand; 4190             }else{ 4191                 cell = self.freeMode; 4192  } 4193             break; 4194         case 1: 4195             cell = self.settingClose; 4196             break; 4197         case 2: 4198             cell = self.exit; 4199             break; 4200  } 4201     return cell; 4202 } 4203 
4204 2.動態表格 4205 數據行是不固定的 4206 核心理念:建立完TableView以後,設置tableView的dataSource和delegate對象,只要符合協議的對象均可以設置爲代理方法 4207  選擇一:讓當前控制器遵照協議,而後成爲tableView的代理 4208  選擇二:本身編寫類,遵照協議,而後建立類的對象,設置爲tableView的代理 4209 方法一: 4210 tableView.dataSource和tableView.delegate兩個代理交給兩個類處理,不用當前控制器處理。兩個類需遵照協議UITableViewDataSource和UITableViewDelegate,當前控制器需建立兩個類的實例化,才能將其成爲代理方 4211 ViewController.xib 4212 添加Table View控件,修改大小,連線代理, 4213 ViewController.h 控制器 4214 #import <UIKit/UIKit.h>
4215 
4216 @interface ViewController : UIViewController 4217 
4218 @end
4219 ViewController.m 4220 #import "ViewController.h"
4221 #import "TRTableDateSource.h"
4222 #import "TRTableDalegate.h"
4223 
4224 @interface ViewController () 4225 @property(nonatomic,strong)TRTableDateSource* tableDateSource; 4226 @property(nonatomic,strong)TRTableDalegate* tableDalegate; 4227 @end
4228 
4229 @implementation ViewController 4230 //重寫get方法
4231 -(TRTableDateSource *)tableDateSource{ 4232     if (!_tableDateSource) { 4233         _tableDateSource=[[TRTableDateSource alloc]init]; 4234  } 4235     return _tableDateSource; 4236 } 4237 
4238 -(TRTableDalegate *)tableDalegate{ 4239     if (!_tableDalegate) { 4240         _tableDalegate=[[TRTableDalegate alloc]init]; 4241  } 4242     return _tableDalegate; 4243 } 4244 
4245 //UITableView繼承UIScrollView
4246 - (void)viewDidLoad 4247 { 4248  [super viewDidLoad]; 4249     UITableView* tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain]; 4250     tableView.dataSource=self.tableDateSource; 4251     tableView.delegate=self.tableDalegate; 4252  [self.view addSubview:tableView]; 4253 } 4254 
4255 @end
4256 TRTableDateSource.h 4257 #import <Foundation/Foundation.h>
4258 
4259 @interface TRTableDateSource : NSObject<UITableViewDataSource>//遵照協議
4260 
4261 @end
4262 
4263 TRTableDateSource.m 4264 #import "TRTableDateSource.h" //數據源
4265 
4266 @implementation TRTableDateSource 4267 
4268 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 4269     return 1; 4270 } 4271 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 4272     return 10; 4273 } 4274 
4275 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 4276     UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"cell" ]; 4277     if (cell==nil) { 4278         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 4279         
4280  } 4281     cell.textLabel.text=@"hello"; 4282     return cell; 4283 } 4284 @end
4285 TRTableDalegate.h 4286 #import <Foundation/Foundation.h>
4287 
4288 @interface TRTableDalegate : NSObject<UITableViewDelegate>//遵照協議
4289 
4290 @end
4291 TRTableDalegate.m 4292 #import "TRTableDalegate.h"//代理響應
4293 
4294 @implementation TRTableDalegate 4295 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 4296     NSLog(@"..."); 4297 } 4298 
4299 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 4300     return 100; 4301 } 4302 @end
4303 AppDelegate.h 4304 AppDelegate.m 4305 #import "AppDelegate.h"
4306 #import "ViewController.h"
4307 
4308 @implementation AppDelegate 4309 
4310 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4311 { 4312     self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4313     ViewController* cV=[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil]; 4314     self.window.rootViewController=cV; 4315  [self.window makeKeyAndVisible]; 4316     return YES; 4317 } 4318 方法2: 4319  需求:在一個普通vc的視圖上有兩個tableView,上面的tableView從資源庫中拖拽,用於顯示5行Hello World;下面的tableView使用代碼建立,用於顯示7行Hello Kitty;當前控制器對象同時是這兩個tableView的dataSource和delegate 4320 TRViewController.h 4321 TRViewController.m 4322 #import "TRViewController.h"
4323 
4324 @interface TRViewController ()<UITableViewDataSource,UITableViewDelegate>
4325 @property(nonatomic,strong)UITableView* codeTableView;//手寫代碼
4326 
4327 @property (weak, nonatomic) IBOutlet UITableView *xibTableView;//經過xib建立,就能夠省了viewDidLoad中的4步
4328 @end
4329 
4330 @implementation TRViewController 4331 
4332 - (void)viewDidLoad 4333 { 4334  [super viewDidLoad]; 4335     self.codeTableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 220, self.view.frame.size.width, 250)]; 4336     self.codeTableView.dataSource=self; 4337     self.codeTableView.delegate=self; 4338  [self.view addSubview:self.codeTableView]; 4339 } 4340 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 4341     return 1; 4342 } 4343 
4344 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 4345     if (tableView==self.xibTableView) { 4346         return 5; 4347     }else{ 4348         return 7; 4349  } 4350 } 4351 
4352 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 4353     UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"cell"]; 4354     if (cell==nil) { 4355         if (tableView==self.xibTableView) { 4356             cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 4357         }else{ 4358             cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"]; 4359  } 4360         
4361  } 4362     
4363     if (tableView==self.xibTableView) { 4364         cell.textLabel.text=@"HelloWord"; 4365     }else{ 4366         cell.textLabel.text=@"HelloKitty"; 4367         cell.detailTextLabel.text=@"miao"; 4368  } 4369     return cell; 4370 } 4371 @end
4372 結果: 4373 4374 練習: 4375 展現地區名稱,層級未知,取決於數據模型 4376 北京 4377  東城 4378  西城 4379  朝陽 4380  潘家園 4381  鬆榆路 4382  建業苑 4383  一層 4384  六層 4385  達內 4386  第一教室 4387  第二教室 4388  達內對面 4389  麥當勞 4390  海淀 4391 上海 4392  徐匯 4393  靜安 4394 
4395 +AreaTableViewController 4396         +areas: Area( 元素類型:Area) 4397 
4398 
4399 +Area 4400         +name:NSString 4401         +subAreas:NSArray 4402                 +[Item]:Area 4403                         +name:NSString 4404                         +subAreas:NSArray 4405                                 +[Item]:Arear 4406  …… 4407 Area.h 4408 #import <Foundation/Foundation.h>
4409 
4410 @interface Area : NSObject 4411 
4412 @property(nonatomic,strong)NSString *name; 4413 @property(nonatomic,strong)NSArray *subAreas; 4414 
4415 -(instancetype)initWithName:(NSString *)name; 4416 
4417 +(Area *)demoData; 4418 
4419 @end
4420 Area.m 4421 #import "Area.h"
4422 
4423 @implementation Area 4424 
4425 - (instancetype)initWithName:(NSString *)name{ 4426     self = [super init]; 4427     if (self) { 4428         self.name = name; 4429  } 4430     return self; 4431 } 4432 
4433 + (Area *)demoData{ 4434     Area *a0 = [[Area alloc]initWithName:@"城市"]; 4435     Area *a1 = [[Area alloc]initWithName:@"北京"]; 4436     Area *a2 = [[Area alloc]initWithName:@"上海"]; 4437     Area *a11 = [[Area alloc]initWithName:@"東城"]; 4438     Area *a12 = [[Area alloc]initWithName:@"西城"]; 4439     Area *a13 = [[Area alloc]initWithName:@"朝陽"]; 4440     Area *a14 = [[Area alloc]initWithName:@"徐匯"]; 4441     Area *a15 = [[Area alloc]initWithName:@"靜安"]; 4442     Area *a21 = [[Area alloc]initWithName:@"潘家園"]; 4443     Area *a22 = [[Area alloc]initWithName:@"鬆榆路"]; 4444     Area *a23 = [[Area alloc]initWithName:@"麥當勞"]; 4445     Area *a31 = [[Area alloc]initWithName:@"建業苑"]; 4446     Area *a41 = [[Area alloc]initWithName:@"一樓"]; 4447     Area *a42 = [[Area alloc]initWithName:@"六樓"]; 4448     Area *a51 = [[Area alloc]initWithName:@"達內"]; 4449     Area *a61 = [[Area alloc]initWithName:@"第一教室"]; 4450     Area *a62= [[Area alloc]initWithName:@"第二教室"]; 4451                   
4452     a51.subAreas = @[a61,a62]; 4453     a42.subAreas = @[a51]; 4454     a31.subAreas=@[a41,a42]; 4455     a22.subAreas = @[a31]; 4456     a13.subAreas = @[a21,a22,a23]; 4457     a1.subAreas = @[a11,a12,a13]; 4458     a2.subAreas = @[a14,a15]; 4459     a0.subAreas = @[a1,a2]; 4460     
4461     return a0; 4462 } 4463 
4464 @end
4465 AreaTableViewController.h 4466 #import <UIKit/UIKit.h>
4467 #import "Area.h"
4468 
4469 @interface AreaTableViewController : UITableViewController 4470 //每個控制器實例對應的界面都是用來顯示 4471 //一個area的實例 4472 //將area顯示到表視圖中
4473 @property(nonatomic,strong)Area *area; 4474 @end
4475 AreaTableViewController.m 4476 #import "AreaTableViewController.h"
4477 
4478 @interface AreaTableViewController () 4479 
4480 @end
4481 
4482 @implementation AreaTableViewController 4483 
4484 - (void)viewDidLoad 4485 { 4486  [super viewDidLoad]; 4487     //1.area實例的name放在導航欄的標題位置
4488     self.title = self.area.name; 4489 } 4490 
4491 /*
4492  表格顯示的是:area中的全部子地區對象的名字 4493  */
4494 #pragma mark - Table view data source
4495 
4496 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 4497 { 4498     return 1; 4499 } 4500 
4501 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 4502 { 4503     return self.area.subAreas.count; 4504 } 4505 
4506 
4507 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 4508 { 4509     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 4510     if (cell == nil) { 4511         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 4512  } 4513     //每個單元格用於顯示area的一個子地區信息
4514     Area *subArea = self.area.subAreas[indexPath.row]; 4515     cell.textLabel.text = subArea.name; 4516     if (subArea.subAreas!=nil) { 4517         //若是有子地區,顯示大於號作提示
4518         cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 4519     }else{ 4520         //若是沒有子地區,修改行的默認選中樣式 4521         //在選中後不出現灰色的背景
4522         cell.selectionStyle = UITableViewCellSelectionStyleNone; 4523  } 4524     return cell; 4525 } 4526 
4527 //點擊某一行以後推出新的界面,推出的界面與當前界面顯示樣式相同的,只是數據不一樣 4528 //而已,選中一個節點,其實表明的選中依然是一個Area的實例,因此在推出新的界面時,將選中的Area實例 4529 //做爲參數傳過去,由推出的界面負責顯示
4530 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 4531     //獲取選中的節點對應的Area實例
4532     Area *subArea = self.area.subAreas[indexPath.row]; 4533     if (subArea.subAreas!=nil) { 4534         //建立新的控制器實例
4535         AreaTableViewController *tVC = [[AreaTableViewController alloc]initWithNibName:@"AreaTableViewController" bundle:nil]; 4536         tVC.area = subArea; 4537         //推出新的控制器
4538  [self.navigationController pushViewController:tVC animated:YES]; 4539  } 4540    
4541 } 4542 
4543 
4544 @end
4545 AppDelegate.h 4546 AppDelegate.m 4547 #import "AppDelegate.h"
4548 #import "Area.h"
4549 #import "AreaTableViewController.h"
4550 
4551 @implementation AppDelegate 4552 
4553 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4554 { 4555     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4556     AreaTableViewController *tvc = [[AreaTableViewController alloc]initWithNibName:@"AreaTableViewController" bundle:nil]; 4557     Area *area = [Area demoData]; 4558     tvc.area = area; 4559     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:tvc]; 4560     self.window.rootViewController = navi; 4561  [self.window makeKeyAndVisible]; 4562     
4563     return YES; 4564 } 4565 ========================================================================================================================
4566 知識點 4567 十3、UITabBarController標籤控制器 4568 
4569   1.是什麼? 4570  與navigationController很像,也是管理控制器的控制器。 4571  tabBarController沒有完整的界面外觀,靠管理其它的vc來完成界面的顯示。 4572  管理方式橫向並列方式的,navigation傾向於垂直深刻式的管理vc。 4573 
4574  1.如何使用? 4575  step1:將tabBarController管理的多個vc實例化出具體的對象 4576  step2:將多個vc存到tabBar控制器中 4577        1.1建立 4578 #import "AppDelegate.h"
4579 #import "AViewController.h"
4580 #import "BViewController.h"
4581 #import "CViewController.h"
4582 
4583 @implementation AppDelegate 4584 
4585 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4586 { 4587     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4588     AViewController *avc = [[AViewController alloc]initWithNibName:@"AViewController" bundle:nil]; 4589     BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 4590     CViewController *cvc = [[CViewController alloc]initWithNibName:@"CViewController" bundle:nil]; 4591     
4592     // 建立tabBar的實例
4593     UITabBarController *tabVC = [[UITabBarController alloc]init]; 4594     //設置顏色
4595     tabVC.tabBar.tintColor = [UIColor redColor]; 4596     //設置tabBar的代理
4597     tabVC.delegate = self; 4598     // 將多個vc放到tabBar中
4599     tabVC.viewControllers = @[avc,bvc,cvc]; 4600     self.window.rootViewController = tabVC; 4601  [self.window makeKeyAndVisible]; 4602     return YES; 4603 } 4604      1.2設置 4605         - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4606 { 4607     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4608     if (self) { 4609         //配置文字
4610         self.title = @"AVC"; 4611         //self.tabBarItem.title = @"AVC"; 4612         //配置圖片
4613         self.tabBarItem.image =[UIImage imageNamed:@"line_bell"]; 4614         self.tabBarItem.selectedImage = [UIImage imageNamed:@"full_bell"]; 4615         self.tabBarItem.badgeValue = @"2";//配置徽章
4616  } 4617     return self; 4618 } 4619 
4620 
4621  1. tabBar的配置 4622  .tabBarItem.title 文字 4623  .tabBarItem.image 不點擊時是 空心圖片 4624  .tabBarItem.selectedImage 點擊的時候是 實心圖片 4625  .tabBarItem.badgeValue 徽章 4626 
4627  tabBarController.tabBar.tintColor 顏色 4628 
4629  tabBarController.selectedIndex 可讀可寫的屬性,用於獲取或設置tabBar中激活的vc的下標 4630 
4631             2.響應用戶選中某vc事件: 4632             - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 4633 
4634 4.tabBarController與navigationController的配合 4635  原則: 4636  a。多引導性控制器共存時,tabBar是總體最外層的管理者,navigation被tabBar管理的一個分支控制器 4637  b。顯示第一屏時,tabBar能夠看見,在某一個具體 的vc中推出新vc時,tabBar處於隱藏狀態。只有回到頂級vc時,tabBar區域纔可見 4638  c。推出新vc時,隱藏底部各類bar的方法: 4639                 vc.hidesBottomBarWhenPushed = YES; 4640 
4641 例: 4642 AppDelegate.h 4643 #import <UIKit/UIKit.h>
4644 
4645 @interface AppDelegate : UIResponder <UIApplicationDelegate,UITabBarControllerDelegate> //遵照協議
4646 
4647 @property (strong, nonatomic) UIWindow *window; 4648 
4649 @end
4650 AppDelegate.m 4651 #import "AppDelegate.h"
4652 #import "AViewController.h"
4653 #import "BViewController.h"
4654 #import "CViewController.h"
4655 
4656 @implementation AppDelegate 4657 
4658 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{ 4659     
4660     NSInteger index = tabBarController.selectedIndex; 4661     NSLog(@"%d",index); 4662     //選中tab中的某一個項後觸發 4663     //viewController.tabBarItem.badgeValue = nil;
4664 } 4665 
4666 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 4667 { 4668     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 4669     AViewController *avc = [[AViewController alloc]initWithNibName:@"AViewController" bundle:nil]; 4670     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:avc]; 4671     
4672     BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil]; 4673     CViewController *cvc = [[CViewController alloc]initWithNibName:@"CViewController" bundle:nil]; 4674     // 建立tabBar的實例
4675     UITabBarController *tabVC = [[UITabBarController alloc]init]; 4676     //設置顏色
4677     tabVC.tabBar.tintColor = [UIColor redColor]; 4678     //設置tabBar的代理
4679     tabVC.delegate = self; 4680     // 將多個vc放到tabBar中
4681     tabVC.viewControllers = @[navi,bvc,cvc]; 4682     self.window.rootViewController = tabVC; 4683  [self.window makeKeyAndVisible]; 4684     return YES; 4685 } 4686 AViewController.h 4687 AViewController.m 4688 #import "AViewController.h"
4689 #import "OtherViewController.h"
4690 
4691 @interface AViewController () 4692 
4693 @end
4694 
4695 @implementation AViewController 4696 
4697 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4698 { 4699     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4700     if (self) { 4701         //配置文字
4702         self.title = @"AVC"; 4703         //self.tabBarItem.title = @"AVC"; 4704         //配置圖片
4705         self.tabBarItem.image =[UIImage imageNamed:@"line_bell"]; 4706         self.tabBarItem.selectedImage = [UIImage imageNamed:@"full_bell"]; 4707         self.tabBarItem.badgeValue = @"2";//配置徽章
4708  } 4709     return self; 4710 } 4711 
4712 - (void)viewDidLoad 4713 { 4714  [super viewDidLoad]; 4715     //配置導航的右側按鈕
4716     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(gotoOther:)]; 4717 } 4718 
4719 -(void)gotoOther:(UIBarButtonItem *)barButton{ 4720     //推出otherVC
4721     OtherViewController *ovc = [[OtherViewController alloc]initWithNibName:@"OtherViewController" bundle:nil]; 4722     //推出時,隱藏底部區域
4723     ovc.hidesBottomBarWhenPushed = YES; 4724     
4725  [self.navigationController pushViewController:ovc animated:YES]; 4726 } 4727 
4728 
4729 //點擊按鈕,跳到第三個界面
4730 - (IBAction)gotoCVC:(id)sender { 4731     self.tabBarController.selectedIndex = 2; 連線按鈕 4732 } 4733 
4734 @end
4735 
4736 想要哪一個界面顯示,就配置哪一個界面 4737 BViewController.h 4738 BViewController.m 4739 
4740 CViewController.h 4741 CViewController.m 4742 
4743 OtherViewController.h 4744 OtherViewController.m 4745 4746 知識點 4747 十4、其它控件 4748 
4749 1. SegmentedControl 分段控件 4750  SegmentedControl 分段控件 4751  屬性: 4752  selectedSegmentIndex 選中的分段按鈕的下標 4753  事件: 4754  valueChanged事件 4755 SegViewController.h 4756 SegViewController.m 4757 #import "SegViewController.h"
4758 
4759 @interface SegViewController () 4760 
4761 @property(nonatomic,strong)NSArray *headerImageNames; 4762 
4763 @property (weak, nonatomic) IBOutlet UIImageView *headerImageView; 連線屬性以下圖 4764 @property (weak, nonatomic) IBOutlet UISegmentedControl *segmented; 4765 
4766 @end
4767 
4768 @implementation SegViewController 4769 
4770 - (NSArray *)headerImageNames{ 4771     if (!_headerImageNames) { 4772         _headerImageNames =@[@"Brad Cox.png",@"Dennis Ritchie.png",@"Ray.png"]; 4773  } 4774     return _headerImageNames; 4775 } 4776 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4777 { 4778     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4779     if (self) { 4780         self.title = @"分段"; 4781         self.tabBarItem.image = [UIImage imageNamed:@"line_ball"]; 4782  } 4783     return self; 4784 } 4785 
4786 - (void)viewDidLoad 4787 { 4788  [super viewDidLoad]; 4789     self.navigationItem.titleView = self.segmented; 4790 } 4791 
4792 - (void)viewWillAppear:(BOOL)animated{ 4793  [super viewWillAppear:animated]; 4794  [self changeHeaderImage:self.segmented]; 4795 } 4796 
4797 - (IBAction)changeHeaderImage:(UISegmentedControl *)sender { 4798     //選擇的segmented中的按鈕的索引
4799     NSInteger index = sender.selectedSegmentIndex; 4800     self.headerImageView.image = [UIImage imageNamed:self.headerImageNames[index]]; 4801 } 4802 
4803 @end
4804  4805 
4806 2. Activity Indicator 活動指示器 4807 IndicatorViewController.h 4808 IndicatorViewController.m 4809 #import "IndicatorViewController.h"
4810 
4811 @interface IndicatorViewController () 4812 @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *indicator; 4813 @property (weak, nonatomic) IBOutlet UIProgressView *progressView; 4814 
4815 @end
4816 
4817 @implementation IndicatorViewController 4818 
4819 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4820 { 4821     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4822     if (self) { 4823         self.title=@"指示器"; 4824         self.tabBarItem.image = [UIImage imageNamed:@"line_cart"]; 4825  } 4826     return self; 4827 } 4828 
4829 - (void)viewDidLoad 4830 { 4831  [super viewDidLoad]; 4832     self.progressView.progress = 0; 4833 } 4834 
4835 - (IBAction)changeIndicator:(UIButton *)sender { 4836     //根據指示器的狀態來決定是轉動仍是中止轉動
4837     if (self.indicator.isAnimating) { 4838  [self.indicator stopAnimating]; 4839     }else{ 4840  [self.indicator startAnimating]; 4841  } 4842 } 4843 - (IBAction)beginDownload:(id)sender { 4844     //啓動一個計時器,每隔一段時間自動的執行動做 4845     //使用sheduledTime。。。方法建立的計時器 4846     //不須要啓動已經開始工做
4847     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeProgress:) userInfo:nil repeats:YES]; 4848     
4849 } 4850 
4851 -(void)changeProgress:(NSTimer *)timer{ 4852     //修改進度條的進度
4853     self.progressView.progress+=0.1; 4854 
4855     if (self.progressView.progress >= 0.5) { 範圍判斷比較好 4856         // 中止計時器
4857  [timer invalidate]; 4858  } 4859  } 4860 
4861 @end
4862 
4863 4864 3. Progress View 進度條 4865 
4866 4. Date Picker 4867 DateViewController.h 4868 DateViewController.m 4869 #import "DateViewController.h"
4870 
4871 @interface DateViewController () 4872 @property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;連線 4873 @property (weak, nonatomic) IBOutlet UILabel *dateLabel; 4874 
4875 @end
4876 
4877 @implementation DateViewController 4878 
4879 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4880 { 4881     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4882     if (self) { 4883         self.title = @"時間"; 4884         self.tabBarItem.image = [UIImage imageNamed:@"line_paint"]; 4885  } 4886     return self; 4887 } 4888 
4889 - (void)viewDidLoad 4890 { 4891  [super viewDidLoad]; 4892     // Do any additional setup after loading the view from its nib.
4893 } 4894 
4895 - (IBAction)showDate:(UIButton *)sender { 4896     NSDate *date = self.datePicker.date; 4897     NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 4898     formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 4899     NSString *dateString = [formatter stringFromDate:date]; 4900     self.dateLabel.text = dateString; 4901 } 4902 
4903 @end
4904   4905 5. Picker View 4906 重要屬性: 4907  date 獲取選中後的時間對象 4908  通常須要轉換成指定的格式: 4909             NSDate *date = self.datePicker.date; 4910         NSDateFormatter *formatter = [[NSDateFormatter alloc]init]; 4911         formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 4912         NSString *dateString = [formatter stringFromDate:date]; 4913 
4914 PickerViewController.h 4915 PickerViewController.m 4916 #import "PickerViewController.h"
4917 
4918 @interface PickerViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
4919 @property(nonatomic,strong)NSArray *fromCity; 4920 @property(nonatomic,strong)NSArray *toCity; 4921 
4922 @end
4923 
4924 @implementation PickerViewController 4925 
4926 - (NSArray *)fromCity{ 4927     if (!_fromCity) { 4928         _fromCity = @[@"北京",@"上海",@"廣州",@"深圳"]; 4929  } 4930     return _fromCity; 4931 } 4932 
4933 - (NSArray *)toCity{ 4934     if (!_toCity) { 4935         _toCity = @[@"杭州",@"蘇州"]; 4936  } 4937     return _toCity; 4938 } 4939 
4940 
4941 
4942 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 4943 { 4944     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 4945     if (self) { 4946         self.title = @"picker view"; 4947         self.tabBarItem.image = [UIImage imageNamed:@"line_map"]; 4948  } 4949     return self; 4950 } 4951 
4952 - (void)viewDidLoad 4953 { 4954  [super viewDidLoad]; 4955    
4956 } 4957 
4958 #pragma mark - UIPickerView DataSource
4959 //控件有幾列
4960 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 4961     return 2; 4962 } 4963 
4964 //列中有幾行
4965 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 4966     if (component == 0) { 4967         return self.fromCity.count; 4968     }else{ 4969         return self.toCity.count; 4970  } 4971 } 4972 
4973 #pragma mark - UIPickerView Delegate
4974 
4975 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 4976     if (component == 0) { 4977         return self.fromCity[row]; 4978     }else{ 4979         return self.toCity[row]; 4980  } 4981     
4982 } 4983 
4984 @end
4985 4986 
4987 
4988 RelationPickerViewController.h 4989 RelationPickerViewController.m 4990 #import "RelationPickerViewController.h"
4991 
4992 @interface RelationPickerViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
4993 @property(nonatomic,strong)NSDictionary *dictionaryCitys; 4994 @property(nonatomic,strong)NSArray *allCityName; 4995 @property(nonatomic,strong)NSArray *allAreaName; 4996 @end
4997 
4998 @implementation RelationPickerViewController 4999 
5000 - (NSDictionary *)dictionaryCitys{ 5001     if (!_dictionaryCitys) { 5002         _dictionaryCitys = @{ 5003            @"北京":@[@"東城",@"西城",@"海淀"], 5004            @"上海":@[@"徐匯",@"靜安",@"浦東"], 5005            @"廣州":@[@"白雲",@"越秀",@"天河"] 5006  }; 5007  } 5008     return _dictionaryCitys; 5009 } 5010 
5011 - (NSArray *)allCityName{ 5012     if (!_allCityName) { 5013         _allCityName = self.dictionaryCitys.allKeys; 5014  } 5015     return _allCityName; 5016 } 5017 
5018 - (NSArray *)allAreaName{ 5019     if (!_allAreaName) { 5020         _allAreaName = [self.dictionaryCitys objectForKey:self.allCityName[0]]; 5021  } 5022     return _allAreaName; 5023 } 5024 
5025 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 5026 { 5027     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 5028     if (self) { 5029         self.title = @"地址"; 5030         self.tabBarItem.image = [ UIImage imageNamed:@"line_umbrella"]; 5031  } 5032     return self; 5033 } 5034 
5035 - (void)viewDidLoad 5036 { 5037  [super viewDidLoad]; 5038 
5039 } 5040 
5041 -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 5042     return 2; 5043 } 5044 
5045 -(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 5046     if (component==0) { 5047         return self.allCityName.count; 5048     }else{ 5049         return self.allAreaName.count; 5050  } 5051 } 5052 
5053 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 5054     if (component==0) { 5055         return self.allCityName[row]; 5056     }else{ 5057         return self.allAreaName[row]; 5058  } 5059 } 5060 
5061 -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ 5062     if (component == 0) { 5063         //1.獲取第一列中選中的值
5064         NSString *cityName = self.allCityName[row]; 5065         //2.根據第一列的值作key,找到對應的子地區
5066         self.allAreaName = [self.dictionaryCitys objectForKey:cityName]; 5067         [pickerView reloadComponent:1]; 5068         // 修改第二列第一行爲選中的值
5069         [pickerView selectRow:0 inComponent:1 animated:YES]; 5070  } 5071 } 5072 
5073 @end
5074 5075 總: 5076 AppDelegate.h 5077 AppDelegate.m 5078 #import "AppDelegate.h"
5079 #import "SegViewController.h"
5080 #import "IndicatorViewController.h"
5081 #import "DateViewController.h"
5082 #import "PickerViewController.h"
5083 #import "RelationPickerViewController.h"
5084 
5085 @implementation AppDelegate 5086 
5087 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 5088 { 5089     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 5090     SegViewController *segVC = [[SegViewController alloc]initWithNibName:@"SegViewController" bundle:nil]; 5091     UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:segVC]; 5092     
5093     IndicatorViewController *indicatorVC = [[IndicatorViewController alloc]initWithNibName:@"IndicatorViewController" bundle:nil]; 5094     
5095     DateViewController *dateVC = [[DateViewController alloc]initWithNibName:@"DateViewController" bundle:nil]; 5096     
5097     PickerViewController *pVC = [[PickerViewController alloc]initWithNibName:@"PickerViewController" bundle:nil]; 5098     
5099     RelationPickerViewController *rVC = [[RelationPickerViewController alloc]initWithNibName:@"RelationPickerViewController" bundle:nil]; 5100     
5101     
5102     UITabBarController *tabVC = [[UITabBarController alloc]init]; 5103     tabVC.viewControllers = @[navi,indicatorVC,dateVC,pVC,rVC]; 5104     self.window.rootViewController = tabVC; 5105  [self.window makeKeyAndVisible]; 5106     return YES; 5107 } 5108 
5109 
5110 3.iOS8中的警告框和操做表 5111   3.1 建立 5112             UIAlertController *alertController =
5113         [UIAlertController alertControllerWithTitle:@"Title"message:@"messsage"preferredStyle:UIAlertControllerStyleAlert]; 5114 
5115 
5116  3.2 添加動做 5117             UIAlertAction *cancelAction =        [UIAlertAction actionWithTitle:@"取消" style: UIAlertActionStyleCancel  handler:^(UIAlertAction *action) { NSLog(@"Cancel");}]; 5118             
5119  [alertController addAction:cancelAction]; 5120 
5121  3.3 添加文本框 5122             [alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {textField.secureTextEntry = YES;}]; 5123 
5124  3.4 推出顯示警告框 5125  [self presentViewController:alertController animated:YES completion:nil]; 5126 
5127 例:ios6 5128 AlertViewController.h 5129 AlertViewController.m 5130 #import "AlertViewController.h"
5131 
5132 @interface AlertViewController () 5133 
5134 @end
5135 
5136 @implementation AlertViewController 5137 
5138 - (void)viewDidLoad { 5139  [super viewDidLoad]; 5140     // Do any additional setup after loading the view from its nib.
5141 } 5142 
5143 - (IBAction)showAlerView:(id)sender { 5144     UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"title" message:@"mes" preferredStyle:UIAlertControllerStyleAlert]; 5145     UIAlertAction *action = [UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { 5146         UITextField *t = (UITextField *)alertController.textFields[0]; 5147         NSLog(@"%@",t.text); 5148  }]; 5149  [alertController addAction:action]; 5150  [alertController addTextFieldWithConfigurationHandler:nil]; 5151  [self presentViewController:alertController animated:YES completion:nil]; 5152     
5153 } 5154 ========================================================================================
5155 知識點 5156 十4、故事板Storyboard 5157 
5158 1.Storyboard 故事板 5159     1.1 爲何須要故事板 5160  由於在使用xib文件製做界面時存在如下兩個問題: 5161  a。多個xib之間表達的界面的層級關係,以及界面的行進關係沒法在第一時間準確把握 5162  b。代碼中會有大量的建立目標控制器,相似於initWithNibName這樣的代碼,一旦有任何改動,那麼全部initWithNibName就都須要修改,行進路線發生變更 5163  基於以上兩個問題,但願可以將app當作一個總體,可以清晰的表達界面的行進路線,以及對各個控制器的建立工做可以進行統一管理,因而,從iOS5之後,推出了故事板技術來代替xib 5164 
5165 
5166     1.2 什麼是故事板 5167  一個特殊的文件,後綴是storyBoard,本質上仍是一個xml文件,用於記錄在應用中,各個界面的行進路線,可以以圖形化的方式設計界面,而且對於其中使用到的控制器可以自動的建立對象。 5168  故事板是從應用的總體角度來進行設計產品,而且將一部分建立工做實現了編碼最大化的自動化。 5169 
5170     1.3 故事板的簡單使用 5171  【Demo1_StoryBoard】 5172  a。程序啓動時的流程 5173  在工程的配置文件中首先要配置Main Interface爲故事板,而後在故事板中再設置起始場景,而後啓動工程,第一個展現的界面對應的控制器實例就由故事板來自動建立了 5174                 
5175  b。場景 (Scene) 5176  指的是故事板中的一個節點。節點中能夠包含 控制器、第一響應者、出口以及該場景的過渡(Segue) 5177 
5178  c。設計界面 5179  設計方法:與使用xib時沒有區別 5180  連線動做:沒有區別 5181  連線輸出口:沒有區別 5182 
5183  重點須要注意的是:一旦須要對場景中的vc進行編碼時,必定要單首創建一個沒有xib文件的控制器器類,而且將故事板中的場景中的vc與建立的控制器類綁定在一塊兒 5184  如何綁定:選中 場景,點擊第三個檢查器,選擇class屬性,後面的下拉框,找到對應的控制器類便可 5185 
5186     1.4 使用storyBoard配置各類控制器 5187                 a。導航 Editor—>Embed in—>導航/標籤 5188  b。標籤 5189  c。表格 5190  設置表格的步驟: 5191                 1)選中表視圖後,設置表格是static(靜態)仍是dynamic(動態)的 5192                 2)選中表視圖中的 Prototype Cell(原型單元格),在第四個檢查其中修改成自定義單元格或者是4種基本樣式中的某一箇中類型 5193                 3)必定要爲Prototype Cell設置identifier,由於這一次的設置至關於原來在viewDidLoad中寫的regist。。。註冊單元格的代碼 5194                 4)爲表視圖綁定本身建立的繼承自UITableViewController的類,回答三問一答 5195                 5)其中,viewDidLoad中已經不須要使用regist方法來註冊單元格了,在第三問中,只須要直接從隊列中按照在storyBoard中設置的identifier來dequeu單元格便可。 5196  注意: 5197                         1。identifier區分大小寫 5198                         2。deque單元格時,可使用帶有forIndexPath參數的那個方法了 5199                     
5200       1.5 UITableView在故事板中的使用【Demo1】 5201 
5202  a。靜態表格的配置 5203  實現步驟: 5204  從資源庫中添加表格控制器,在第四個檢查器中,設置第一個Content爲Static Cell 5205  修改Prototype 屬性的值爲0 5206  設置section屬性 (分區) 5207  設置style屬性爲group 5208  逐一選中各個Section設置頭和cell的數目 5209  逐一選中Cell,設置樣式 5210  新建一個類,繼承自UITableViewController,在故事板中選中控制器,修改第三個檢查器中的class屬性,將自定義的類與場景關聯起來 5211                                 ****刪除新建的類中,有關生成表格的三問一答的代碼 5212                                 ****若是須要對靜態表格中的控件,賦動態值,能夠在拆分視圖下,將控件連線到類中,而後在viewWillAppear:事件中爲控件賦值 5213 5214  b。動態表格的配置 5215                     1)系統原型 5216  實現步驟: 5217  從資源庫中添加表格控制器 5218  設置表格的Prototype 的個數爲1 5219  選中Prototype Cell,在檢查器中,設置該原型的style及identifier 5220  建立一個類,繼承自UITableViewController 5221  將類與故事板中的控制器綁定 5222  在類中回答三問,其中,單元格不須要註冊,回答第三問時,直接按照屬性欄中設置的identifier去隊列中取單元格便可 5223                                         
5224                     2)自定義原型 5225  實現步驟: 5226  從資源庫中拖拽一個TableVC 5227  添加一個單元格原型view 5228  設定該原型的style爲Custom 5229  設定該原型的identifier 5230  設計cell的內容 5231  新建一個類,繼承自UITableViewCell 5232  選中原型cell,第三個檢查器,設定class爲新建的類 5233  拆分視圖中,將原型cell中的各個控件連線到類中,做爲公開的輸出口 5234  新建一個類,繼承自UITableViewController,並與故事板中的vc綁定 5235  回答第三個問題時,從隊列中按照原型的identifier取出自定義的cell類的實例,並返回 5236         
5237                     3)混合原型 5238  實現步驟: 5239  在故事板中添加tableVC後,設定Prototype Cell的個數爲2 5240  爲每個Prototype Cell設定identifier 5241  在tableVC綁定的自定義類中,回答三問一答 5242  其中,第三問,生成單元格時,能夠根據生成的單元格的位置及設定的規律,取隊列中,按照不一樣的identifier來取不一樣原型的單元格,而後返回 5243 News.h 5244 #import <Foundation/Foundation.h>
5245 
5246 @interface News : NSObject 5247 
5248 @property(nonatomic,strong) NSString *title; 5249 @property(nonatomic,strong) NSString *newsImageName; 5250 @property(nonatomic) NSUInteger commentNumber; 5251 
5252 -(instancetype)initWithTitle:(NSString*)title 5253         andImageName:(NSString*)imageName 5254  andCommentNumber:(NSUInteger)commentNumber; 5255 
5256 +(NSArray *)demoData; 5257 
5258 @end
5259 News.M 5260 #import "News.h"
5261 
5262 @implementation News 5263 
5264 -(instancetype)initWithTitle:(NSString*)title 5265         andImageName:(NSString*)imageName 5266  andCommentNumber:(NSUInteger)commentNumber{ 5267     self = [super init]; 5268     if (self) { 5269         self.title = title; 5270         self.newsImageName = imageName; 5271         self.commentNumber = commentNumber; 5272  } 5273     return self; 5274     
5275 } 5276 
5277 + (NSArray *)demoData{ 5278     News *n1 = [[News alloc]initWithTitle:@"聯通被曝高危漏洞 或致用戶通話記錄等信息泄露" andImageName:@"n1.png" andCommentNumber:186]; 5279     News *n2 = [[News alloc]initWithTitle:@"CES2015回顧:民用無人機來襲 中國公司佔主導" andImageName:@"n2.png" andCommentNumber:17]; 5280     News *n3 = [[News alloc]initWithTitle:@"中企征戰CES:難尋顛覆性產品 未打通海外品牌渠道" andImageName:@"n3.png" andCommentNumber:17]; 5281     News *n4 = [[News alloc]initWithTitle:@"老話重提:「專車」是不是黑車?被查合不合法" andImageName:@"n4.png" andCommentNumber:178]; 5282     News *n5 = [[News alloc]initWithTitle:@"馬雲告誡員工千萬別碰京東:京東將會成悲劇" andImageName:@"n5.png" andCommentNumber:4374]; 5283     News *n6 = [[News alloc]initWithTitle:@"三星Q4營業利潤47億美圓超預期:內存芯片需求利好" andImageName:@"n6.png" andCommentNumber:6]; 5284     News *n7 = [[News alloc]initWithTitle:@"索尼宣佈PS4國行版延期上市 或因被舉報不鎖區" andImageName:@"n7.png" andCommentNumber:0]; 5285     News *n8 = [[News alloc]initWithTitle:@"微衆銀行開業前夕推「信用付」臨時核心系統過分" andImageName:@"n8.png" andCommentNumber:4]; 5286     
5287     return @[n1,n2,n3,n4,n5,n6,n7,n8]; 5288 } 5289 
5290 @end
5291 NewsCell.h 5292 #import <UIKit/UIKit.h> 連線自定義的內容 5293 
5294 @interface NewsCell : UITableViewCell 5295 
5296 @property (weak, nonatomic) IBOutlet UIImageView *newsImageVIew; 5297 @property (weak, nonatomic) IBOutlet UILabel *newsTitleLabel; 5298 @property (weak, nonatomic) IBOutlet UILabel *newsCountLabel; 5299 
5300 @end
5301 NewsCell.M 5302 
5303 MutilProtoViewController.h 5304 MutilProtoViewController.m 5305 #import "MutilProtoViewController.h"
5306 #import "News.h"
5307 #import "NewsCell.h"
5308 
5309 @interface MutilProtoViewController () 5310 @property(nonatomic,strong)NSArray *allNews; 5311 
5312 @end
5313 
5314 @implementation MutilProtoViewController 5315 
5316 - (NSArray *)allNews{ 5317     if (!_allNews) { 5318         _allNews = [News demoData]; 5319  } 5320     return _allNews; 5321 } 5322 
5323 
5324 
5325 - (void)viewDidLoad 5326 { 5327  [super viewDidLoad]; 5328 
5329 } 5330 
5331 
5332 #pragma mark - Table view data source
5333 
5334 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 5335 { 5336     return 1; 5337 } 5338 
5339 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 5340 { 5341     return self.allNews.count*2; 5342 } 5343 
5344 
5345 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 5346 { 5347     if (indexPath.row % 2) { 5348          NewsCell *newsCell = [tableView dequeueReusableCellWithIdentifier:@"Cell2" forIndexPath:indexPath]; 5349         //按照行號找到數據 5350         //獲得的標號是: 0 1 2 3 4 5 5351         //實際的行號是: 1 3 5 7 9 11
5352         News *news = self.allNews[indexPath.row/2]; 5353         //將新聞實體的各個屬性設置到cell中
5354         newsCell.newsImageVIew.image = [UIImage imageNamed:news.newsImageName]; 5355         newsCell.newsTitleLabel.text = news.title; 5356         newsCell.newsCountLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber]; 5357         return newsCell; 5358     }else{ 5359         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1" forIndexPath:indexPath]; 5360         cell.textLabel.text = @"訂單詳情"; 5361         return cell; 5362  } 5363 } 5364 
5365 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 5366     if (indexPath.row%2) { 5367         return 100; 5368     }else{ 5369         return 44; 5370  } 5371 } 5372 
5373  5374     1.6跳轉 【Demo2_Goto_OtherVC】 5375             
5376  從一個場景跳轉到另外一個場景(從一個vc跳轉到另外一個vc)的過程 5377             
5378  實現方式: 5379  方式一:Segue 5380  不須要編寫代碼,經過連線的方式來實現 5381  實現步驟: 5382  選中原始vc,按住control,按左鍵,拖拽到目標vc,彈出菜單後,根據跳轉的須要選擇push或model便可 5383 
5384  方式二: 5385  從一個vc跳轉到故事板中的另外一個獨立的vc 5386  實現步驟: 5387  選中故事板中的vc,第三個檢查器中,設定vc的Storyboard ID 5388  在要執行跳轉的事件中編寫代碼 5389  獲取控制器所在的故事板對象 5390  self.storyboard 5391                      故事板發送消息instantiateViewControllerWithIdentifier:@"SomeVC"
5392  其中,參數填寫爲vc的storyboard ID便可 而後,推出該控制器實例 5393 - (IBAction)gotoSomeVC:(UIButton *)sender { 5394     //找到故事板建立的vc實例
5395     SomeViewController *someVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"]; 5396     //推出新vc
5397  [self.navigationController pushViewController:someVC animated:YES]; 5398 } 5399 
5400 
5401  方式三:跳轉到獨立的xib 5402  實現方式:同之前的跳轉方式,使用initWithNibName方法建立vc的實例後,推出便可 5403 - (IBAction)gotoOtherVC:(UIButton *)sender { 5404     //根據xib的名字建立vc
5405     OtherViewController *otherVC = [[OtherViewController alloc]initWithNibName:@"OtherViewController" bundle:nil]; 5406     //推出新vc
5407  [self.navigationController pushViewController:otherVC animated:YES]; 5408 } 5409 
5410 
5411     1.7 傳值 5412            1.7.1 正向傳值:從AVC跳轉到BVC時,AVC傳數據給BVC的過程 5413  實現思路: 5414  a。BVC要有公開的屬性接收數據 5415  b。AVC在跳轉到BVC以前,獲取到BVC的引用,就能夠爲空開的屬性賦值,完成正向傳值了 5416  c.segue.destinationViewController實現跳轉 5417 AViewController.h 5418 AViewController.m 5419 #import "AViewController.h"
5420 #import "BViewController.h"
5421 
5422 @interface AViewController () 5423 @property (weak, nonatomic) IBOutlet UITextField *textFiled; 連線文本框 5424 
5425 @end
5426 
5427 @implementation AViewController 5428 
5429 
5430 - (void)viewDidLoad 5431 { 5432  [super viewDidLoad]; 5433 } 5434 
5435 //在跳轉到BVC的Segue發生以前 5436 //獲取跳轉到的目標vc也就是BVC的控制權
5437 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 5438     if ([segue.identifier isEqualToString:@"segueToBVC"]) { 跳轉線 5439         //經過segue對象獲取到目標vc
5440         BViewController *bvc = segue.destinationViewController; 5441         bvc.codeString = self.textFiled.text; 5442  } 5443 } 5444 BViewController.h 5445 #import <UIKit/UIKit.h>
5446 
5447 @interface BViewController : UIViewController 5448 
5449 @property(nonatomic,strong)NSString *codeString; 5450 
5451 @end
5452 
5453 BViewController.m 5454 #import "BViewController.h"
5455 
5456 @interface BViewController () 5457 @property (weak, nonatomic) IBOutlet UILabel *codeLabel; 5458 
5459 @end
5460 
5461 @implementation BViewController 5462 
5463 
5464 - (void)viewDidLoad 5465 { 5466  [super viewDidLoad]; 5467 
5468 } 5469 
5470 - (void)viewWillAppear:(BOOL)animated 5471 { 5472     self.codeLabel.text = self.codeString; 5473 } 5474 
5475 @end
5476 
5477         1.7.2 反向傳值:從AVC跳轉到BVC後,BVC返回AVC的過程當中給AVC傳值的過程 5478  實現思路: 5479  a。BVC是委託方,作三件事(定義協議,添加delegate屬性,合適的時機發消息) 5480  b。AVC是代理方,作三件事(遵照協議,實現方法,設置BVC的delegate爲self) 5481 
5482 **注意:設置BVC的delegate爲self時應考慮segue方法,使用以下 5483 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 5484     if ([segue.identifier isEqualToString:@"segueGotoDVC"]) { 5485         DViewController *dvc = segue.destinationViewController; 5486         dvc.delegate = self; 5487  } 5488 } 5489 
5490 ===========================================================
5491 知識點 5492 十5、UICollectionViewController 5493 
5494 1.1 是什麼? 5495  能夠控制視圖,以多行多列的形式展現數據的一種控制器。是從UITableViewController演變而來,因此在使用上與表視圖很像。(從iOS6開始支持) 5496 
5497 1.2 與表視圖相比的相同點 5498  UITableViewController 5499  .tableView (UITableView) 5500                             .dataSource (id<UITableViewDataSource>) 5501                             .delegate(id<UITableViewDelegate>) 5502  每一行的類型是:UITableViewCell 5503  加載數據:實現三問一答便可(有幾個分區,每一個分區多少行,每一行什麼樣) 5504 
5505  UICollectionViewController 5506  .collectionView (UICollectionView) 5507                             .dataSource(id<UICollectionViewDataSource>) 5508                             .delegate(id<UICollectionViewDelegate>) 5509  每個項的類型:UICollectionViewCell 5510  加載數據:實現三問一答便可(有幾個分區,每一個分區多少item,每個項什麼樣) 5511 
5512 1.3與tableView相比不一樣點 5513  a。tableViewCell默認自帶了三個顯示內容的控件(imageView,textLabel,detailLabel),而且這三個控件的擺放位置也有系統定義好的四種樣式,而collectionViewCell沒有任何事先由系統定義的用於顯示內容的控件,只有能訪問的這樣幾個屬性:backgroundColor、backgroundView、contentView 5514         
5515  b。tableViewCell的排布順序是系統提早定義好的,都是嚴格的按照從上到下,依次排布,也就是每個cell的座標,在指定了行高之後,都有系統計算完成並顯示;collectionView沒有固定的item的排布規則,須要自定義,這是須要一個特殊的叫作佈局類(UICollectionViewLayout)來輔助CollectionView完成每個item的顯示位置的設定,系統只提供了一種佈局類,從UICollectionViewLayout派生出來的,叫作流式佈局UICollectionFlowLayout,這種系統定義的佈局類的佈局特色是:一行排滿後,自動換行, 5516 
5517 1.4UICollectionViewController的基本使用 5518 
5519     1.1Code 純代碼的方式【Demo1_CollectionView_Code】 5520 
5521         a。Cell的簡單樣式 + 系統的流式佈局 5522                 UICollectionViewCell + UICollectionViewFlowLayout 5523 
5524         b。Cell的簡單樣式 + 自定義的流式佈局 5525                 UICollectionViewCell+MyFlowLayout 5526             
5527         c。自定義Cell + 自定義的流式佈局 5528                 MyCell + MyFlowLayout 5529 AppDelegate.h 5530 AppDelegate.m 5531 #import "AppDelegate.h"
5532 #import "MyCollectionViewController.h"
5533 #import "MyFlowLayout.h"
5534 
5535 @implementation AppDelegate 5536 
5537 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 5538 { 5539     self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 5540     //建立一個默認的流式佈局類的對象 5541     //UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
5542     MyFlowLayout *layout = [[MyFlowLayout alloc]init]; 5543     MyCollectionViewController *vc = [[MyCollectionViewController alloc]initWithCollectionViewLayout:layout]; 5544     self.window.rootViewController = vc; 5545  [self.window makeKeyAndVisible]; 5546     return YES; 5547 } 5548 
5549 MyCell.h 5550 #import <UIKit/UIKit.h>
5551 
5552 @interface MyCell : UICollectionViewCell 5553 @property(nonatomic,strong)UIImageView *bgImageView; 5554 @property(nonatomic,strong)UILabel *label; 5555 
5556 @end
5557 
5558 MyCell.m 5559 #import "MyCell.h"
5560 
5561 @implementation MyCell 5562 
5563 - (id)initWithFrame:(CGRect)frame 5564 { 5565     self = [super initWithFrame:frame]; 5566     if (self) { 5567         self.bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 5568         //設置圖片視圖爲cell的背景視圖
5569         self.backgroundView = self.bgImageView; 5570         self.label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 5571         self.label.textAlignment = NSTextAlignmentCenter; 5572         self.label.font = [UIFont boldSystemFontOfSize:30]; 5573         //將標籤添加到cell的內容視圖中
5574  [self.contentView addSubview:self.label]; 5575  } 5576     return self; 5577 } 5578 
5579 @end
5580 MyFlowLayout.h 5581 #import <UIKit/UIKit.h>
5582 
5583 @interface MyFlowLayout : UICollectionViewFlowLayout 5584 
5585 @end
5586 MyFlowLayout.m 5587 #import "MyFlowLayout.h"
5588 
5589 @implementation MyFlowLayout 5590 
5591 - (id)init 5592 { 5593     self = [super init]; 5594     if (self) { 5595         // 流式佈局的自定義設置
5596         self.itemSize = CGSizeMake(80, 80); 5597         self.minimumLineSpacing = 10; 5598         self.minimumInteritemSpacing = 10; 5599         self.sectionInset = UIEdgeInsetsMake(154, 30, 154, 30); 5600         self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 5601  } 5602     
5603     return self; 5604 } 5605 
5606 @end
5607 MyCollectionViewController.h 5608 #import <UIKit/UIKit.h>
5609 
5610 @interface MyCollectionViewController : UICollectionViewController 5611 
5612 @end
5613 MyCollectionViewController.m 5614 #import "MyCollectionViewController.h"
5615 #import "MyCell.h"
5616 
5617 @interface MyCollectionViewController () 5618 
5619 @end
5620 
5621 @implementation MyCollectionViewController 5622 
5623 static NSString *reuseIdentifier=@"MyCell"; 5624 
5625 - (void)viewDidLoad 5626 { 5627  [super viewDidLoad]; 5628     //註冊CollectionViewCell
5629     [self.collectionView registerClass:[MyCell class] forCellWithReuseIdentifier:reuseIdentifier]; 5630 } 5631 // 三問 5632 
5633 // 第一問:多少個分區
5634 -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 5635 { 5636     return 3; 5637 } 5638 
5639 // 第二問:每一個分區多少個項
5640 -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 5641 { 5642     return 9; 5643 } 5644 
5645 // 第三問:每一個項什麼樣
5646 -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 5647 { 5648     // 從隊列中按標識取cell
5649     MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; 5650     // 設置自定義cell的背景圖和標籤的內容
5651     cell.bgImageView.image = [UIImage imageNamed:@"f.png"]; 5652     cell.label.text = [NSString stringWithFormat:@"%d",indexPath.row]; 5653     
5654     
5655     
5656     // 設置cell 5657 // cell.backgroundColor = [UIColor whiteColor]; 5658 // UILabel *label = (UILabel *)[cell.contentView viewWithTag:1]; 5659 // if (label == nil) { 5660 // label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height)]; 5661 // label.font = [UIFont boldSystemFontOfSize:26]; 5662 // label.textAlignment = NSTextAlignmentCenter; 5663 //        //爲label添加tag值 5664 // label.tag = 1; 5665 // [cell.contentView addSubview:label]; 5666 // } 5667 // label.text = [NSString stringWithFormat:@"%d",indexPath.row]; 5668 //    
5669     // 返回cell
5670     return cell; 5671 } 5672 水平滾動顯示 豎直滾動顯示 5673   5674     1.2 Xib 方式 5675         1).主要就是xib中建立的UICollectionViewController,若是是自動義的佈局需在xib的右側區域與建立的類相鏈接,而且需注意註冊時應該使用nibWithNibName,如: 5676 - (void)viewDidLoad 5677 { 5678  [super viewDidLoad]; 5679     //註冊cell 5680     //[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
5681     [self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:reuseIdentifier]; 5682 } 5683 5684        ***上邊的圖片是在xib中剛開始建立的時候並無與控制器鏈接,需經過黃色的方框與控制器鏈接,並經過第五個檢查器連線設置代理 5685 
5686            2).而且注意MyFlowLayout.m中要初始化方法需使用- (id)initWithCoder:(NSCoder *)aDecoder{來設置佈局大小,滾動方向等 5687 - (id)initWithCoder:(NSCoder *)aDecoder{ 5688     self = [super initWithCoder:aDecoder]; 5689     if (self) { 5690         self.itemSize = CGSizeMake(60, 60); 5691         self.minimumInteritemSpacing = 10; 5692         self.minimumLineSpacing = 10; 5693         self.sectionInset  = UIEdgeInsetsMake(100, 25, 100, 25); 5694         self.scrollDirection = UICollectionViewScrollDirectionVertical; 5695  } 5696     return self; 5697 } 5698     3).而MyCell.h類中的單元格內容的設置不須要手寫代碼了,只需在xib中設置,而後公開屬性連線便可(需注意此類建立不自帶xib,需本身從新建立,User Interface—>Empty—>next—>起名字,與類名前綴起的同樣便可,並添加單元格,在單元格里添加圖片和label便可,將class與本身建立的類關聯起來) 5699     
5700      1.3 Storyboard方式 5701 
5702          1).故事板中導入UICollectionViewController控制器,所有選中,並將本身建立的類相關聯, 5703          2)只選中view,設置自定義和格式,並與建立的類MyFlowLayout相關聯,滾動方向及顯示大小都經過本身建立的類來設置 5704          3)選中故事板中的cell與本身建立的類相關聯class,本身建立的cell類在公開屬性中與故事板中建立的模型鏈接屬性便可 5705 5706 2.使用UICollectionViewController實現複雜佈局 5707 
5708     2.1 自定義的複雜的流式佈局實現水平移動時的縮放 5709 MyFlowLayout.h 5710 MyFlowLayout.m 5711 #import "MyFlowLayout.h"
5712 
5713 @implementation MyFlowLayout 5714 
5715 -(id)init 5716 { 5717     self = [super init]; 5718     if (self) { 5719         self.itemSize = CGSizeMake(200, 200); 5720         self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 5721         self.sectionInset = UIEdgeInsetsMake(60, 0, 60, 0); 5722         self.minimumLineSpacing = 100; 5723         
5724  } 5725     return self; 5726 } 5727 
5728 
5729 -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{ 5730     return YES; 5731 } 5732 
5733 必須使用這個方法進行縮放 5734 -(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ 5735     NSArray *array = [super layoutAttributesForElementsInRect:rect]; 5736     //建立可視化的矩形區域
5737     CGRect visiabelRect = CGRectZero; 5738     visiabelRect.origin = self.collectionView.contentOffset; 5739     visiabelRect.size = self.collectionView.bounds.size; 5740     //可視化矩形區域的中心點x
5741     CGFloat visiableRectCenterX = CGRectGetMidX(visiabelRect); 5742     //依次獲取系統指定的矩形區域中的每個item 5743     //的中心點座標 5744     //將可視化區域的中心點與item的中心點進行 5745     //比對,根據兩個中心點的距離產生一個變化的 5746     //比率,並將該比率做爲item的縮放比率便可
5747     for (UICollectionViewLayoutAttributes *attributes in array) { 5748         //獲取每個item的中心點
5749         CGFloat itemCenterX = attributes.center.x; 5750         //計算兩個中心點的距離
5751         CGFloat distance = visiableRectCenterX - itemCenterX; 5752         //設定兩個中心點的距離在200之內時 5753         //才針對item作放大縮小的操做
5754         if (ABS(distance) < 200) { 5755             //根據distance的大小產生一個變化的zoomFator縮放因子
5756             CGFloat zoomFactor = 1 + 0.5*(1-ABS(distance/200.0)); 5757             attributes.transform3D = CATransform3DMakeScale(zoomFactor, zoomFactor, 1); 5758  } 5759  } 5760     return array; 5761 } 5762 
5763 @end
5764 
5765     2.2 自定義的不規則佈局 5766 
5767 
5768 補充: 5769 
5770 1.frame屬性描述的是,視圖在父視圖中的位置及所佔的區域大小 5771 
5772 2.bounds屬性描述的是,視圖自己的大小 5773 
5774 3.屏幕:3.5320 高480 5775     屏幕:4320 高568 5776 
5777 練習: 水平滾動的 三頁九宮格 5778  垂直滾動的 三頁九宮格 5779 
5780  九宮格間距較緊密,居中顯示 5781 
5782 水平滾動:(4寸) 5783 itemSize:80 X 80
5784 itemSpacing:10
5785 lineSpacing:10
5786 sectionInset:top:[568 - (80*3+10*2)]/2=154
5787                                   left:[320 - (80*3+10*2)]/2= 30
5788 總結: 5789 
5790  若是要利用UICollectionViewController來設計界面,須要建立3個類來實現此功能 5791 MyCollectionViewController.h 5792 MyCollectionViewController.m 5793  此類中主要用於實現三問一答,繼承自UICollectionViewController用來建立表格的基本模式,幾個分區,幾列以及表格的顯示內容(需注意:表格的內容需在viewDidLoad中註冊才能建立),實現表格的重用 5794 MyFlowLayout.h 5795 MyFlowLayout.m 5796  此類中主要是爲了佈局,繼承自UICollectionViewFlowLayout重寫初始化方法,設置顯示的大小,項目間的距離、行高、以及水平滾動仍是豎直滾動,以及與屏幕的上下左右的間距。 5797  self.itemSize 設置每一個單元格的大小 5798  self.scrollDirection 設置水平滾動仍是豎直滾動 5799  self.sectionInset 設置距離屏幕上下左右的距離 5800  self.minimumLineSpacing 設置行間距 5801  self.minimumInteritemSpacing 設置項目之間的距離 5802 MyCell.h 5803 MyCell.m 5804  此類中主要用來設置單元格的內容,繼承自UICollectionViewCell在.h文件中設置一個公開的屬性,與MyCollectionViewController聯繫,通常狀況下設置圖片背景和標籤,在initWithFrame方法中設置。 5805 如: 5806 - (id)initWithFrame:(CGRect)frame 5807 { 5808     self = [super initWithFrame:frame]; 5809     if (self) { 5810         self.bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)]; 5811         self.backgroundView = self.bgImageView; 5812         //邊框線條寬度
5813         self.contentView.layer.borderWidth = 1.0f; 5814         //邊框的顏色
5815         self.contentView.layer.borderColor = [UIColor whiteColor].CGColor; 5816  } 5817     return self; 5818 } 5819 =========================================================================================================
5820     
相關文章
相關標籤/搜索