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.5 寬 320 高480 5775 屏幕:4 寬 320 高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