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、UISegmentedControlios
=======================================================================c#
在類內的init…方法中、get、set方法中,用_xxx實例變量。其餘地方的訪問都用self.屬性設計模式
內存管理修飾:數組
copy:NSString,blockxcode
copy:將對象的拷貝賦給引用,拷貝完的是不可變的。安全
爲何用copy?微信
NSString類型的特色就是內容不可變的,可是給NSString賦值時,能夠將NSMutableString賦過來,可能就會有其餘持有MutableString的引用修改了這個字符串,結果你再用NSString訪問字符串時就會發現,原本不可變的字符串在不知情的狀況下被改變了。因此爲了不這種狀況,就是用copy將內容複製成不可變以後再給NSString網絡
使用copy會更安全,但內存會被佔用,通常狀況下用strong不影響程序運行數據結構
strong:除NSString之外的引用類型多線程
徹底的擁有對象,引用計數器+1
assign:基本數據類型、結構體、枚舉
==========================================================================
1、調試
0.警告
儘可能一個警告都不要有
1.錯誤
1)紅色提示
編譯過不去的緣由大部分是語法,檢查括號的匹配,變量名稱,做用域範圍
2)編譯能夠經過,能夠運行
a。運行過程當中程序崩潰
在debug區域的右側,觀察提示信息,信息的最上面會說明出錯的類及方法的位置,而後找「reason」單詞,看後面的提示
b。運行過程當中沒有問題,可是結果與期待不符
2.問題的解決方法
2.1 核心理念:掌控每一步中變量的變化
使用debug工具,下斷點,逐行跟蹤程序的運行,查看每一行代碼運行時,各個變量內存放的數據是否與期待存儲的數據相一致,若是某一行代碼執行後,發現變量中存儲的值與期待不符,那麼基本上緣由就找到了,而後根據變量的整個賦值、運算過程再來分析爲何數據不符,解決了無數據或數據有誤的狀況後,程序基本就正常運行了。
2.2 下斷點位置的選擇
變量被改變以前的位置以及變量被改變以後的位置
3工具的使用
3.1 遇到斷點停下來後,debug區域的三角按鈕,點擊後,程序繼續自動 運行;若是後續運行中遇到了下一個斷點,則停下來;若是後續運行中沒有斷點了,那麼程序自動運行完才停下來
3.2 step over:將一個方法總體做爲執行的一步,一次性執行完,但,若是方法中有斷點,則會進斷點。進入斷點後,能夠經過點擊三角號或step out均可以回到進入方法前的那個位置
3.3 step into:能夠進入方法的內部,繼續逐行跟蹤代碼的執行過程
3.4 step out:在方法內部中調試時,若是不想再繼續跟蹤,能夠經過點擊此按鈕,快速回到進入該方法的那個位置
3.5 調試過程當中,若是想快速略過一段循環的話,能夠在循環的後面添加斷點,而後點擊三角號,就會再也不跟蹤循環的過程,而快速執行到下一個斷點的位置
=============================================================================
User Interface UIKit
知識點
1、UIWindow
今天的目標:
寫出第一個iOS的程序,在界面上顯示「Hello World」
1.如何新建一個工程
iOS—>Single View Application—>工程名、保存位置
2.運行App
點擊三角符號或使用快捷鍵(Command + R)
快捷鍵:Command+B 只是編譯,不是運行
3.工程的文件組成
4.應用程序是如何運行起來的?
1)main方法
int main(int argc, char * argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain()全局函數,一共作了三件事:
a)根據第三個參數建立應用程序類的實例(nil默認UIApplication 系統默認)
b)根據第四個參數建立應用程序代理類的實例
(Application Delegate代理 本身任意建立的類,遵照了協議才能夠成爲代理類)
c)啓動事件循環
d)在代理類的didFinishLaunchingWithOptions:方法中編寫啓動程序後的界面建立及顯示
5.UIWindow
1)是什麼
是界面顯示的根本對象,要想出現顯示的內容,那麼必定是先建立window的實例
2)做用是什麼?
是界面要顯示的內容的父容器,在window的上面添加其餘顯示的內容
6.frame
1)是什麼
是CGRect類型的結構體
2)描述了控件在父容器中的位置和大小
CGRect{
CGPoint origin,
CGSize size
}
CGPoint{
CGFloat x,
CGFloat y
}
CGSize{
CGFloat width,
CGFloat height
}
3)如何建立結構體的變量?
使用全局函數 xxxMake();
CGRect —> CGRectMake(x,y,width,height)
CGPoint -> CGPointMake(x,y);
CGSize -> CGSizeMake(width,height);
例:
AppDelegate.m
#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//應用程序啓動後,第一個要執行動做的時機點,能夠作第一個要出現的界面的設置
//1.建立window的實例
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];//讀屏幕的大小
//2.設置window的背景色
self.window.backgroundColor = [UIColor whiteColor];
//3.建立並添加顯示文本信息的標籤
UILabel *label = [[UILabel alloc]init];
label.frame = CGRectMake(100, 150, 200, 40);
label.text = @"Hello World";
[self.window addSubview:label];//子試圖添加到界面
//4.設置窗口可見(顯示)
[self.window makeKeyAndVisible];
return YES;
}
=================================================================================================
知識點
2、應用程序設計理念:視圖控制器(UIViewController)、視圖(UIView)
*利用視圖控制器(底層)管理視圖(外觀),一對一
1.視圖的做用:負責顯示的外觀
2.視圖控制器的做用:建立界面、管理視圖的生命週期
3.UIViewController的UIView關係:系統的UIViewController中天生自帶一個視圖,UIView經過self.view屬性來訪問控制器自帶的這個視圖
4.viewDidLoad方法:建立視圖時會自動調用,並且只被調用一次,有關視圖的初始化工做都會放在這個方法中
5.使用VC的步驟:
step1:編寫一個類,繼承自UIViewController
step2:重寫類中的viewDidLoad方法,建立界面內容
step3:在didFinishLaunching方法中,建立window的實例,建立vc的實例,將vc設置爲window的rootViewController(根vc),顯示window
1.建立控制器
AppDelegate.m
#import "AppDelegate.h"
#import "MyViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
self.window.backgroundColor=[UIColor greenColor];
//1.建立控制器的實例 myVC自帶一個視圖
MyViewController* myVC=[[MyViewController alloc]init];
//2.將控制器設置爲window的根視圖控制器
self.window.rootViewController=myVC;
[self.window makeKeyAndVisible];
return YES;
}
2.視圖控制器viewDidLoad方法
1).控制器擁有對其自帶的視圖的生命週期(建立--->銷燬)管理權
2).在視圖的生命週期的第一個階段就是執行viewDidLoad方法
3).做用:用於建立視圖,如:初始化界面、建立界面的顯示元素
4).特色:在整個生命週期中,只會被執行一次
例:
MyViewController.m
(本身建立的類,繼承了UIViewController父類方法,並重寫了viewDidLoad方法)
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
//控制器擁有對其自帶的視圖的生命週期(建立--->銷燬)管理權
//在視圖的生命週期的第一個階段就是執行viewDidLoad方法
//做用:用於建立視圖,如:初始化界面、建立界面的顯示元素
//特色:在整個生命週期中,只會被執行一次
- (void)viewDidLoad
{
[super viewDidLoad];
//設計view
UILabel* label=[[UILabel alloc]init];
label.frame=CGRectMake(110, 200, 100, 40);
label.text=@"HelloWlord";
//添加到控制器自帶的那個視圖裏面
[self.view addSubview:label];
}
@end
==========================================================================================================================
知識點
3、視圖(UIView)與控件(UIControl)
1.UIView類
1.什麼是視圖
看得見的都是視圖
2.什麼是控件
一種特殊的視圖,都是UIControl的子類,不只具備必定的顯示外觀,還能響應高級事件,與用戶交互。嚴格意義上UILabel不是控件,由於label不能響應用戶交互事件。
3 術語的理解:
視圖:一個大一點的顯示區域,裏面能夠容納控件,作容器講
控件:容器中包含的子元素
2.UILabel標籤
1. 是什麼?
靜態文本內容的展現控件
2.label屬性
1)text:顯示文本的內容
2)font:顯示文本的字體
3)numberOfLines:默認爲1,顯示的最大行數,0表示無上限
4) lineBreakMode:換行模式, 省略頭或尾
NSLineBreakByTruncatingHead, /* Truncate at head of line: "...wxyz" */
NSLineBreakByTruncatingTail, /* Truncate at tail of line: "abcd..." */
NSLineBreakByTruncatingMiddle /* Truncate middle of line: "ab...yz"
5)adjustsFontSizeToWidth:是否調整字體大小適應控件寬度 yes;
6) textColor:設置文本的顏色
例:
MyViewController.m
- (void)viewDidLoad
{
[super viewDidLoad];
//設計view
UILabel* label=[[UILabel alloc]init];
label.frame=CGRectMake(110, 200, 100, 60);
//設置字體顏色
label.textColor=[UIColor whiteColor];
//設置最大顯示行數
label.numberOfLines=2;
//設置標籤內容的字體
label.font=[UIFont systemFontOfSize:20];
//設置換行模式
label.lineBreakMode=NSLineBreakByTruncatingHead;
//調整字體大小
//label.adjustsFontSizeToFitWidth=YES;
label.text=@"HelloWlord HelloWlord HelloWlord";
//添加到控制器自帶的那個視圖裏面
[self.view addSubview:label];
}
3.UIButton按鈕
1.什麼是按鈕?
能夠與用戶交互,可以點擊的一種控件
2.建立方式
工廠方法建立,使用系統模式
3.經常使用屬性
1)frame :按鈕大小
2)backgroundColor:按鈕背景色
3)setBackgroundImage:按鈕背景圖
1.點擊images.xcassets文件,將要添加的圖片拖拉進文本框,左邊框修改圖片名字
2.點擊下方Show Slicing按鈕
3.在下方進行縮小放大操做
4.點擊圖片中Start Slicing按鈕進行裁剪,再點擊中間按鈕
5.九切片:橫3線:1線範圍不變,1-2線之間複製,2-3線裁剪省掉,3線不變
6.將照片名字添加到程序
[button setBackgroundImage:[UIImage imageNamed:@"bg"]forState:UIControlStateNormal];
4)tintColor:按鈕字體顏色
5) setTitle:點擊按鈕的狀態
UIControlStateNormal = 0, 正常按下
UIControlStateHighlighted = 1 << 0, 長按狀態
UIControlStateDisabled = 1 << 1,
UIControlStateSelected = 1 << 2,
4.添加事件
***點一次按鈕,執行調用一次方法
addTarget:爲按鈕添加響應事件,即點擊按鈕時需實現的功能
參數: 1.target:讓當前控制器對象成爲處理響應的對象
2.action:處理事件的對象所使用的方法
3.events:添加對按鈕的什麼事件的處理
[button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
例:
MyViewController.m
#import "MyViewController.h"
@interface MyViewController ()
@property(nonatomic,strong)UILabel *label;//設置全局變量
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//使用工廠方法建立button對象
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
//設置frame屬性
button.frame = CGRectMake(100, 200, 100, 40);
//設置按鈕上的文字
[button setTitle:@"OK" forState:UIControlStateNormal];
[button setTitle:@"KO" forState:UIControlStateHighlighted];
//設置按鈕的背景色
//button.backgroundColor = [UIColor lightGrayColor];
//設置按鈕的背景圖
[button setBackgroundImage:[UIImage imageNamed:@"bg"] forState:UIControlStateNormal];
//設置按鈕的圖片
//[button setImage:[UIImage imageNamed:@"wifi"] forState:UIControlStateNormal];
//爲按鈕添加響應事件
//target:讓當前控制器對象成爲處理響應的對象
//action:處理事件的對象所使用的方法
//events:添加對按鈕的什麼事件的處理
[button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
//添加按鈕到視圖中
[self.view addSubview:button];
//添加一個UILable
UILabel *label = [[UILabel alloc]init];
self.label = label;
label.frame = CGRectMake(110, 50, 100, 40);
label.text = @"Hello World";
[self.view addSubview:label];
}
//處理事件的對象所使用的方法
-(void)click
{
self.label.text = @"Hello Kitty";
//NSLog(@"click.....");
}
@end
AppDelegate.h
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
self.window.backgroundColor=[UIColor whiteColor];
MyViewController* vc=[[MyViewController alloc]init];
self.window.rootViewController=vc;
[self.window makeKeyAndVisible];
return YES;
}
做業:
2.作一個小的應用
界面中有一個按鈕,每次按下按鈕,界面多一個UILabel
要求:
1)label之間間隔10個點的距離
2)全部label和屏幕左邊距離20個點
3)全部label寬280,高20
4)每一個Label的內容進行疊加(Hello,HelloWorld,HelloWorldWorld,......)
#import "MyViewController.h"
@interface MyViewController ()
//@property(nonatomic,strong)UILabel* label;
@property(nonatomic,assign)int y;
@property(nonatomic,strong)NSMutableString* str;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton* button=[UIButton buttonWithType:UIButtonTypeSystem];
button.frame=CGRectMake(130, 40, 60, 20);
button.backgroundColor=[UIColor yellowColor];
button.tintColor=[UIColor redColor];
[button setTitle:@"on" forState:UIControlStateNormal];
[button setTitle:@"off" forState:UIControlStateHighlighted];
//響應事件
[button addTarget:self action:@selector(show) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
self.y=100;//初始化
self.str=[[NSMutableString alloc]initWithString:@"Hello"];//初始化
}
-(void)show{
UILabel* label=[[UILabel alloc]init];
label.backgroundColor=[UIColor greenColor];
label.text=self.str;
label.frame=CGRectMake(20, self.y, 280, 20);
label.adjustsFontSizeToFitWidth=YES;
label.textColor=[UIColor redColor];
[self.view addSubview:label];
//只改變當前使用的值,出了範圍就是改變後的值
self.y+=30;
[self.str appendString:@"Wlord"];
}
@end
=======================================================================================================================
知識點
4、interface Builder(簡稱 IB) 界面構建器
1.interface Builder
設置界面
1.1 是什麼?
一個可視化的界面編輯工具軟件,在xcode4以後整合到了xcode中
1.2 做用?
經過可視化的界面設置,可以少寫或不寫代碼而完成界面的設計,從而減小在控制器的viewDidLoad中寫的大量有關建立控件及設置屬性的代碼
1.3 工做原理
將界面所需控件的設置保存到xib文件中,在建立控制器實例的時候,系統會根據指定的xib文件來自動建立視圖中的各個控件的實例、設置實例的屬性,將其用於對控制器自帶的視圖的初始化中。因此,在建立控制器實例時,須要使用initWithNibName方法來指定有關視圖的配置須要加載的文件是哪個
MyViewController* vc=[[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];//參數1:文件名 參數2:nil一般
1.4 所需文件
XxxxYyyy.h
XxxxYyyy.m
XxxxYyyy.xib (xml interface builder)
2. IBOutlet,IBAction
因爲控制器的視圖中所需的控件都由系統根據xib文件自動建立完成,因此view已經對這些控件對象是strong強引用了,可是,此時控制器沒法訪問系統建立的這些控件,因而須要經過特殊的方法來獲取系統建立的這些對象的引用。
1.1使用方式
1. 若是,是對IB中的對象添加屬性訪問,讓控件成爲一個外界能夠訪問的輸出口,則經過連線的方式,使其成爲控制其的IBOutlet屬性
@property (weak, nonatomic) IBOutlet UILabel *infolabel;//經過連線後生成的屬性(Ctrl+鼠標左鍵)
2.若是,是對IB中的對象添加事件的響應,則經過連線的方式,爲控件添加IBAction行爲事件
添加連線的方式:
a。打開拆分視圖,左邊爲xib文件,右邊爲xib對應的控制器m文件
b。選中控件,按下control
c。在控件上按下鼠標左鍵,拖拽到右側的指定位置
d。若是是添加輸出口,則拖拽到擴展中
@property (weak, nonatomic) IBOutlet UILabel *valueLabel;
e。若是是添加action,則拖拽到類的實現中,change方法
- (IBAction)changeValue:(UIStepper *)sender {
}
1.2 action的參數
在爲控件添加事件響應時,能夠添加一個參數,默認爲id類型,表明的是發生事件的源頭是哪一個控件,或者說本次事件的發送者是誰
在須要用到這個參數來區分連到同一個方法上的多個控件的時候,能夠在連線時,選擇type參數,設置爲具體的某種控件類型,不須要再在方法內進行類型轉換了。
例:
三個button控制一個label,而且將button的內容賦給label。只需將三個button都連線到一個方法當中。
- (IBAction)click:(UIButton *)sender {
self.infolabel.text=[sender titleForState:UIControlStateNormal];
}
1.3 使用IB連線時的注意事項
若是對IB中的控件連線後,又刪除,那麼此時刪掉的只是代碼中的變量或方法,並無刪掉界面中控件記錄的連線,必定要在xib中,選中控件,右鍵,查看綁定的線有幾條,將不須要的連線刪掉,纔不會出錯。
=================================================================================
知識點
5、基礎控件(UIStepper UISlider UISwitch UITextField )
1.UIStepper 步進控件
精確掌握
1.重要屬性:
.value 初始值
.maximumValue 最大值
.minimumValue 最小值
.stepValue 間隔
2.經常使用事件:
value Changed事件:當數值改變時觸發
2 .UISlider 滑塊控件
快速滑動的方式獲得一個可變數值
1.重要屬性:
.value
2.重要事件:
value Changed事件:當數值改變時觸發
//顯示滑塊控件的初始值
self.sliderLabel.text = [NSString stringWithFormat:@"%.2lf",self.slider.value];
例:三個滑塊控件控制一個label的漸變色,紅、綠、藍
#import "ColorViewController.h"
@interface ColorViewController ()
@property (weak, nonatomic) IBOutlet UISlider *redSlider;
@property (weak, nonatomic) IBOutlet UISlider *greenSlider;//鏈接控件生成屬性
@property (weak, nonatomic) IBOutlet UISlider *blueSlider;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
@implementation ColorViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.label.backgroundColor = [UIColor colorWithRed:self.redSlider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];
}
- (IBAction)changeRedColor:(UISlider *)sender {
self.label.backgroundColor = [UIColor colorWithRed:self.redSlider.value green:self.greenSlider.value blue:self.blueSlider.value alpha:1];//三個控件共用一個方法,賦給label
}
@end
3. UISwitch 開關控件
1.重要屬性:
.on (BOOL) 獲取或設置開關的狀態
.enabled(BOOL) 獲取或設置控件是否可用
//修改switch狀態
[self.switchControl setOn:NO animated:YES];
//設置switch不可用
self.switchControl.enabled = NO;
2.重要的事件:
valueChanged事件
例:兩個開關。主控制輔,主開,則輔能夠開關。主關,則輔不可操做
- (IBAction)mainSwitchChanged:(UISwitch *)sender {
//根據當前sender的狀態來決定下面的switch的狀態
[self.otherSwitch setOn:sender.on animated:YES];
//下面的switch能不能用,取決於sender的狀態
//sender 若是爲YES,enabled爲YES
//sender 若是爲NO,enabled爲NO
self.otherSwitch.enabled = sender.on;
}
4.UITextField 文本框控件
4.1 是什麼?
是單行的文本輸入框,支持用戶的輸入
4.2 屬性
.text 獲取或設置文本框內的文本
… …
4.3 系統彈出的鍵盤
第一響應者:當用戶觸摸界面時,系統會根據手指觸摸的位置層層定位到具體的控件,若是,本次觸點在文本框控件的區域內,那麼文本框就負責對本次的觸碰事件進行響應,因爲文本框比較特殊,因此係統自動將文本框設置爲響應事件的第一關,而且自動彈出鍵盤。
插播:
當用戶點擊屏幕後,首先開啓的是查找hit-View的過程。從window開始,給全部直接子視圖發hit-Test的消息,直到某一個控件沒有子視圖了,而且這個觸點在這個子視圖中,則返回這個控件,因而hit-View找到了
找到hit-View後,view則成爲了須要第一個爲這個事件提供響應的對象,若是,該對象沒有提供事件響應,則該事件對象會向視圖的父視圖繼續傳遞,若是父視圖依然沒有提供響應,則繼續向上傳遞,直到傳遞到UIApplication對象,依然沒有處理的話,則拋棄該事件。這個過程叫作響應者鏈。
4.4 如何關閉鍵盤
方法一:讓鍵盤放棄第一響應者的身份便可
[self.textField resignFirstResponder];
方法二:讓鍵盤所在的父視圖結束編輯狀態
[self.view endEditing:YES];
4.5何時關閉鍵盤呢?(關閉鍵盤的時機)
時機一:點擊鍵盤右下角的按鍵 選擇Did End On Exit事件 爲文本框添加一個 事件
時機二:點擊屏幕的空白部分
重寫控制器的touchesBegan:withEvent:方法 (不用鏈接方法)
例:
#import "MyViewController.h"
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//self.textField.text = @"xxxxxxx";
}
- (IBAction)openKeyboard:(UIButton *)sender {
//讓文本框成爲第一響應者
[self.textField becomeFirstResponder];
}
- (IBAction)closeKeyboard:(UIButton *)sender {
//方式一:讓文本框放棄第一響應者的身份
//[self.textField resignFirstResponder];
//方式二:讓文本框的父視圖放棄編輯狀態
[self.view endEditing:YES];
}
//時機一:點擊鍵盤右下角的按鍵,該事件觸發 鍵盤收起
- (IBAction)tapReturn:(UITextField *)sender {
//[sender resignFirstResponder];
[self.view endEditing:YES];
}
//時機二:點擊空白屏幕 鍵盤收起
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
[self.view endEditing:YES];
}
做業:
1.界面以下:
[輸入框][發送按鈕]
1)當點擊發送按鈕後,界面上會出現一個UILabel,內容就是輸入框中的內容,此時要求,收起鍵盤,清空輸入框
2)當用戶點擊鍵盤右下角的按鍵時,功能和1相同
3)label自己設置爲寬280,高40,距離左邊20個點
4)多個label不能重合
#import "MyViewController.h"
@interface MyViewController ()
//發送按鈕
@property (weak, nonatomic) IBOutlet UIButton *sendButton;
//文本框
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property(nonatomic,assign)float y;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//設置按鈕屬性
self.sendButton.backgroundColor=[UIColor redColor];
self.y=100;
}
//點擊發送按鈕,響應事件
- (IBAction)openKeyBound:(UIButton *)sender {
UILabel*label=[[UILabel alloc]init];
label.frame=CGRectMake(20, self.y, 280, 40);
NSLog(@"%@",self.textField.text);
label.text=self.textField.text;
[self.view addSubview:label];
self.y+=60;
[self.view endEditing:YES];
self.textField.text=nil;
}
//點擊左下角收起鍵盤
- (IBAction)tapReturn:(UITextField *)sender {
UILabel*label=[[UILabel alloc]init];
label.frame=CGRectMake(20, self.y, 280, 40);
NSLog(@"%@",self.textField.text);
label.text=self.textField.text;
[self.view addSubview:label];
self.y+=60;
[self.view endEditing:YES];
self.textField.text=nil;
[self.view endEditing:YES];
}
2.界面以下:
[輸入框 帳號]
[輸入框 密碼]
[登陸 按鈕]
[UILabel 顯示當前狀態(登陸後顯示用戶名,沒登陸顯示未登陸)]
1)用戶輸入完用戶名和密碼後,點擊登陸,判斷是否能夠登陸,若是登陸成功,label上顯示當前用戶的用戶名,若是沒有登陸,顯示未登陸
2)當用戶沒有填寫用戶名和密碼時,點擊登陸,提供用戶輸入用戶名和密碼
3)第一個textField支持Next功能,第二是Done
#import "MyViewController.h"
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textUse;//文本框1連線
@property (weak, nonatomic) IBOutlet UITextField *textPassword;//文本框2連線
@property (weak, nonatomic) IBOutlet UILabel *labelShow;//顯示登錄成功的連線
@property (weak, nonatomic) IBOutlet UILabel *label;//顯示輸入有誤的連線
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)buttonValue:(UIButton *)sender {
if ([self.textUse.text isEqualToString:@"fcp"]&&[self.textPassword.text isEqualToString:@"123"]) {
self.labelShow.text=@"fcp用戶登錄成功";
self.label.text=@"";
}else{
self.label.text=@"用戶名或密碼錯誤";
self.labelShow.text=@"未登陸";
}
[self.view endEditing:YES];
self.textUse.text=nil;
self.textPassword.text=nil;
}
//實現next功能
- (IBAction)frist:(UITextField *)sender { //文本框1連線,實現點回車到next功能
[self.textPassword becomeFirstResponder];
}
- (IBAction)done:(UITextField *)sender {
[self.view endEditing:YES];
}
@end
=====================================================================
知識點
6、UIAlertView、UIActionSheet
1.UIAlertView(警告框)
1.1 建立警告框,設置樣式
- (IBAction)alertView:(UIButton *)sender {//建立button按鈕
//建立警告框的實例
//UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"警告" message:@"提示信息message" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
//若有多個otherButtonTitles,先顯示otherButtonTitles。otherButtonTitles有一個,cancelButtonTitle在左邊
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"警告" message:@"提示信息message" delegate:nil cancelButtonTitle:@"NO" otherButtonTitles:@"YES",nil];
//顯示警告框
[alert show];//系統自帶show方法
}
1.2建立有提示信息輸入的警告框
- (IBAction)alertViewInput:(id)sender {
//建立警告框
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"enter your login info" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
//設置警告框的樣式
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
//顯示警告框
[alert show];
}
1.3建立有提示信息輸入的警告框
UIAlertViewStyleDefault
UIAlertViewStyleSecureTextInput,//單行密碼形式
UIAlertViewStylePlainTextInput, //單行正常形式
UIAlertViewStyleLoginAndPasswordInput//用戶名和密碼
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
1.4 如何獲取用戶在警告框上的選擇——委託
a)什麼是委託:
一個對象(對象A)讓另外一個對象(對象B)幫它作事情(發消息)。
b)委託協議:
是委託方要求代理方所符合的規則,這些規則對應的就是一組方法,而且每一個方法的第一個參數都是委託方的引用,每一個方法的名稱用於描述方法的執行時機
c)設置控制器實例成爲alertView的代理方的步驟
1)控制器遵照協議//委託方定義協議的名稱要求"委託方name+Delegate"
2)控制器實現協議中的方法//要想成爲代理方,必須知足委託方定義的協議
//第一個參數永遠是委託方的引用,點進協議直接複製
3)在建立UIAlertView時設定控制器實例爲代理方法
例:經過輸入用戶名和密碼信息,點擊按鈕。取出用戶名和密碼
/*1.設置控制器成爲警告框的代理,須要控制器(代理方)遵照協議*/
@interface AlertViewController ()<UIAlertViewDelegate>
@end
@implementation AlertViewController
- (IBAction)alertViewDelegate:(id)sender {
//3.設置了警告框的代理方爲當前控制器實例,因而,當用戶點擊了警告框上的某個按鈕時該動做的處理就交給了控制器實例來響應
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"your choice" delegate:self cancelButtonTitle:@"NO" otherButtonTitles:@"YES",nil]; //self
alert.alertViewStyle = UIAlertViewStyleLoginAndPasswordInput;
[alert show];
}
/*2.設置控制器成爲警告框的代理,實現協議中的方法選擇哪一個方法實現,根據不一樣的方法對應的執行時機能夠從方法名判斷髮消息的時機。
方法的第一個參數必定是委託方的引用
*/
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//目標:當點擊YES按鈕時,在控制器打印輸入的用戶名和密碼
if (alertView.cancelButtonIndex != buttonIndex) {
//獲取用戶名
NSString *loginName = [alertView textFieldAtIndex:0].text;
//獲取密碼
NSString *pwd = [alertView textFieldAtIndex:1].text;
NSLog(@"name:%@ , pwd:%@",loginName,pwd);
}
結果:
name:ggfg , pwd:sgg
1.5 如何區分用戶點擊的按鈕
在 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex方法中,第二個參數爲點擊的按鈕的索引,可使用如下幾種方法進行判斷
方法一:直接判斷索引值區分不一樣的按鈕
方法二:根據索引值獲取按鈕的title,進行區分
方法三:判斷索引是不是cancelButtonIndex進行區分
//根據點擊的按鈕的索引獲取點擊的按鈕的標題
NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
方法1:判斷標題來區分不一樣的動做
if ([title isEqualToString:@"YES"]) {
// NSLog(@"點擊了YES按鈕");//根據點擊了按鈕OK執行的動做 }else{
// NSLog(@"點擊了NO按鈕");
}
方法3:也能夠經過判斷是否是cancel按鈕的索引
//來判斷是否點擊了cancel按鈕
if (alertView.cancelButtonIndex == buttonIndex)
{
// NSLog(@"點擊了NO按鈕");
}
}
1.6 如何獲取alertView中輸入框內的文本
利用alertView的textFieldAtIndex:方法,得到不一樣索引位置上的文本框,而後反問text屬性便可
NSString *pwd = [alertView textFieldAtIndex:1].text;
2.UIActionSheet(操做表)
2.1 建立操做表
//建立actionSheet的實例
UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"cancel" destructiveButtonTitle:@"destructive" otherButtonTitles:@"微博",@"微信",@"朋友圈", nil];
//顯示actionSheet
[sheet showInView:self.view];
2.2 判斷用戶點擊的不一樣的按鈕
a)須要控制器實例遵照協議
b)須要控制器實現協議中的方法
#import "ActionSheetViewController.h"
@interface ActionSheetViewController ()<UIActionSheetDelegate>//遵照協議
@end
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
//區分點擊的按鈕
//NSLog(@"%d",buttonIndex);//獲取按鈕標題對應的值
//獲取按鈕上的標題
//NSLog(@"%@",[actionSheet buttonTitleAtIndex:buttonIndex]);
if (actionSheet.cancelButtonIndex == buttonIndex) {
//....點擊了cancel
}
if (actionSheet.destructiveButtonIndex == buttonIndex) {
//....點擊了有破壞性的那個危險按鈕
}
}
=====================================================================
知識點
7、MVC 界面開發
1.什麼是設計模式
mvc只是其中一種,對某一類具體問題,總結出來的一套最優的解決方案
1.MVC:
1.Model(模型) View(視圖)Controller(控制器) 的縮寫
Model:程序中處理數據邏輯 (數據存儲、業務邏輯、多線程、網絡傳輸、文件存儲)
View:程序中處理數據顯示
Controller:View和Model的媒介
2.優勢:
1.耦合性低
2.重用性高
3.可維護性高 (結構清晰、可重用、方便維護)
***1.對引用數據類型,在保證在第一次訪問改屬性時,數組空間被建立出來。因此就得重寫屬性get和set方法:
//重寫suit屬性的set方法
-(void)setSuit:(NSString *)suit{
if ([[Card allSuit]containsObject:suit]) {Card類,+(NSArray*)allSuit;
_suit=suit;
}
}
//重寫cardInfo屬性的get方法
-(NSString*)cardInfo{
_cardInfo=[self.suit stringByAppendingString:self.rank];
return _cardInfo;
}
//保證在第一次訪問改屬性時,數組空間被建立出來
-(NSMutableArray *)allCards{
if (!_allCards) {
_allCards=[NSMutableArray array];
}
return _allCards;
}
**2.隨機數
隨機數從0開始的一個無符號正整數
unsigned int index=arc4random()%52 0-51
特色:不須要設置隨機算子
**3.lazy loading懶加載
例:
MVC案例(重在體會)
里程碑1:
可以隨機出12張紙牌,將紙牌信息顯示到界面上
里程碑2:
根據用戶選中的紙牌,進行判斷,生成新的結果,將結果顯示到界面上
里程碑3:
再根據遊戲規則統計分數
建立文件夾model:
Card.h
#import <Foundation/Foundation.h>
/*
用於描述一張紙牌
屬性:
花色,大小,牌面信息,朝向,是否匹配
方法:
無
*/
@interface Card : NSObject
@property(nonatomic,strong)NSString *suit;//花色
@property(nonatomic,strong)NSString *rank;//大小
@property(nonatomic,strong,readonly)NSString *cardInfo;
@property(nonatomic,getter=isFaceUp)BOOL faceUp;
@property(nonatomic,getter=isMatched)BOOL matched;
-(instancetype)initWithSuit:(NSString *)suit andRank:(NSString *)rank;
+(NSArray *)allSuit;
+(NSArray *)allRank;
@end
Card.m
#import "Card.h"
@interface Card ()
@property(nonatomic,strong,readwrite)NSString *cardInfo;
@end
@implementation Card
//重寫suit屬性的set方法
- (void)setSuit:(NSString *)suit{
if ([[Card allSuit] containsObject:suit]) {
_suit = suit;
}
}
//重寫rank屬性的set方法
- (void)setRank:(NSString *)rank{
if ([[Card allRank] containsObject:rank]) {
_rank = rank;
}
}
//重寫cardInfo屬性的get方法
- (NSString *)cardInfo{
_cardInfo = [self.suit stringByAppendingString:self.rank];
return _cardInfo;
}
- (instancetype)initWithSuit:(NSString *)suit andRank:(NSString *)rank{
self = [super init];
if (self) {
self.suit = suit;
self.rank = rank;
self.faceUp = NO;
self.matched = NO;
}
return self;
}
+ (NSArray *)allSuit
{
return @[@"♠️",@"❤️",@"♣️",@"♦️"];
}
+ (NSArray *)allRank
{
return @[@"A",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"J",@"Q",@"K"];
}
@end
Poker.h
#import <Foundation/Foundation.h>
/*用於描述一副撲克牌,可以容納52張紙牌對象*/
@interface Poker : NSObject
@property(nonatomic,strong)NSMutableArray *allCards;
@end
Poker.m
#import "Poker.h"
#import "Card.h"
@implementation Poker
//重寫allCards屬性的get方法
//保證在第一次訪問該屬性時,數組空間被建立出來
- (NSMutableArray *)allCards{
if (!_allCards) {
_allCards = [NSMutableArray array];
}
return _allCards;
}
-(id)init{
self = [super init];
if (self) {
//建立52張紙牌對象,並放入到allCards中
for (NSString *suit in [Card allSuit]) {
for (NSString *rank in [Card allRank]) {
Card *card = [[Card alloc]initWithSuit:suit andRank:rank];
[self.allCards addObject:card];
}
}
}
return self;
}
@end
Poker.h
#import <Foundation/Foundation.h>
#import "Poker.h"
/*
用於描述遊戲類,存儲遊戲的數據,
及對數據的處理邏輯
*/
@interface Game : NSObject
@property(nonatomic,strong)NSMutableArray *randomCards;
@property(nonatomic)NSInteger score;
-(instancetype)initWithCountCard:(NSInteger)count inPoker:(Poker *)poker;
-(void)tapCardAtIndex:(NSInteger)index;
@end
Poker.m
#import "Game.h"
#import "Card.h"
@implementation Game
- (NSMutableArray *)randomCards{
if (!_randomCards) {
_randomCards = [NSMutableArray array];
}
return _randomCards;
}
-(instancetype)initWithCountCard:(NSInteger)count inPoker:(Poker *)poker{
self = [super init];
if (self) {
//根據指定的count做爲隨機的次數
//從poker中隨機一張牌,將牌放入到randomCards
for (NSInteger i=0; i<count; i++) {
//使用隨機函數獲得一個0-51的下標
unsigned int index = arc4random()%poker.allCards.count;
//從poker中找到隨機位置對應的牌
Card *card = poker.allCards[index];
//將牌從poker中移除
[poker.allCards removeObject:card];
//記錄牌到randomCards中
[self.randomCards addObject:card];
}
self.score=0;
}
return self;
}
/*
1.獲取index位置上的card對象
2.若是card面兒朝上,則修改成面兒朝下
3.若是card面兒朝下,首先修改成面兒朝上
將card與數組中其餘的(已經朝上而且尚未被matched)牌進行比對
4.比對的原則:
若是兩張牌的花色相同,則兩張牌被matched
若是兩張牌的大小相同,則兩張牌被matched
不然,將被比對的牌翻回背面便可
*/
- (void)tapCardAtIndex:(NSInteger)index{
Card *card = self.randomCards[index];
if (card.isFaceUp) {
card.faceUp = NO;
}else{
card.faceUp = YES;
for (NSInteger i=0;i<self.randomCards.count;i++) {
if (i != index) {
Card *otherCard = self.randomCards[i];
if (otherCard.isFaceUp && !otherCard.isMatched) {
//比對花色
if ([card.suit isEqualToString:otherCard.suit]) {
card.matched = YES;
otherCard.matched = YES;
self.score+=1;
}else if([card.rank isEqualToString:otherCard.rank]){
card.matched = YES;
otherCard.matched = YES;
self.score+=4;
}else{
otherCard.faceUp = NO;
}
}
}
}
}
}
@end
GameViewController.h 繼承ViewController的控制器
GameViewController.m
#import "GameViewController.h"
#import "Game.h"
#import "Poker.h"
#import "Card.h"
@interface GameViewController ()
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons;
//構成遊戲而增長的屬性
@property(nonatomic,strong)Game *game;
@property(nonatomic,strong)Poker *poker;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@end
@implementation GameViewController
//經過重寫屬性的get方法,實現lazy loading
- (Poker *)poker{
if (!_poker) {
_poker = [[Poker alloc]init];
}
return _poker;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.game = [[Game alloc]initWithCountCard:self.buttons.count inPoker:self.poker];
[self updateCard];
self.scoreLabel.text=@"0";
}
//更新Model中的牌信息到界面上
-(void)updateCard{
//遍歷每個按鈕,根據按鈕的座標找到位置相同的隨機的紙牌,並顯示
for (NSUInteger index = 0; index<self.buttons.count; index++) {
//獲取該位置的紙牌對象
Card *card = self.game.randomCards[index];
UIButton *button = self.buttons[index];
[button setTitle:[self titleForCard:card] forState:UIControlStateNormal];
[button setBackgroundImage:[UIImage imageNamed:[self imageNameForCard:card]]forState:UIControlStateNormal];
button.enabled = !card.isMatched;
}
//更新分數標籤
self.scoreLabel.text=[NSString stringWithFormat:@"%d",self.game.score];
}
//根據紙牌信息返回按鈕上要顯示的文字
-(NSString *)titleForCard:(Card *)card{
return card.isFaceUp?card.cardInfo:@"";
}
//根據紙牌信息返回按鈕上要顯示的圖片
-(NSString *)imageNameForCard:(Card *)card{
return card.isFaceUp?@"cardfront.png":@"cardback.png";
}
- (IBAction)chooseCard:(UIButton *)sender
{
NSInteger index = [self.buttons indexOfObject:sender];
//將索引值傳遞給Model
[self.game tapCardAtIndex:index];
//更新界面
[self updateCard];
}
@end
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "GameViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
GameViewController *vc = [[GameViewController alloc]initWithNibName:@"GameViewController" bundle:nil];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
================================================================================================================
知識點
8、多MVC開發 ( 多界面開發)
1.多MVC
每個界面的顯示都是一套獨立的MVC,因爲應用程序須要多個界面,因此構成了多套MVC。
注意:其中C和V是綁在一塊兒的,可是M因爲實現了程序中的數據存儲以及業務邏輯,是與C和V分開的一套體系,因此多套C+V組合,能夠共用一個M。可是,不容許v的共用,每個c都有本身的v,不能由於要切換界面,而讓某一個c拋棄本身帶的v,換別的c下面的v。
1.1 多界面的切換
原理:更換了c就實現了更換了v
1.2 如何實現c的更換?
方向:從controlA —> 推出controlB
[controlA presentViewController:]
方向:A推出B以後,想從B再回到A
[controlB dismissViewController:];
例:
建立兩個控制器類A和B,每一個類的xib界面拉入一個button按鈕,而後添加方法。
功能:點擊A界面的按鈕回到B界面。點擊B界面按鈕返回到A 界面
FristViewController.h
FristViewController.m
#import "FristViewController.h"
#import "SecondViewController.h"
@interface FristViewController ()
@end
@implementation FristViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)gotoSecondView:(id)sender {//A界面的方法
//建立要推出的vc的實例
SecondViewController* secondVc=[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
//從當前控制器下方推出新的vc
[self presentViewController:secondVc animated:YES completion:nil];
}
SecondViewController.h
SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//返回到第一個界面
- (IBAction)goBack:(id)sender {//B界面的方法
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
2.界面之間的正向傳值
2.1 什麼是正向傳值:
當從控制器A推出新的控制器B的時候,A將界面中接受的數據同時也傳給了B,由B進行展現或處理的過程
2.2 如何實現正向傳值:
step1:爲控制器B增長公開的屬性用於接收外界傳入的值
step2:控制器A爲了推出B,會建立B的實例,建立完實例後,在推出以前,將要傳遞的屬於存到B公開的屬性中便可
step3:推出的控制器B在viewWillAppear中將數據展現到界面中
例:
控制器A界面的內容能夠傳到B界面顯示
FristViewController.h
FristViewController.m
#import "FristViewController.h"
#import "SecondViewController.h"
@interface FristViewController ()
@property (weak, nonatomic) IBOutlet UILabel *textField;//界面1中的文字信息屬性 連線A中的
@end
@implementation FristViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)gotoSecondView:(id)sender {//A界面的方法
//建立要推出的vc的實例
SecondViewController* secondVc=[[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
//將文本框的值賦到的secondVc公開屬性中
secondVc.content=self.textField.text;
//從當前控制器下方推出新的vc
[self presentViewController:secondVc animated:YES completion:nil];
}
SecondViewController.h
#import <UIKit/UIKit.h>
@interface SecondViewController : UIViewController
@property(nonatomic,strong)NSString*content;
//公開屬性
@end
SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;//界面2的文本屬性 連線B界面中的label
@end
@implementation SecondViewController
//建立視圖時被執行一次
- (void)viewDidLoad
{
[super viewDidLoad];
self.label.text=self.content;
}
//視圖顯示以前被執行,能夠執行屢次
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//顯示公開的屬性
self.label.text=self.content;
}
//返回到第一個界面
- (IBAction)goBack:(id)sender {//B界面的方法
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
3.界面之間的反向傳值
3.1 什麼是反向傳值 ?
從A推出了B以後,當從B返回到(dismiss)推出它的A時,傳遞了數據回來,由A進行顯示的過程
3.2 如何實現
step1:B中公開一個能夠接收A引用的屬性aVC
step2:A中公開一個能夠接收返回數據的屬性message
step3:A推出B以前,將本身的引用傳給B
step4:B在dismiss以前,將要返回的數據傳給持有的A的引用中公開的message屬性
step5:在A的viewWillAppear中,顯示message的內容
例:
B界面的內容返回到A界面
1.方法一:缺點耦合度過高
AViewController.h
#import <UIKit/UIKit.h>
@interface AViewController : UIViewController
@property(nonatomic,strong)NSString *message;公開屬性
@end
AViewController.m
#import "AViewController.h"
#import "BViewController.h"
@interface AViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label; 連線label,顯示返回的值
@end
@implementation AViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
//呈現界面以前將message內的數據顯示到標籤上
self.label.text = self.message;
}
- (IBAction)gotoBViewController:(id)sender {
BViewController *bVC = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
//將當前控制器(A)引用傳給B
bVC.aVC = self;
[self presentViewController:bVC animated:YES completion:nil];
}
@end
BViewController.h
#import <UIKit/UIKit.h>
#import "AViewController.h"
@interface BViewController : UIViewController
//公開一個屬性,存放A的引用
@property(nonatomic,strong)AViewController *aVC;
@end
BViewController.m
#import "BViewController.h"
@interface BViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField; 連線文本框,B界面輸入的內容
@end
@implementation BViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)goback:(id)sender {
self.aVC.message = self.textField.text;
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
2.方法二:
4.使用 委託 實現 反向傳值
委託方:推出的B 代理方:推出B的那個A
委託方要作的三件事:
.h文件 a。定義協議1)協議名稱 : 類名+Delegate 2)方法的第一個參數必定是委託方本身 3)方法名儘可能體現發消息的時機
.h文件 b。添加delegate屬性 @property(nonatomic,weak)id<BViewControllerDelegate> delegate;
.m文件c。選擇合適的時機給代理髮消息
代理方要作的三件事:
a。遵照協議
b。實現方法
c。將本身設置爲代理方
AViewController.h
AViewController.m
#import "AViewController.h"
#import "BViewController.h"
//代理方要作的三件事
//1.遵照協議
@interface AViewController ()<BViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
@implementation AViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)gotoB:(id)sender {
BViewController *bVC = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
//3.將本身設置爲bVC的代理方
bVC.delegate = self;
[self presentViewController:bVC animated:YES completion:nil];
}
//2.實現方法
- (void)bViewController:(BViewController *)bVC inputFinishedWithMessage:(NSString *)message{
self.label.text = message;
}
BViewController.h
#import <UIKit/UIKit.h>
@class BViewController;
//1.定義協議
/*
要點: 1)協議名稱 : 類名+Delegate
2)方法的第一個參數必定是委託方本身
3)方法名儘可能體現發消息的時機
*/
@protocol BViewControllerDelegate <NSObject>
-(void)bViewController:(BViewController *)bVC inputFinishedWithMessage:(NSString *)message;
@end
@interface BViewController : UIViewController
//2.添加一個公開的delegate屬性
@property(nonatomic,weak)id<BViewControllerDelegate> delegate;
@end
BViewController.m
#import "BViewController.h"
@interface BViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField;
@end
@implementation BViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)goBack:(id)sender {
//3.合適的時機,給代理方發消息
[self.delegate bViewController:self inputFinishedWithMessage:self.textField.text];
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
做業:
1.做業1參考圖片 homework1.png
2.星座運程App
a。界面1:有一個按鈕「請選擇您的星座」,用戶點擊後,跳轉到第二個界面
b。界面2:有12個星座(能夠作成12個按鈕)可選,選定後,返回到第一個界面
c。界面1:顯示選擇的那個星座的運程
AViewController.h
AViewController.m
#import "AViewController.h"
#import "StarViewController.h"
@interface AViewController ()<StarViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;連線返回值label的屬性
@end
@implementation AViewController
- (void)starViewController:(StarViewController *)sVC chooseStarWithMessage:(NSString *)mes{
self.resultLabel.text = mes;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)chooseStar:(id)sender {連線按鈕的點擊方法
StarViewController *svc = [[StarViewController alloc]initWithNibName:@"StarViewController" bundle:nil];
svc.delegate = self;
[self presentViewController:svc animated:YES completion:nil];
}
@end
StarViewController.h
#import <UIKit/UIKit.h>
@class StarViewController;
@protocol StarViewControllerDelegate <NSObject>
-(void)starViewController:(StarViewController *)sVC chooseStarWithMessage:(NSString *)mes;
@end
@interface StarViewController : UIViewController
@property(nonatomic,weak)id<StarViewControllerDelegate> delegate;
@end
StarViewController.m
#import "StarViewController.h"
@interface StarViewController ()
@property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *buttons; 連線創建4個星座的屬性
@property(nonatomic,strong)NSArray *array;
@end
@implementation StarViewController
//重寫array屬性的get方法
- (NSArray *)array{
if (!_array) {
_array = @[@"恭喜發財",@"萬事如意",@"順風順水",@"新年快樂"];
}
return _array;
}
- (IBAction)chooseStar:(UIButton *)sender { 連線創建4個星座的方法
NSInteger index = [self.buttons indexOfObject:sender];
[self.delegate starViewController:self chooseStarWithMessage:self.array[index]];
[self dismissViewControllerAnimated:YES completion:nil];
}
3.文本建立器
a。界面1:有一個按鈕「建立文本」,點擊後進入到界面2
b。界面2:
x:[TextField] width:[TextField]
y:[TextField] height:[TextField]
text:[TextField]
【肯定按鈕】
當用戶點擊確認按鈕後,返回到界面1
c。界面1:根據用戶剛纔的輸入,建立一個UILabel對象,label的frame根據剛纔的輸入肯定,label的內容也是根據輸入肯定,將label加入到界面1中
FirstViewController.h
FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@interface FirstViewController ()<SecondViewControllerDelegate>
@property(nonatomic,assign)NSInteger x;
@property(nonatomic,assign)NSInteger y;
@property(nonatomic,assign)NSInteger w;
@property(nonatomic,assign)NSInteger h;
@end
@implementation FirstViewController
-(void)secondViewController:(SecondViewController *)secondVC sendX:(NSString *)x sendY:(NSString *)y sendWidth:(NSString *)width sendHeight:(NSString *)height sendTextField:(NSString *)textField{
self.x=[x intValue] ;
self.y=[y intValue] ;
self.w=[width intValue] ;
self.h=[height intValue] ;
UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(self.x, self.y, self.w, self.h)];
label.text=textField;
[self.view addSubview:label];
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)gotoSecond:(UIButton *)sender { 連線建立文本按鈕
SecondViewController* second = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil];
second.delegate = self;
[self presentViewController:second animated:YES completion:nil];
}
@end
SecondViewController.h
c#import <UIKit/UIKit.h>
@class SecondViewController;
@protocol SecondViewControllerDelegate <NSObject>
-(void)secondViewController:(SecondViewController*)secondVC sendX:(NSString*)x sendY:(NSString*)y sendWidth:(NSString*)width sendHeight:(NSString*)height sendTextField:(NSString*)textField;
@end
@interface SecondViewController : UIViewController
@property(nonatomic,weak)id<SecondViewControllerDelegate> delegate;
@end
SecondViewController.m
#import "SecondViewController.h"
@interface SecondViewController ()
@property (weak, nonatomic) IBOutlet UITextField *x;
@property (weak, nonatomic) IBOutlet UITextField *width;
@property (weak, nonatomic) IBOutlet UITextField *y;
@property (weak, nonatomic) IBOutlet UITextField *height;
@property (weak, nonatomic) IBOutlet UITextField *textField; 連線5個文本框
@end
@implementation SecondViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)goBack:(UIButton *)sender { 連線肯定按鈕
[self.delegate secondViewController:self sendX:self.x.text sendY:self.y.text sendWidth:self.width.text sendHeight:self.height.text sendTextField:self.textField.text];
[self dismissViewControllerAnimated:YES completion:nil];
}
@end
=========================================================================
知識點
9、UINavigationController(導航控制器)
1.UINavigationControlle
1.1 是什麼?
繼承自UIViewController,依然是一種控制器,可是,這種控制器沒有具體的view,是管理控制器的控制器
1.2 優勢?
可以管理和控制VC的走向,比present方式更清晰
1.3 如何使用?
step1:建立UINavigationController的實例
step2:建立一個具體的vc實例,並將這個vc設置爲UINavigationController的根視圖控制器
step3:設置navigationController爲window的根視圖控制器
step4:想推出新的vc時,可使用pushViewController的方法
step5:想回退到上一個vc時,能夠不寫代碼;或者是使用popViewController的方法
1.4 內部原理
1)navi內部有一個能夠存儲多個vc的數組,就是self.navigationController.viewControllers屬性;而且這個數組使用「棧」的方式來管理數據。「棧」的特色:先進後出,後進先出。
2)navi必須 有一個根視圖控制器做爲第一個展現的vc
3)push出一個新的vc時,就是往棧屬性中入棧一個vc對象,新的vc入棧以前顯示的那個vc不會被釋放
4)pop現有vc時,纔是將這個vc釋放掉
5)不能pop根vc
例:
A界面退出B,B返回A
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "AViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
AViewController* aVC=[[AViewController alloc]initWithNibName:@"AViewController" bundle:nil];
//建立導航控制器的實例
UINavigationController*navi=[[UINavigationController alloc]initWithRootViewController:aVC];
//將navi設置爲window的跟視圖
self.window.rootViewController=navi;
[self.window makeKeyAndVisible];
return YES;
}
AViewController.h
AViewController.m
#import "AViewController.h"
#import "BViewController.h"
@interface AViewController ()
@end
@implementation AViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)gotoB:(id)sender {
BViewController* bVC=[[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
[self.navigationController pushViewController:bVC animated:YES];//經過navigationController屬性退出B界面
}
@end
BViewController.h
BViewController.m
#import "BViewController.h"
@interface BViewController ()
@end
@implementation BViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//返回(也能夠不寫,經過navigationController自帶的back返回)
- (IBAction)goback:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
@end
2.配置導航欄
只針對當前的界面
1.訪問導航欄:self.navigationItem
2.導航欄包含三部分:
1)左側的按鈕區域
self.navigationItem.leftBarButtonItem/s
self.navigationItem.leftBarButtonItem=r;方法同右側
2)中間的title
self.title = @「」;
中間title部分:在viewDidLoad中配置導航欄標題,在哪一個界面顯示就配置的哪一個界面的標題欄
- (void)viewDidLoad
{
[super viewDidLoad];
//配置導航欄標題
self.title=@"A界面";
}
3)右側的按鈕區域
self.navigationItem.rightBarButtonItem/s
- (void)viewDidLoad
{
[super viewDidLoad];
//配置導航欄標題
self.title=@"A界面";
//配置導航欄右側按鈕內容
UIBarButtonItem* r=[[UIBarButtonItem alloc]initWithTitle:@"下一個" style:UIBarButtonItemStyleDone target:self action:@selector(gotoB:)];
//self.navigationItem.rightBarButtonItem=r;
UIBarButtonItem* r2=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:nil action:nil];//系統自帶顯示圖標 搜索
self.navigationItem.rightBarButtonItems=@[r,r2];
4)按鈕的類型:UIBarButtonItem類型
可使用initWithTitle。。方法建立自定義
文本內容的按鈕
可使用initWithBarButtonSystemItem…方法建立系統定義好的,有固定外觀的按鈕
3.配置工具欄
默認是全局的
1. 訪問工具欄:self.toolBarItem
2.工具欄中加載的也是UIBarButtonItem類型的按鈕
3.將默認隱藏的工具欄顯示出來,默認是隱藏
self.navigationController.toolbarHidden = NO;
1)只在一個界面顯示,其餘界面隱藏 ( 須要在其餘界面加上self.navigationController.toolbarHidden = YES;)
//和顯示有關,和建立沒有關係
-(void)viewWillAppear:(BOOL)animated{
//將默認隱藏的工具欄顯示出來
self.navigationController.toolbarHidden = NO;
}
2)設置推出bvc時,底部區域全部bar隱藏 (其餘界面不須要修改)
在須要設置導航的界面,經過viewDidLoad方法顯示出來,而後在建立推出其它界面時隱藏bvc.hidesBottomBarWhenPushed=YES;
- (IBAction)gotoBViewController:(id)sender {
BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
//設置推出bvc時,底部區域隱藏
bvc.hidesBottomBarWhenPushed=YES;
[self.navigationController pushViewController: bvc animated:YES];
}
4.特效按鈕:木棍(固定的) 調整工具欄的距離,通常放在最左、最右。能夠設置寬度width
UIBarButtonSystemItemFixedSpace
5.特效按鈕:彈簧(隨着之間的距離自動調整) 放在兩個對象之間
例:暫停,前進,後退按鈕顯示在工具欄中。
- (void)viewDidLoad
{
[super viewDidLoad];
//將默認隱藏的工具欄顯示出來
self.navigationController.toolbarHidden = NO;
//配置工具欄
UIBarButtonItem *item1 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemPlay target:nil action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:nil action:nil];
UIBarButtonItem *item3 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFastForward target:nil action:nil];
//特效按鈕:木棍
UIBarButtonItem *item4 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
item4.width = 40;
//特效按鈕:彈簧
UIBarButtonItem *item5 = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
self.toolbarItems = @[item4,item2,item5,item1,item5,item3,item4];
}
@end
4.多個導航之間切換
是當前界面的導航跳轉到另外一個界面的導航,導航與導航之間的切換(從下面推出)。此時就不用push 和pop 來推出和返回了(從左面推出)
1.推出時修改成:
UINavigationController*navi2=[[UINavigationController alloc]initWithRootViewController:bvc];
[self.navigationController presentViewController:navi2 animated:YES completion:nil];
2.返回到推出的界面
[self.navigationController dismissViewControllerAnimated:YES completion:nil];
小結:導航控制器能夠設置的屬性的做用於範圍
屬性:
.title
.navigationItem.leftBarButtonItem/s
.navigationItem.rightBarButtonItem/s
.toolbarItems
以上四個屬性的設置只負責當前所屬的vc
屬性:
.navigationController.toolbarHidden
設置後,針對導航控制器管理的全部vc都生效
*** 問:在不一樣的vc中均可以訪問self.navigationController,那麼是同一個導航控制器嗎?
答:是
推出的界面,
===============================================================================
知識點
10、UIImageView
1.數據類型:NSString —>UILabel 顯示
UIImage—>UIImageView 顯示
2. 如何使用
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//建立圖片
UIImage *image = [UIImage imageNamed:@"Elephant.jpg"];//圖片名稱
//建立圖片控件,此時imageView的尺寸和建立時使用的圖片的尺寸同樣大
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
//設置圖片view的frame
imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);//必定要設置尺寸,否則不會顯示
//設置imageView爲圓角
imageView.layer.cornerRadius = 30;
imageView.layer.masksToBounds = YES;
//設置圖片view的內容顯示方式
imageView.contentMode = UIViewContentModeScaleAspectFit;
//將圖片控件添加到視圖中
[self.view addSubview:imageView];
}
@end
3.擁有屬性
1.屬性:
contentMode用於設置view內容顯示的方式
1)UIViewContentModeScaleToFill:
修改寬高比,適應imageView的區域大小,圖片會被拉伸,不留白邊
2)UIViewContentModeScaleAspectFit:
維持寬高比不變的狀況下,將整張圖片可見,因爲圖片的寬高比和設置的imageView的frame的寬高好比果不協調的話,可能會留白邊兒。
3)UIViewContentModeScaleAspectFill:
保持寬高比不變的狀況下,將imageView所佔的區域填滿,因此只會顯示圖片的一部分,不會留白
2.屬性:
layer.cornerRadius設置圓角的半徑
layer.masksToBounds開啓按邊緣遮罩
===========================================================================
知識點
11、UIScrollView
1 .做用:
在有限的區域內,顯示更多的數據或圖片
2 .本質:
管理view的view,scrollView自己沒有任何的外觀,依靠添加到scrollView中的其餘視圖來完成界面的顯示
3 .如何使用
//imageView尺寸比較大,與圖片同樣大
UIImageView* iV=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"Elephant.jpg"]];
UIScrollView*sV=[[UIScrollView alloc]init];//建立scrollView的實例
sV.frame=CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);//設置scrollView的frame
[sV addSubview:iV];//將圖片控件添加到scrollView中
[self.view addSubview:sV]; //將滾動視圖添加的view中
4.重要的屬性:
.frame 設置scrollView用多大的窗口來顯示內容
.contentSize設置了可滾動的區域的大小
.contentOffset設置frame定點與內容的左頂點的偏移座標
.contentInset設置內容與邊界之間的上、左、下、右的距離
其餘屬性:
.bounces 是否能夠邊緣彈跳
.showsHorizontalScrollIndicator
.showsVerticalScrollIndicator
.indicatorStyle
1. //設置scrollView可滾動查看的內容的區域大小
scrollView.contentSize = imageView.frame.size;
//設置滾動視圖不能夠彈跳
scrollView.bounces = NO;
//設置水平滾動條是否顯示
scrollView.showsHorizontalScrollIndicator = NO;
//設置豎直滾動條是否顯示
scrollView.showsVerticalScrollIndicator = NO;
//設置滾動條顏色
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
2.//設置導航框,點擊移動按鈕,即可以跳到圖片的設定範圍
self.title = @"scrollView";
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"移動" style:UIBarButtonItemStyleDone target:self action:@selector(move)];
-(void)move{
self.sV.contentOffset=CGPointMake(1000, 1000);
self.sV.contentInset = UIEdgeInsetsMake(300, 300, 300, 300);
}
5.如何實現滾動視圖內容的縮放
step1:設置滾動內容縮放的最大比率
step2:設置滾動內容縮放的最小比率
step3:回答問題,說明scrollView裏面的哪一個子視圖須要縮放
//設置最大比率
scrollView.maximumZoomScale = 1;
CGFloat xScale = scrollView.frame.size.width/imageView.frame.size.width;
CGFloat yScale = scrollView.frame.size.height/imageView.frame.size.height;
//設置最小比率
scrollView.minimumZoomScale = MIN(xScale, yScale);
//設置當前控制器爲scrollView的代理
scrollView.delegate = self; **需遵照協議@interface MyViewController ()<UIScrollViewDelegate>
//返回要縮放的視圖 遵照協議
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.imageView;
}
6.UIPageControl 界面下方小圓點
//建立pageControl
UIPageControl *pageControl = [[UIPageControl alloc]init];
pageControl.frame = CGRectMake(0, self.view.frame.size.height-20-30, self.view.frame.size.width, 30);
pageControl.numberOfPages = self.imageNames.count;
//設置圓點的顏色
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
//設置被選中的圓點的顏色
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
//關閉用戶交互功能
pageControl.userInteractionEnabled = NO;
[self.view addSubview:pageControl];
做業:
1.視力檢查器
a。界面1:程序開始時,有一個檢查視力的字母」E」一個Label顯示E,font屬性比較大.=[UIFont systemFontOfSize:100],界面下方有兩個按鈕,分別是看的清,看不清
b。點擊看的清,則推出第二個界面,第二個界面和第一個界面幾乎同樣,惟一不一樣的時E變小了,大小變成95
c。點擊看的清,繼續推出第三個界面,E的字體繼續變小,90 。。。 85 。。。 80.。。
d。直到用戶點擊了看不清,告訴他,視力是多少
要求:必須是使用UINavigationController來控制vc的跳轉,每次應該推出新的vc對象,而不是修改原來的vc對象
AppDelegate.h
#import <UIKit/UIKit.h>
@interface EViewController : UIViewController
@property(nonatomic)CGFloat fontSize;//公開的屬性,字母的大小
@end
AppDelegate.m
#import "AppDelegate.h"
#import "EViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
EViewController *evc = [[EViewController alloc]initWithNibName:@"EViewController" bundle:nil];
evc.fontSize = 100.0;
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:evc];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];
return YES;
}
EViewController.h
EViewController.m
#import "EViewController.h"
@interface EViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
@implementation EViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = [NSString stringWithFormat:@"%f",self.fontSize];
self.label.font = [UIFont systemFontOfSize:self.fontSize];
}
- (IBAction)canSee:(id)sender {
if ((self.fontSize-5)<0) {
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"視力太好了" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
return;
}
EViewController *evc = [[EViewController alloc]initWithNibName:@"EViewController" bundle:nil];
evc.fontSize = self.fontSize-10;
[self.navigationController pushViewController:evc animated:YES];
}
- (IBAction)cannotSee:(id)sender {
NSString *mes = [NSString stringWithFormat:@"視力是:%f",self.fontSize/100];
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:mes delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil];
[alert show];
}
@end
2. 完成scrollView 對圖片的縮放
3.試作如 homework.png的效果圖
要求:四張圖片拼接,經過滑動屏幕顯示出來,同時手機下方有圓形按鈕,隨着滑動圖片顯示原點位置,同時在滑動到第四張圖片時,添加一個按鈕,點擊按鈕響應事件
WelcomeViewController.h
WelcomeViewController.m
#import "AppDelegate.h"
#import "WelcomeViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
WelcomeViewController *vc = [[WelcomeViewController alloc]initWithNibName:@"WelcomeViewController" bundle:nil];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
WelcomeViewController.h
#import <UIKit/UIKit.h>
@interface WelcomeViewController : UIViewController
//圖片的名稱
@property(nonatomic,strong)NSArray *imageNames;
@end
WelcomeViewController.m
#import "WelcomeViewController.h"
@interface WelcomeViewController ()<UIScrollViewDelegate>
@property(nonatomic,strong)UIPageControl *pageControl;
@end
@implementation WelcomeViewController
//重寫初始化方法
- (NSArray *)imageNames{
if (!_imageNames) {
_imageNames = @[@"welcome1.png",@"welcome2.png",@"welcome3.png",@"welcome4.png"];
}
return _imageNames;
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:self.view.frame];
//設置contentSize 大小:手機屏幕寬*4(圖片的個數)
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width*self.imageNames.count, scrollView.frame.size.height);
//將全部圖片以子視圖的方式添加到scrollView中
for (NSInteger i=0; i<self.imageNames.count; i++) {
UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:self.imageNames[i]]];
//建立一個frame變量,並賦值
CGRect imageFrame = CGRectZero;
imageFrame.size = scrollView.frame.size;
imageFrame.origin.y = 0;
imageFrame.origin.x = i*scrollView.frame.size.width;
//將設置到好的frame變量給image
imageView.frame = imageFrame;
[scrollView addSubview:imageView];
}
//配置scrollView
//設置整頁滾動
scrollView.pagingEnabled = YES;
//設置邊緣不彈跳
scrollView.bounces = NO;
//設置水平滾動條不顯示
scrollView.showsHorizontalScrollIndicator =NO;
//設置scrollView的代理
scrollView.delegate = self;
[self.view addSubview:scrollView];
//建立pageControl
UIPageControl *pageControl = [[UIPageControl alloc]init];
self.pageControl = pageControl;
pageControl.frame = CGRectMake(0, self.view.frame.size.height-20-30, self.view.frame.size.width, 30);
pageControl.numberOfPages = self.imageNames.count;
//設置圓點的顏色
pageControl.pageIndicatorTintColor = [UIColor whiteColor];
//設置被選中的圓點的顏色
pageControl.currentPageIndicatorTintColor = [UIColor redColor];
//關閉用戶交互功能
pageControl.userInteractionEnabled = NO;
[self.view addSubview:pageControl];
//爲最後一屏添加按鈕
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.frame = CGRectMake(scrollView.frame.size.width*(self.imageNames.count-1), 0, scrollView.frame.size.width, scrollView.frame.size.height);
//爲按鈕添加點擊事件
[button addTarget:self action:@selector(enterApp) forControlEvents:UIControlEventTouchUpInside];
[scrollView addSubview:button];
}
//委託代理
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// 獲取移動的偏移定點座標
CGPoint offSet = scrollView.contentOffset;
//根據座標算出滾動到第幾屏的位置下標
NSInteger index = offSet.x/scrollView.frame.size.width;
self.pageControl.currentPage=index;
}
-(void)enterApp{
NSLog(@".........");
}
@end
===========================================================================
知識點
12、表視圖
1.UITableView(表視圖)
1.1 什麼是表視圖?
類型是:UITableView類
表現形式:以一列多行的列表形式來展現數據的視圖
表視圖的樣式:普通表視圖(Plain) 分組表視圖(Group)
1.2 表視圖包含的部分?
+UITableView
+TableHeaderView
+section1(分區)
+sectionHeader
+UITableViewCell (行、單元格)
+sectionFooter
+section2(分區)
+TableFooterView
其中,表頭、尾,分區頭、尾能夠根據須要選擇的設置,可是在設定表格式,單元格是必須被設置的
1.3 如何使用UITableView表視圖?
step1:建立tableView的實例,設置frame,以子視圖的形式添加到self.view中
step2:設置tableView的dataSource代理和delegate代理爲當前控制器
step3:設置控制器遵照UITableViewDataSource和UITableViewDelegate協議
step4:實現dataSource協議中的三個方法用於設定表格展現的外觀
方法1:用於設定整個表格有幾個分區
方法2:用於設定每一個分區有幾行
方法3:用於設定每一個行是什麼樣子
step5:實現delegate協議中的一個方法用於設定表格能夠對用戶的點擊某一行的動做的響應
注:以上協議,dataSource協議必須遵照及實現方法2和方法3,方法1有默認的設置,能夠根據須要修改;delegate協議在須要響應用戶點擊動做時再遵照和實現方法;另,實現表視圖的過程能夠簡稱爲3問1答;3問指的是實現datasource協議中的三個方法,1答指的是實現delegate協議中的一個方法
MyViewController.h
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController//繼承自UIViewController
@end
MyViewController.m
#import "MyViewController.h"
@interface MyViewController ()<UITableViewDataSource,UITableViewDelegate>
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//建立UITableView的實例
UITableView *tableView = [[UITableView alloc]initWithFrame:self.view.frame];
//設置表視圖的數據源代理
tableView.dataSource = self;
//設置表視圖的代理
tableView.delegate = self;
//將表視圖添加到view中
[self.view addSubview:tableView];
}
//問1:表格有幾個分區
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
//問2:每一個分區有幾行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
//問3:每一行什麼樣
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [[UITableViewCell alloc]init];
cell.textLabel.text = @"Hello World";
return cell;
}
//答1:點擊某一行後的響應
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@".....");
}
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "MyViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
MyViewController *vc = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
2.表視圖控制器(UITableIViewController)
2.1 是什麼?
一種專門配置表視圖的控制器
2.2特色?
a)繼承自UITableViewController
b)已經遵照了UITableViewDataSource和UITableViewDelegate協議
c)該控制器自帶的視圖已是UITableView類型的了,而且能夠藉助於self.tableView屬性來訪問自帶的這個表視圖
d)控制器已經成爲了自帶的表視圖的數據源代理對象和代理對象
2.3 使用
建立表視圖時,能夠繼承自UITableViewController,設置代理、遵照協議這些設置就都不須要單獨完成了,只須要將關注點放在三問一答上便可。
MyTableViewController.h
#import <UIKit/UIKit.h>
@interface MyTableViewController : UITableViewController//繼承自UITableViewController
@end
MyTableViewController.m
#import "MyTableViewController.h"
#import "DetailViewController.h"
@interface MyTableViewController ()
@end
@implementation MyTableViewController
#pragma mark - 視圖的生命週期 //方便從窗口快速定位到方法查看
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"表格";
}
#pragma mark - dataSource協議
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 10;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc]init];
cell.textLabel.text = @"Hello Kitty";
return cell;
}
#pragma mark - Table view delegate
//一答
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
[self.navigationController pushViewController:detailViewController animated:YES];
}
@end
DetailViewController.h
DetailViewController.m
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "MyTableViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
MyTableViewController *tvc = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:tvc];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];
return YES;
}
3.多分區的UITableView(表視圖)
3.1 NSIndexPath
該類型描述的是一種路徑,爲了定位一個單元格的位置,須要兩個值,一個是分區號,一個是在分區內的行號;分區號的排序規則從0開始,單元格在每個分區內的排序規則也是從0開始。
屬性:
.section 記錄的是分區號
.row 記錄的是行在某一個分區內的行號
MyTableViewController.h
#import <UIKit/UIKit.h>
@interface MyTableViewController : UITableViewController
@end
MyTableViewController.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section//分區號
{ //第一個分區有三行
if (section==0) {
return 3;
}else if (section==1){//第二個分區有兩行
return 2;
}else{
return 4;
}
}
/**/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc]init];
//每一個區
if (indexPath.section==0) {//第一個區
if (indexPath.row==0) {//第一行
cell.textLabel.text=@"hello";
}else{
cell.textLabel.text=@"Hello";
}
}else if (indexPath.section==1){//第二個分區全部行的內容
cell.textLabel.text=@"hello wlord";
}else{
cell.textLabel.text=@"hello kity";
}
return cell;
}
3.2表頭視圖、表尾視圖內容
一個表格中,只能有一個表頭和表尾視圖
經過如下兩個屬性進行設置:
.tableView.tableHeaderView
.tableView.tableFooterView
- (void)viewDidLoad
{
[super viewDidLoad];
//表頭視圖 能夠在表頭視圖添加標籤、文本框、按鈕等
UIView* headerView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 100)];
UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(100, 10, 100, 50)];//標籤在視圖中的位置
label.backgroundColor=[UIColor greenColor];
label.textAlignment=NSTextAlignmentCenter;//標籤上的文字居中
label.text=@"header";
[headerView addSubview:label];//將標籤添加到表視圖
self.tableView.tableHeaderView=headerView;
//self.tableView.tableFooterView=headerView; 表尾視圖
}
3.3 分區頭、分區尾內容
一個表格中,能夠有多個分區頭和分區尾,經過回答問題的方式進行設定;分區頭和分區尾能夠設置爲簡單的字符串描述,也能夠設置複雜的UIView
1)第一種設定方法
//表頭視圖、表尾視圖
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (section==0) {
return @"title1";//第一個分區表視圖的表頭內容
}else if(section==1){
return @"title2";
}else{
return @"title3";
}
}
2)第二種設定方法
-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
//能夠添加文本框、標籤等
}
========================================================================================================
4.UITableViewCell 單元格
4.1是什麼?
系統定義的單元格類型,表格中的每個都是一個UITableViewCell的實例
4.2單元格具備系統提供的默認的樣式
不一樣的演示,對於系統默認提供的三個視圖具備不一樣的擺放方式
四種樣式:
UITableViewCellStyleDefault (imageView和textLabel在最左邊,不顯示detailTextLabel)
UITableViewCellStyleValue1 (imageView和textLabel在最左邊,detailTextLabel在最右邊)
UITableViewCellStyleValue2 (textLabel和detailTextLabel在一行,前邊空幾格,不顯示圖片)
UITableViewCellStyleSubtitle (imageView最左邊,detailTextLabel在textLabel的下方)
4.3單元格具備系統提供的默認的組成視圖
.textLabel 標題標籤
.detailTextLabel 詳情標籤 .imageView 圖片視圖
//每行的內容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text=@"title";
cell.detailTextLabel.text=@"title2";//詳細的內容
cell.imageView.image=[UIImage imageNamed:@"wifi.png"];
return cell;
}
4.4設置單元格行高
//設置單元格行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 70;
}
5.單元格的重用
5.1 什麼是單元格的重用?
將完整超出屏幕的單元格存到隊列中,屏幕一旦出現空白區域,須要單元格來填充時,先去隊列中按照指定的標示圖來試着取,看有沒有已經用完並存在隊列中的單元格,有,就拿來修改值後從新加到界面中,從隊列中取不出已用完的單元格時,則新建
5.2 如何實現單元格的重用?
前提:超出屏幕的單元格由系統自動竄到隊列中
具體作的內容:在回答每行內容什麼樣的時候,先嚐試着從隊列中取單元格對象,取的結果有兩種,要麼取到,拿來繼續用,要麼取不到可重用的,那麼本身新建便可
***注意:存到隊列中的單元格能夠有多種多樣的,因此每一種進入隊列的單元格都須要指定給一個標示,去隊列中取單元格時,要說明按哪一種標示來找同樣的對象
方法一:從隊列中取cell對象,本身判斷是否取到了cell,沒有取到時,本身用代碼建立cell對象
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ //重複用單元格
UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"abc"];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"abc"];
}
cell.textLabel.text=@"hello";
return cell;
}
方法二:viewDidLoad中提在註冊單元格的類型,而後從隊列中取出cell對象後,就算沒有取到可重用的單元格,系統也會按照註冊的cell樣式建立新的cell對象
- (void)viewDidLoad
{
[super viewDidLoad];
//註冊單元格
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"abc"];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ //重複用單元格
UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"abc"];
cell.textLabel.text=@"hello";
return cell;
}
5.3如何進行表格的刷新,在原有的基礎上添加
方法一:總體刷新
[self.tableView reloadData];
方法二:局部刷新
//從第四行開始刷新 局部刷新 最後一行
NSIndexPath* newIndexPath=[NSIndexPath indexPathForRow:self.citys.count-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath]
withRowAnimation:UITableViewRowAnimationTop];
6.三問一答中的一答
6.1 推出簡單的VC來顯示數據詳情
【Demo3_SimpleVC】
數據結構:
+ City : NSObject
+name : NSString
+population : NSInteger
要求:
a。有一組城市信息,以tableView的形式來展現全部城市的列表
b。選中某一個城市後,推出新的普通vc,顯示選中的城市名稱和城市的人口數
CityTableViewController.h
#import <UIKit/UIKit.h>
@interface CityTableViewController : UITableViewController
@end
CityTableViewController.m
#import "CityTableViewController.h"
#import "City.h"
#import "DetailViewController.h"
@interface CityTableViewController ()
@property(nonatomic,strong)NSArray *citys;
@end
@implementation CityTableViewController
//重寫get方法
- (NSArray *)citys{
if (!_citys) {
_citys = [City demoData];
}
return _citys;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"城市列表";
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.citys.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
//根據row,去數組中取到city對象
City *city = self.citys[indexPath.row];
cell.textLabel.text = city.name;
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
//根據行號找到選中的城市對象
City *city = self.citys[indexPath.row];
//將city傳給推出的vc來顯示
detailViewController.city = city;
[self.navigationController pushViewController:detailViewController animated:YES];
}
@end
DetailViewController.h
#import <UIKit/UIKit.h>
#import "City.h"
@interface DetailViewController : UIViewController
@property(nonatomic,strong)City *city;
@end
DetailViewController.m
#import "DetailViewController.h"
@interface DetailViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameLabel; 連線
@property (weak, nonatomic) IBOutlet UILabel *populationLabel;
@end
@implementation DetailViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"城市詳情";
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
self.nameLabel.text = self.city.name;
self.populationLabel.text = [NSString stringWithFormat:@"%d萬",self.city.population];
}
@end
City.h
#import <Foundation/Foundation.h>
@interface City : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic)NSInteger population;
-(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population;
+(NSArray *)demoData;
@end
City.m
#import "City.h"
@implementation City
-(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population{
self = [super init];
if (self) {
self.name = name;
self.population = population;
}
return self;
}
+ (NSArray *)demoData{
City *t1 = [[City alloc]initWithName:@"北京" andPopulation:1000];
City *t2 = [[City alloc]initWithName:@"上海" andPopulation:900];
City *t3 = [[City alloc]initWithName:@"廣州" andPopulation:800];
City *t4 = [[City alloc]initWithName:@"深圳" andPopulation:700];
return @[t1,t2,t3,t4];
}
@end
6.2 推出tableView來顯示子數據
【Demo4_TableVC】
數據結構:
+ City : NSObject
+name : NSString
+population : NSInteger
+areas(區域) : NSArray (NSString)
例如:
City:
name:北京
population:1000
areas: @[@「東城區」,@「西城區」,@「朝陽區」]
要求:
a。有一組城市信息,以tableView的形式來展現全部城市的列表
b。選中某一個城市後,推出新的tableVC,顯示選中的城市的全部areas信息
City.h
#import <Foundation/Foundation.h>
@interface City : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic)NSInteger population;
@property(nonatomic,strong)NSArray *areas;//地區
-(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population;
+(NSArray *)demoData;
@end
City.m
#import "City.h"
@implementation City
-(instancetype)initWithName:(NSString *)name andPopulation:(NSInteger)population{
self = [super init];
if (self) {
self.name = name;
self.population = population;
}
return self;
}
+ (NSArray *)demoData{
City *t1 = [[City alloc]initWithName:@"北京" andPopulation:1000];
t1.areas = @[@"東城區",@"西城區",@"海淀區"];
City *t2 = [[City alloc]initWithName:@"上海" andPopulation:900];
t2.areas = @[@"浦東區",@"靜安區",@"徐彙區"];
City *t3 = [[City alloc]initWithName:@"廣州" andPopulation:800];
t3.areas = @[@"白雲區",@"越秀區",@"天河區"];
City *t4 = [[City alloc]initWithName:@"深圳" andPopulation:700];
t4.areas = @[@"未知區",@"未知2區"];
return @[t1,t2,t3,t4];
}
@end
CityTableViewController.h
CityTableViewController.m
同上
DetailViewController.h
#import <UIKit/UIKit.h>
#import "City.h"
@interface DetailViewController : UITableViewController ***繼承
@property(nonatomic,strong)City *city;
@end
DetailViewController.m
#import "DetailViewController.h"
@interface DetailViewController ()
@end
@implementation DetailViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = self.city.name;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.city.areas.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.textLabel.text = self.city.areas[indexPath.row];
return cell;
}
6.3 使用多分區來顯示子數據 【Demo5_MutilSection】
數據結構:
+ City : NSObject
+name : NSString
+population : NSInteger
+areas(區域) : NSArray (NSString)
例如:
City:
name:北京
population:1000
areas: @[@「東城區」,@「西城區」,@「朝陽區」]
要求:
a。使用一個tableView的多分區展現城市名稱及子地區名稱
b。每一個分區的頭,顯示城市名稱
c。每一個分區的尾,顯示城市的人口
d。分區內的多行顯示城市的全部areas
City.h
City.m
同上
CityTableViewController.h
CityTableViewController.m
#import "CityTableViewController.h"
#import "City.h"
@interface CityTableViewController ()
@property(nonatomic,strong)NSArray *citys;
@end
@implementation CityTableViewController
- (NSArray *)citys{
if (!_citys) {
_citys = [City demoData];
}
return _citys;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"城市列表";
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
//有幾個城市就是幾個分區
return self.citys.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//每一個城市的子地區有幾個,那麼該分區就有幾行
City *city = self.citys[section];
return city.areas.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
//根據section找到對應的city
City *city = self.citys[indexPath.section];
cell.textLabel.text = city.areas[indexPath.row];
return cell;
}
//設置section頭
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
City *city = self.citys[section];
return city.name;
}
//設置section尾
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
City *city = self.citys[section];
return [NSString stringWithFormat:@"人口數:%d萬",city.population];
}
@end
6.4 向TableView中添加一行數據
數據模型:
+ City : NSObject
+name : NSString
+population : NSInteger
要求:
a。第一個界面使用tableView展現全部的城市信息
b。城市名稱在單元格的左側顯示
c。城市的人口在單元格的右側顯示
d。在導航欄的右上角有一個加號按鈕,點擊這個加號後,推出一個新的普通vc
e。在推出的界面2中,包含兩個文本框,一個用於輸入新的城市名稱,一個用於輸入該城市的人口數
f。界面2中下方有一個保存按鈕,點擊保存按鈕後,返回到界面1,而且將在界面2中輸入的數據回傳到界面1,保存在界面1中用於存放全部城市信息的數組中
g。同時,更新表格,顯示增長完城市信息後的新數據(注:如何刷新整個表格?[ self.tableView reloadData];)
TRCity.h
#import <Foundation/Foundation.h>
@interface TRCity : NSObject
@property(nonatomic,strong)NSString* name;
@property(nonatomic)NSInteger population;
-(instancetype)initWithName:(NSString*)name andPopulation:(NSInteger)population;
+(NSMutableArray*)cityArrays;
@end
TRCity.m
#import "TRCity.h"
@implementation TRCity
-(instancetype)initWithName:(NSString*)name andPopulation:(NSInteger)population{
if ([super init]) {
self.name=name;
self.population=population;
}
return self;
}
+(NSMutableArray*)cityArrays{
TRCity* c1=[[TRCity alloc]initWithName:@"北京" andPopulation:1000];
TRCity* c2=[[TRCity alloc]initWithName:@"上海" andPopulation:800];
TRCity* c3=[[TRCity alloc]initWithName:@"廣州" andPopulation:600];
return [@[c1,c2,c3]mutableCopy];
}
@end
CityTableViewController.h
#import <UIKit/UIKit.h>
@interface CityTableViewController : UITableViewController
@end
CityTableViewController.m
#import "CityTableViewController.h"
#import "TRCity.h"
#import "MyViewController.h"
@interface CityTableViewController ()<MyViewControllerDelegate>
@property(nonatomic,strong)NSMutableArray* citys;
//@property(nonatomic,strong)NSMutableArray*message;
@end
@implementation CityTableViewController
-(NSMutableArray*)citys{
if (!_citys) {
_citys=[TRCity cityArrays];
}
return _citys;
}
//添加導航欄配置
- (void)viewDidLoad
{
[super viewDidLoad];
self.title=@"城市列表";
UIBarButtonItem* r=[[UIBarButtonItem alloc]initWithBarButtonSystemItem: target:self action:@selector(gotoNewVC)];
self.navigationItem.rightBarButtonItem=r;
}
//點擊加號切換到的界面
-(void)gotoNewVC{
MyViewController* myVC=[[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
[self.navigationController pushViewController:myVC animated:YES ];
myVC.delegate=self;
}
//實現方法
-(void)myViewController:(MyViewController *)mVC gobackMessage:(NSArray *)message{
//self.citys=message;
TRCity* city=[[TRCity alloc]init];
city.name=message[0];
city.population=[message[1] integerValue];
[self.citys addObject:city];
//刷新表格 從原有的刷新
//[ self.tableView reloadData];
//從第四行開始刷新 局部刷新
NSIndexPath* newIndexPath=[NSIndexPath indexPathForRow:self.citys.count-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationTop];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.citys.count;
}
/**/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
}
TRCity* city=self.citys[indexPath.row];
cell.textLabel.text=city.name;
cell.detailTextLabel.text=[NSString stringWithFormat:@"人口:%d",city.population];
return cell;
}
MyViewController.h
#import <UIKit/UIKit.h>
//定義協議
@class MyViewController;
@protocol MyViewControllerDelegate <NSObject>
-(void)myViewController:(MyViewController*)mVC gobackMessage:(NSArray*)message;
@end
@interface MyViewController : UIViewController
@property(nonatomic,weak)id<MyViewControllerDelegate>delegate;
@end
MyViewController.m
#import "MyViewController.h"
@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UITextField *name; 連線文本框
@property (weak, nonatomic) IBOutlet UITextField *population;
@property(nonatomic,strong)NSArray* city;
@end
@implementation MyViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (IBAction)returnCS:(UITextField *)sender {
[self.view endEditing:YES];
}
- (IBAction)returnRK:(UITextField *)sender {
[self.view endEditing:YES];
}
//點擊保存按鈕返回到界面1
- (IBAction)goBackCIty:(UIButton *)sender {
NSString* str=self.name.text;
NSString*str2=self.population.text;
self.city=@[str,str2];
[self.delegate myViewController:self gobackMessage:self.city];
[self.navigationController popToRootViewControllerAnimated:YES];
}
@end
7.表格的編輯模式
1.1 什麼是表格的編輯模式?
在表格上能夠進行cell的刪除、增長、移動的操做
1.2 如何實現數據的編輯(刪除、增長)
實現步驟:
a。啓動表格的編輯模式:經過修改tableView的editing屬性便可
b。回答 兩問一答 三個問題
問1:哪些行能夠進入編輯模式
問2:行處於何種編輯模式
答1:點擊編輯按鈕後要作的響應
1.3 實現數據刪除或增長時,必定是先改數據模型,而後再刷新界面
例:
1).啓用編輯模式兩種方法
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"聯繫人";
****//建立啓用編輯按鈕的方式一
//self.navigationItem.rightBarButtonItem = self.editButtonItem;
****//建立啓用編輯按鈕的方式二
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"編輯" style:UIBarButtonItemStyleDone target:self action:@selector(tableBeginEditing)];
}
-(void)tableBeginEditing{
//self.tableView.editing = YES;
//啓動表格的編輯模式
[self.tableView setEditing:!self.tableView.editing animated:YES];
//修改右側按鈕上的顯示文字
if (self.tableView.editing) {
[self.navigationItem.rightBarButtonItem setTitle:@"完成"];
}else {
[self.navigationItem.rightBarButtonItem setTitle:@"編輯"];
}
}
2).利用啓用編輯模式進行刪除、添加
MyTableViewController.h
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@property(nonatomic,strong)NSMutableArray *names;
@end
@implementation MyTableViewController
- (NSMutableArray *)names{
if (!_names) {
_names = [@[@"張三",@"李四",@"王五",@"趙六"] mutableCopy];
}
return _names;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"聯繫人";
//建立啓用編輯按鈕的方式一
//self.navigationItem.rightBarButtonItem = self.editButtonItem;
//建立啓用編輯按鈕的方式二
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"編輯" style:UIBarButtonItemStyleDone target:self action:@selector(tableBeginEditing)];
}
-(void)tableBeginEditing{
//self.tableView.editing = YES;
//啓動表格的編輯模式
[self.tableView setEditing:!self.tableView.editing animated:YES];
//修改右側按鈕上的顯示文字
if (self.tableView.editing) {
[self.navigationItem.rightBarButtonItem setTitle:@"完成"];
}else {
[self.navigationItem.rightBarButtonItem setTitle:@"編輯"];
}
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.names.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text = self.names[indexPath.row];
return cell;
}
#pragma mark - table editing
//問1:該行是否能夠進入編輯模式
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
//問2:該行使用什麼編輯樣式
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row == self.names.count-1){
return UITableViewCellEditingStyleInsert;
}else{
return UITableViewCellEditingStyleDelete;
}
}
//答1:肯定編輯動做後的響應
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
//若是提交的編輯樣式是刪除動做時
if (editingStyle == UITableViewCellEditingStyleDelete) { 刪除模式
//1.根據選擇的行的位置,修改數據模型
[self.names removeObjectAtIndex:indexPath.row];
//2.刷新tableView
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
}else if(editingStyle == UITableViewCellEditingStyleInsert){ 添加模式
//1.修改數據模型
[self.names addObject:@"test"];
//2.刷新tableView
NSIndexPath *newPath = [NSIndexPath indexPathForRow:self.names.count-1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[newPath] withRowAnimation:UITableViewRowAnimationRight];
}
}
@end
1.4 實現數據的移動
//移動
//一問
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
return YES;
}
//一答
-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//創建模型
//獲取要移動的數據對象
NSString* str=[self.names objectAtIndex:sourceIndexPath.row];
//將數據從數組中移除
[self.names removeObjectAtIndex:sourceIndexPath.row];
//按照新的座標位置,將對象在插入回數組中
[self.names insertObject:str atIndex:destinationIndexPath.row];
}
8. 單元格的contentView內容視圖
UITableViewCell繼承自UIView,其中又包含了左右兩個區域,其中左側用於顯示內容的區域叫作內容視圖,想訪問這個區域,能夠經過cell.contentView屬性便可
a)系統爲內容視圖提供了默認的三個控件
.textLabel
.detailTextLabel
.imageView
b)能夠自定義內容視圖
[cell.contentView addSubView:xxx]
MyTableViewController.h
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@property(nonatomic,strong)NSArray *citys;
@end
@implementation MyTableViewController
- (NSArray *)citys{
if (!_citys) {
_citys = @[@"北京",@"上海",@"廣州",@"深圳",@"杭州",@"蘇州",@"廈門",@"天津",@"重慶",@"呼和浩特",@"鄭州",@"烏魯木齊",@"拉薩",@"xx",@"yy",@"zz",@"mm",@"nn",@"qq",@"aa",];
}
return _citys;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.citys.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" ];
UILabel *label = nil;
//通過一些步驟,label指向一個對象
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 60)];
label.font = [UIFont systemFontOfSize:22];
label.shadowColor = [UIColor redColor];
label.shadowOffset = CGSizeMake(2, 2);
label.textAlignment = NSTextAlignmentCenter;
//爲label添加一個容器內的對象標識
label.tag = 1;
[cell.contentView addSubview:label];
}else{
//獲取cell中已經添加了的那個label
label = (UILabel *)[cell.contentView viewWithTag:1];
}
label.text = self.citys[indexPath.row];
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
@end
9.單元格的accessoryView(輔助視圖)
a)使用系統提供的輔助視圖樣式
cell.accessoryType
UITableViewCellAccessoryCheckmark:對勾
UITableViewCellAccessoryDisclosureIndicator:大於號
UITableViewCellAccessoryDetailButton:圓圈i
UITableViewCellAccessoryDetailDisclosureButton:圓圈i+大於號
注意:包含detail按鈕時,cell能夠有兩種不一樣的單擊事件的響應。
點擊圓圈i部分:響應accessoryButtonTapped:方法
點擊圓圈i之外的部分:響應didSelectRowAtIndexPath:
如: cell.accessoryType = UITableViewCellAccessoryDetailButton;
b)自定義輔助視圖
cell.accessoryView = [UIButton]
如:cell.accessoryView = [[UISwitch alloc]init];
MyTableViewController.h
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@end
@implementation MyTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 5;
}
static NSString *cellIdentifier = @"cell";
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
if (indexPath.row == 2) {
//系統定義的輔助視圖樣式
cell.accessoryType = UITableViewCellAccessoryDetailButton;
//自定義輔助視圖樣式
}else if (indexPath.row == 3) {
cell.accessoryView = [[UISwitch alloc]init];
}else if(indexPath.row == 1){
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"驗證碼" forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, 100, 40);
cell.accessoryView = button;
}
cell.textLabel.text = @"Hello World";
return cell;
}
//一響應
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"didSelectRowAtIndexPath");
}
//響應用戶點擊圓圈i (Detail按鈕)
-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
NSLog(@"....");
}
@end
10. 自定義單元格
1.預備:
根據要顯示的結果,分析底層的數據模型,建立模型類,cell類是模型類的一種顯示外觀
2.實現步驟:
step1:編寫一個類,繼承自UITableViewCell
勾選xib
//step2:建立能夠進行界面設置的xib文件,設計界面
//step3:將xib文件與本身編寫的Cell類關聯起來
step4:將xib中設計的各個可被修改的控件進行連線,且要變成公開的屬性
step5:建立表格,回答第三問時,再也不建立UITableViewCell的實例,而是建立咱們本身編寫的cell類的實例,返回便可。
News.h
#import <Foundation/Foundation.h>
@interface News : NSObject
@property(nonatomic,strong)NSString *title;
@property(nonatomic,strong)NSString *newsImageName;
@property(nonatomic)NSUInteger commentNumber;
-(instancetype)initWithTitle:(NSString *)title andImageName:(NSString *)imageName andCommentNumber:(NSUInteger)number;
+(NSArray *)demoData;
@end
News.m
#import "News.h"
@implementation News
-(instancetype)initWithTitle:(NSString *)title andImageName:(NSString *)imageName andCommentNumber:(NSUInteger)number{
self = [super init];
if (self) {
self.title = title;
self.newsImageName = imageName;
self.commentNumber = number;
}
return self;
}
+ (NSArray *)demoData{
News *n1 = [[News alloc]initWithTitle:@"xxx" andImageName:@"icon40.png" andCommentNumber:200];
News *n2 = [[News alloc]initWithTitle:@"yyyyyyy" andImageName:@"icon40.png" andCommentNumber:100];
News *n3 = [[News alloc]initWithTitle:@"zzzzzzz" andImageName:@"icon40.png" andCommentNumber:20];
News *n4 = [[News alloc]initWithTitle:@"mmmmmm" andImageName:@"icon40.png" andCommentNumber:0];
return @[n1,n2,n3,n4];
}
@end
NewsCell.h
#import <UIKit/UIKit.h>
@interface NewsCell : UITableViewCell //繼承自
@property (weak, nonatomic) IBOutlet UIImageView *newsImageView;
@property (weak, nonatomic) IBOutlet UILabel *title;
@property (weak, nonatomic) IBOutlet UILabel *commentNumberLabel;
@end
NewsCell.m
#import "NewsCell.h"
@implementation NewsCell
@end
NewsTableViewController.h
#import <UIKit/UIKit.h>
@interface NewsTableViewController : UITableViewController
@property(nonatomic,strong)NSArray *allNews;
@end
NewsTableViewController.m
#import "NewsTableViewController.h"
#import "News.h"
#import "NewsCell.h"
@interface NewsTableViewController ()
@end
@implementation NewsTableViewController
static NSString *cellIdentifier = @"cell";
- (void)viewDidLoad
{
[super viewDidLoad];
//註冊NewsCell類型,重用時由系統建立指定的類型
//因爲自定義的cell類帶有xib文件
//因此註冊時使用nib方法,說明,若是系統
//幫助建立cell對象,則根據指定的xib文件來建立
[self.tableView registerNib:[UINib nibWithNibName:@"NewsCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.allNews.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
//按下標找到新聞對象
News *news = self.allNews[indexPath.row];
cell.title.text = news.title;
cell.newsImageView.image = [UIImage imageNamed:news.newsImageName];
cell.commentNumberLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber];
return cell;
}
//設置行高
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 60;
}
@end
做業:
見下發的資源包
1.qq音樂的配置界面
MyTableViewController.h
MyTableViewController.m
#import "MyTableViewController.h"
@interface MyTableViewController ()
@end
@implementation MyTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title=@"更多";
UIView* headeView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 70)];
UILabel* label1=[[UILabel alloc]initWithFrame:CGRectMake(15, 40, 80, 30)];
label1.text=@"關注 3";
UILabel* label2=[[UILabel alloc]initWithFrame:CGRectMake(130, 40, 160, 30)];
label2.text=@"粉絲 0";
UILabel* label3=[[UILabel alloc]initWithFrame:CGRectMake(240, 40, 240, 30)];
label3.text=@"動態 0";
UILabel* label4=[[UILabel alloc]initWithFrame:CGRectMake(240, 20, 240, 20)];
label4.text=@"個人綠鑽";
label4.textColor=[UIColor greenColor];
[headeView addSubview:label1];
[headeView addSubview:label2];
[headeView addSubview:label3];
[headeView addSubview:label4];
UILabel* label5=[[UILabel alloc]initWithFrame:CGRectMake(60, 10, 90, 30)];
label5.text=@"傻丫頭";
[headeView addSubview:label5];
//照片
UIImage* image=[UIImage imageNamed:@"header.png"];
UIImageView* imageView=[[UIImageView alloc]initWithImage:image];
imageView.frame=CGRectMake(10, 0, 40, 40);
[headeView addSubview:imageView];
imageView.layer.cornerRadius=20;
imageView.layer.masksToBounds=YES;
self.tableView.tableHeaderView=headeView;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section==0) {
return 4;
}else if (section==1){
return 3;
}else{
return 1;
}
}
/**/
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
}
cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
if (indexPath.section==0) {
if (indexPath.row==0) {
cell.textLabel.text=@"個人綠鑽";
}else if (indexPath.row==1){
cell.textLabel.text=@"免流量服務";
cell.detailTextLabel.text=@"在線聽歌免流量費";
}else if (indexPath.row==2){
cell.textLabel.text=@"QPlay與車載互聯";
cell.detailTextLabel.text=@"開啓";
}else{
cell.textLabel.text=@"笛音傳歌";
cell.detailTextLabel.text=@"聲波傳送,一觸即發";
}
}else if (indexPath.section==1){
if (indexPath.row==0) {
cell.textLabel.text=@"設置";
}else if (indexPath.row==1){
cell.textLabel.text=@"定時關閉";
//設置輔視圖
cell.accessoryView=[[UISwitch alloc]init];
}else if (indexPath.row==2){
cell.textLabel.text=@"關於QQ音樂";
}
}else{
cell.textLabel.text=@"退出登陸";
cell.textLabel.textColor=[UIColor redColor];
// cell.textLabel.textAlignment=NSTextAlignmentCenter;
}
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 40;
}
-(NSString*)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
return @" ";
}
2.新聞客戶端的首頁,新聞展現
News.h
#import <Foundation/Foundation.h>
@interface News : NSObject
@property(nonatomic,strong) NSString *title;
@property(nonatomic,strong) NSString *newsImageName;
@property(nonatomic) NSUInteger commentNumber;
-(instancetype)initWithTitle:(NSString*)title
andImageName:(NSString*)imageName
andCommentNumber:(NSUInteger)commentNumber;
+(NSArray *)demoData;
@end
News.m
#import "News.h"
@implementation News
-(instancetype)initWithTitle:(NSString*)title
andImageName:(NSString*)imageName
andCommentNumber:(NSUInteger)commentNumber{
self = [super init];
if (self) {
self.title = title;
self.newsImageName = imageName;
self.commentNumber = commentNumber;
}
return self;
}
+ (NSArray *)demoData{
News *n1 = [[News alloc]initWithTitle:@"聯通被曝高危漏洞 或致用戶通話記錄等信息泄露" andImageName:@"n1.png" andCommentNumber:186];
News *n2 = [[News alloc]initWithTitle:@"CES2015回顧:民用無人機來襲 中國公司佔主導" andImageName:@"n2.png" andCommentNumber:17];
News *n3 = [[News alloc]initWithTitle:@"中企征戰CES:難尋顛覆性產品 未打通海外品牌渠道" andImageName:@"n3.png" andCommentNumber:17];
News *n4 = [[News alloc]initWithTitle:@"老話重提:「專車」是不是黑車?被查合不合法" andImageName:@"n4.png" andCommentNumber:178];
News *n5 = [[News alloc]initWithTitle:@"馬雲告誡員工千萬別碰京東:京東將會成悲劇" andImageName:@"n5.png" andCommentNumber:4374];
News *n6 = [[News alloc]initWithTitle:@"三星Q4營業利潤47億美圓超預期:內存芯片需求利好" andImageName:@"n6.png" andCommentNumber:6];
News *n7 = [[News alloc]initWithTitle:@"索尼宣佈PS4國行版延期上市 或因被舉報不鎖區" andImageName:@"n7.png" andCommentNumber:0];
News *n8 = [[News alloc]initWithTitle:@"微衆銀行開業前夕推「信用付」臨時核心系統過分" andImageName:@"n8.png" andCommentNumber:4];
return @[n1,n2,n3,n4,n5,n6,n7,n8];
}
@end
MyCell.xib
MyCell.h
#import <UIKit/UIKit.h>
@interface MyCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *newsImageView; 與上圖連線
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *commentNumberLabel;
@end
MyCell.m
NewsViewController.h
#import <UIKit/UIKit.h>
@interface NewsViewController : UITableViewController
@property(nonatomic,strong)NSArray *allNews;
@end
NewsViewController.m
#import "NewsViewController.h"
#import "News.h"
#import "MyCell.h"
@interface NewsViewController ()<UIScrollViewDelegate>
@property(nonatomic,strong) UIScrollView *scrollView;
@property(nonatomic,strong) NSArray *labels;;
@end
@implementation NewsViewController
static NSString *cellIdentifier = @"cell";
-(NSArray*)allNews{
if (!_allNews) {
_allNews=[News demoData];
}
return _allNews;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.tableView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellReuseIdentifier:cellIdentifier];
self.scrollView=[[UIScrollView alloc]init];
self.scrollView.frame=CGRectMake(0, 0, self.view.frame.size.width, 30);
self.scrollView.contentSize=CGSizeMake(610, 30);
self.scrollView.showsHorizontalScrollIndicator=NO;
self.scrollView.delegate=self;
UILabel *titleLabel1=[[UILabel alloc]initWithFrame:CGRectMake(55, 00,100, 30)];
titleLabel1.text=@"體育";
UILabel *titleLabel2=[[UILabel alloc]initWithFrame:CGRectMake(155, 00, 100, 30)];
titleLabel2.text=@"非新聞";
UILabel *titleLabel3=[[UILabel alloc]initWithFrame:CGRectMake(255, 00, 100, 30)];
titleLabel3.text=@"科技";
UILabel *titleLabel4=[[UILabel alloc]initWithFrame:CGRectMake(355, 00, 100, 30)];
titleLabel4.text=@"軍事";
UILabel *titleLabel5=[[UILabel alloc]initWithFrame:CGRectMake(455, 00, 100, 30)];
titleLabel5.text=@"歷史";
self.labels=@[titleLabel1,titleLabel2,titleLabel3,titleLabel4,titleLabel5];
for (UILabel *label in self.labels) {
label.textAlignment=NSTextAlignmentCenter;
[self.scrollView addSubview:label];
}
self.scrollView.bounces=NO;
self.navigationItem.titleView=self.scrollView;
self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];
self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemReply target:self action:nil];
UIView *tableHeader=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)];
UIImageView *headerView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 180)];
headerView.image=[UIImage imageNamed:@"header.png"];
[tableHeader addSubview:headerView];
self.tableView.tableHeaderView=tableHeader;
self.tableView.showsVerticalScrollIndicator=NO;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.allNews.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MyCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
News *news = self.allNews[indexPath.row];
cell.titleLabel.text=news.title;
cell.newsImageView.image = [UIImage imageNamed:news.newsImageName];
cell.commentNumberLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber];
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 100;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGPoint offSet=self.scrollView.contentOffset;
for (int i=0; i<self.labels.count; i++) {
if (i==(int)offSet.x/80) {
UILabel* label=self.labels[i];
[label setTextColor:[UIColor redColor]];
} else {
UILabel* label=self.labels[i];
[label setTextColor:[UIColor blackColor]];
}
}
[self.navigationItem.titleView setNeedsDisplay];
}
做業:
1.照片查看器
在一個TableView中列出全部照片的縮小圖、照片名稱和拍攝的位置。當用戶點擊某一行時,推出一個vc,在此vc中顯示大的圖片,大的圖片容許縮放。
Pictures.h
#import <Foundation/Foundation.h>
@interface Pictures : NSObject
@property(nonatomic,strong)NSString *name;
-(instancetype)initWithName:(NSString *)name;
+(NSArray *)DemoData;
@end
Pictures.m
#import "Pictures.h"
@implementation Pictures
-(instancetype)initWithName:(NSString *)name
{
if (self = [super init]) {
self.name = name;
}
return self;
}
+(NSArray *)DemoData
{
Pictures *p1 = [[Pictures alloc]initWithName:@"welcome1.PNG"];
Pictures *p2 = [[Pictures alloc]initWithName:@"welcome2.PNG"];
Pictures *p3 = [[Pictures alloc]initWithName:@"welcome3.PNG"];
Pictures *p4 = [[Pictures alloc]initWithName:@"welcome4.PNG"];
return @[p1,p2,p3,p4];
}
@end
MyTableViewController.h
MyTableViewController.m
#import "MyTableViewController.h"
#import "DetailViewController.h"
@interface MyTableViewController ()
@property(nonatomic,strong)NSArray *pictures;
@end
@implementation MyTableViewController
-(NSArray *)pictures
{
if (!_pictures) {
_pictures = [Pictures DemoData];
}
return _pictures;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.pictures.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
}
Pictures *picture = self.pictures[indexPath.row];
if (indexPath.row == 0) {
cell.textLabel.text =picture.name;
cell.detailTextLabel.text = @"achao";
cell.imageView.image = [UIImage imageNamed:picture.name];
}else if (indexPath.row == 1)
{
cell.textLabel.text =picture.name;
cell.detailTextLabel.text = @"achao";
cell.imageView.image = [UIImage imageNamed:picture.name];
}else if (indexPath.row == 2)
{
cell.textLabel.text =picture.name;
cell.detailTextLabel.text = @"achao";
cell.imageView.image = [UIImage imageNamed:picture.name];
}else if (indexPath.row == 3)
{
cell.textLabel.text =picture.name;
cell.detailTextLabel.text = @"achao";
cell.imageView.image = [UIImage imageNamed:picture.name];
}
return cell;
}
#pragma mark - Table view delegate
// In a xib-based application, navigation from a table can be handled in -tableView:didSelectRowAtIndexPath:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
// Pass the selected object to the new view controller.
Pictures *picture = self.pictures[indexPath.row];
detailViewController.picture = picture;
// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
}
@end
DetailViewController.h
#import <UIKit/UIKit.h>
#import "Pictures.h"
@interface DetailViewController : UIViewController
@property(nonatomic,strong)Pictures *picture;
@end
DetailViewController.m
#import "DetailViewController.h"
#import "Pictures.h"
@interface DetailViewController ()<UIScrollViewDelegate>
@property(nonatomic,strong)UIScrollView *scrollView;
@property(nonatomic,strong)UIImageView *imageView;
@end
@implementation DetailViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSString *name = self.picture.name;
NSLog(@"->%@",name);
UIImage *image= [UIImage imageNamed:name];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
//imageView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
imageView.contentMode = UIViewContentModeScaleAspectFit;
self.imageView = imageView;
UIScrollView *scrollView = [[UIScrollView alloc]init];
self.scrollView = scrollView;
scrollView.contentSize = imageView.frame.size;
scrollView.contentMode = UIViewContentModeScaleAspectFit;
scrollView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
scrollView.maximumZoomScale = 1;
CGFloat xScale = scrollView.frame.size.width/imageView.frame.size.width;
CGFloat yScale = scrollView.frame.size.height/imageView.frame.size.height;
scrollView.minimumZoomScale = MIN(xScale, yScale);
scrollView.delegate = self;
[scrollView addSubview:imageView];
[self.view addSubview:scrollView];
}
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "MyTableViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
MyTableViewController *myVC = [[MyTableViewController alloc]initWithNibName:@"MyTableViewController" bundle:nil];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:myVC];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];
return YES;
}
1.靜態表格
行數不變的表格
實現方式:
方法一:代碼方式
特色:使用大量的if else 進行界面的硬編碼
注意:靜態表格中的數據依然是可變的
User.h
#import <Foundation/Foundation.h>
@interface User : NSObject
@property(nonatomic,strong)NSString *weChatNumber;
@property(nonatomic,strong)NSString *qqNumber;
@property(nonatomic,strong)NSString *phoneNumber;
@property(nonatomic,strong)NSString *email;
@end
User.m
空
SafeViewController.h
SafeViewController.m
#import "SafeViewController.h"
@interface SafeViewController ()
@end
@implementation SafeViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"帳號與安全";
//設置導航欄的背景色
self.navigationController.navigationBar.barTintColor = [UIColor grayColor];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0) {
return 1;
}else{
return 3;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
switch (indexPath.section) {
case 0://分區0
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text = @"微信號";
cell.detailTextLabel.text = self.user.weChatNumber;
break;
case 1://分區1
if (indexPath.row == 0) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text = @"QQ號";
cell.detailTextLabel.text = self.user.qqNumber;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}else if(indexPath.row == 1){
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text = @"手機號";
cell.detailTextLabel.text = self.user.phoneNumber;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}else{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
cell.textLabel.text = @"郵箱";
cell.detailTextLabel.text = self.user.email;
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
break;
default:
break;
}
return cell;
}
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "SafeViewController.h"
#import "User.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
User *user = [[User alloc]init];
user.weChatNumber = @"chat-num";
user.qqNumber = @"1234567";
user.phoneNumber = @"18600xxxx";
user.email = @"tom@tarena.com.cn";
SafeViewController *vc = [[SafeViewController alloc]initWithNibName:@"SafeViewController" bundle:nil];
vc.user = user;
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:vc];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];
return YES;
}
結果:
方法二:xib方法
實現思路:在xib中將靜態表格中的每一行都經過拖拽一個對象來進行設計,系統會自動建立xib中包含的全部的控件對象,可是,默認每個xib文件只能有一個根元素被控制器加載,其餘拖拽後並由系統建立了的對象,能夠經過將這個對象連線到控制器中成爲屬性再訪問。
【Demo2_StaticTable_Xib】
SettingViewController.h
SettingViewController.m
#import "SettingViewController.h"
@interface SettingViewController ()
@property (strong, nonatomic) IBOutlet UIView *headerView; 連線
@property (strong, nonatomic) IBOutlet UITableViewCell *greenDimand;
@property (strong, nonatomic) IBOutlet UITableViewCell *freeMode;
@property (strong, nonatomic) IBOutlet UITableViewCell *settingClose;
@property (strong, nonatomic) IBOutlet UITableViewCell *exit;
@end
@implementation SettingViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"更多";
self.tableView.tableHeaderView = self.headerView;
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 3;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
switch (section) {
case 0:
return 2;
case 1:
return 1;
case 2:
return 1;
default:
return 0;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = nil;
switch (indexPath.section) {
case 0:
if (indexPath.row == 0 ) {
//根據分區號和行號,cell指向不一樣的對象,而後返回
cell = self.greenDimand;
}else{
cell = self.freeMode;
}
break;
case 1:
cell = self.settingClose;
break;
case 2:
cell = self.exit;
break;
}
return cell;
}
2.動態表格
數據行是不固定的
核心理念:建立完TableView以後,設置tableView的dataSource和delegate對象,只要符合協議的對象均可以設置爲代理方法
選擇一:讓當前控制器遵照協議,而後成爲tableView的代理
選擇二:本身編寫類,遵照協議,而後建立類的對象,設置爲tableView的代理
方法一:
tableView.dataSource和tableView.delegate兩個代理交給兩個類處理,不用當前控制器處理。兩個類需遵照協議UITableViewDataSource和UITableViewDelegate,當前控制器需建立兩個類的實例化,才能將其成爲代理方
ViewController.xib
添加Table View控件,修改大小,連線代理,
ViewController.h 控制器
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
ViewController.m
#import "ViewController.h"
#import "TRTableDateSource.h"
#import "TRTableDalegate.h"
@interface ViewController ()
@property(nonatomic,strong)TRTableDateSource* tableDateSource;
@property(nonatomic,strong)TRTableDalegate* tableDalegate;
@end
@implementation ViewController
//重寫get方法
-(TRTableDateSource *)tableDateSource{
if (!_tableDateSource) {
_tableDateSource=[[TRTableDateSource alloc]init];
}
return _tableDateSource;
}
-(TRTableDalegate *)tableDalegate{
if (!_tableDalegate) {
_tableDalegate=[[TRTableDalegate alloc]init];
}
return _tableDalegate;
}
//UITableView繼承UIScrollView
- (void)viewDidLoad
{
[super viewDidLoad];
UITableView* tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
tableView.dataSource=self.tableDateSource;
tableView.delegate=self.tableDalegate;
[self.view addSubview:tableView];
}
@end
TRTableDateSource.h
#import <Foundation/Foundation.h>
@interface TRTableDateSource : NSObject<UITableViewDataSource>//遵照協議
@end
TRTableDateSource.m
#import "TRTableDateSource.h" //數據源
@implementation TRTableDateSource
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 10;
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"cell" ];
if (cell==nil) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
cell.textLabel.text=@"hello";
return cell;
}
@end
TRTableDalegate.h
#import <Foundation/Foundation.h>
@interface TRTableDalegate : NSObject<UITableViewDelegate>//遵照協議
@end
TRTableDalegate.m
#import "TRTableDalegate.h"//代理響應
@implementation TRTableDalegate
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"...");
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 100;
}
@end
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "ViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
ViewController* cV=[[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController=cV;
[self.window makeKeyAndVisible];
return YES;
}
方法2:
需求:在一個普通vc的視圖上有兩個tableView,上面的tableView從資源庫中拖拽,用於顯示5行Hello World;下面的tableView使用代碼建立,用於顯示7行Hello Kitty;當前控制器對象同時是這兩個tableView的dataSource和delegate
TRViewController.h
TRViewController.m
#import "TRViewController.h"
@interface TRViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,strong)UITableView* codeTableView;//手寫代碼
@property (weak, nonatomic) IBOutlet UITableView *xibTableView;//經過xib建立,就能夠省了viewDidLoad中的4步
@end
@implementation TRViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.codeTableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 220, self.view.frame.size.width, 250)];
self.codeTableView.dataSource=self;
self.codeTableView.delegate=self;
[self.view addSubview:self.codeTableView];
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView==self.xibTableView) {
return 5;
}else{
return 7;
}
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell==nil) {
if (tableView==self.xibTableView) {
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}else{
cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"cell"];
}
}
if (tableView==self.xibTableView) {
cell.textLabel.text=@"HelloWord";
}else{
cell.textLabel.text=@"HelloKitty";
cell.detailTextLabel.text=@"miao";
}
return cell;
}
@end
結果:
練習:
展現地區名稱,層級未知,取決於數據模型
北京
東城
西城
朝陽
潘家園
鬆榆路
建業苑
一層
六層
達內
第一教室
第二教室
達內對面
麥當勞
海淀
上海
徐匯
靜安
+AreaTableViewController
+areas: Area( 元素類型:Area)
+Area
+name:NSString
+subAreas:NSArray
+[Item]:Area
+name:NSString
+subAreas:NSArray
+[Item]:Arear
……
Area.h
#import <Foundation/Foundation.h>
@interface Area : NSObject
@property(nonatomic,strong)NSString *name;
@property(nonatomic,strong)NSArray *subAreas;
-(instancetype)initWithName:(NSString *)name;
+(Area *)demoData;
@end
Area.m
#import "Area.h"
@implementation Area
- (instancetype)initWithName:(NSString *)name{
self = [super init];
if (self) {
self.name = name;
}
return self;
}
+ (Area *)demoData{
Area *a0 = [[Area alloc]initWithName:@"城市"];
Area *a1 = [[Area alloc]initWithName:@"北京"];
Area *a2 = [[Area alloc]initWithName:@"上海"];
Area *a11 = [[Area alloc]initWithName:@"東城"];
Area *a12 = [[Area alloc]initWithName:@"西城"];
Area *a13 = [[Area alloc]initWithName:@"朝陽"];
Area *a14 = [[Area alloc]initWithName:@"徐匯"];
Area *a15 = [[Area alloc]initWithName:@"靜安"];
Area *a21 = [[Area alloc]initWithName:@"潘家園"];
Area *a22 = [[Area alloc]initWithName:@"鬆榆路"];
Area *a23 = [[Area alloc]initWithName:@"麥當勞"];
Area *a31 = [[Area alloc]initWithName:@"建業苑"];
Area *a41 = [[Area alloc]initWithName:@"一樓"];
Area *a42 = [[Area alloc]initWithName:@"六樓"];
Area *a51 = [[Area alloc]initWithName:@"達內"];
Area *a61 = [[Area alloc]initWithName:@"第一教室"];
Area *a62= [[Area alloc]initWithName:@"第二教室"];
a51.subAreas = @[a61,a62];
a42.subAreas = @[a51];
a31.subAreas=@[a41,a42];
a22.subAreas = @[a31];
a13.subAreas = @[a21,a22,a23];
a1.subAreas = @[a11,a12,a13];
a2.subAreas = @[a14,a15];
a0.subAreas = @[a1,a2];
return a0;
}
@end
AreaTableViewController.h
#import <UIKit/UIKit.h>
#import "Area.h"
@interface AreaTableViewController : UITableViewController
//每個控制器實例對應的界面都是用來顯示
//一個area的實例
//將area顯示到表視圖中
@property(nonatomic,strong)Area *area;
@end
AreaTableViewController.m
#import "AreaTableViewController.h"
@interface AreaTableViewController ()
@end
@implementation AreaTableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
//1.area實例的name放在導航欄的標題位置
self.title = self.area.name;
}
/*
表格顯示的是:area中的全部子地區對象的名字
*/
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.area.subAreas.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
//每個單元格用於顯示area的一個子地區信息
Area *subArea = self.area.subAreas[indexPath.row];
cell.textLabel.text = subArea.name;
if (subArea.subAreas!=nil) {
//若是有子地區,顯示大於號作提示
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}else{
//若是沒有子地區,修改行的默認選中樣式
//在選中後不出現灰色的背景
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
return cell;
}
//點擊某一行以後推出新的界面,推出的界面與當前界面顯示樣式相同的,只是數據不一樣
//而已,選中一個節點,其實表明的選中依然是一個Area的實例,因此在推出新的界面時,將選中的Area實例
//做爲參數傳過去,由推出的界面負責顯示
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//獲取選中的節點對應的Area實例
Area *subArea = self.area.subAreas[indexPath.row];
if (subArea.subAreas!=nil) {
//建立新的控制器實例
AreaTableViewController *tVC = [[AreaTableViewController alloc]initWithNibName:@"AreaTableViewController" bundle:nil];
tVC.area = subArea;
//推出新的控制器
[self.navigationController pushViewController:tVC animated:YES];
}
}
@end
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "Area.h"
#import "AreaTableViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
AreaTableViewController *tvc = [[AreaTableViewController alloc]initWithNibName:@"AreaTableViewController" bundle:nil];
Area *area = [Area demoData];
tvc.area = area;
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:tvc];
self.window.rootViewController = navi;
[self.window makeKeyAndVisible];
return YES;
}
========================================================================================================================
知識點
十3、UITabBarController標籤控制器
1.是什麼?
與navigationController很像,也是管理控制器的控制器。
tabBarController沒有完整的界面外觀,靠管理其它的vc來完成界面的顯示。
管理方式橫向並列方式的,navigation傾向於垂直深刻式的管理vc。
1.如何使用?
step1:將tabBarController管理的多個vc實例化出具體的對象
step2:將多個vc存到tabBar控制器中
1.1建立
#import "AppDelegate.h"
#import "AViewController.h"
#import "BViewController.h"
#import "CViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
AViewController *avc = [[AViewController alloc]initWithNibName:@"AViewController" bundle:nil];
BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
CViewController *cvc = [[CViewController alloc]initWithNibName:@"CViewController" bundle:nil];
// 建立tabBar的實例
UITabBarController *tabVC = [[UITabBarController alloc]init];
//設置顏色
tabVC.tabBar.tintColor = [UIColor redColor];
//設置tabBar的代理
tabVC.delegate = self;
// 將多個vc放到tabBar中
tabVC.viewControllers = @[avc,bvc,cvc];
self.window.rootViewController = tabVC;
[self.window makeKeyAndVisible];
return YES;
}
1.2設置
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//配置文字
self.title = @"AVC";
//self.tabBarItem.title = @"AVC";
//配置圖片
self.tabBarItem.image =[UIImage imageNamed:@"line_bell"];
self.tabBarItem.selectedImage = [UIImage imageNamed:@"full_bell"];
self.tabBarItem.badgeValue = @"2";//配置徽章
}
return self;
}
1. tabBar的配置
.tabBarItem.title 文字
.tabBarItem.image 不點擊時是 空心圖片
.tabBarItem.selectedImage 點擊的時候是 實心圖片
.tabBarItem.badgeValue 徽章
tabBarController.tabBar.tintColor 顏色
tabBarController.selectedIndex 可讀可寫的屬性,用於獲取或設置tabBar中激活的vc的下標
2.響應用戶選中某vc事件:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
4.tabBarController與navigationController的配合
原則:
a。多引導性控制器共存時,tabBar是總體最外層的管理者,navigation被tabBar管理的一個分支控制器
b。顯示第一屏時,tabBar能夠看見,在某一個具體 的vc中推出新vc時,tabBar處於隱藏狀態。只有回到頂級vc時,tabBar區域纔可見
c。推出新vc時,隱藏底部各類bar的方法:
vc.hidesBottomBarWhenPushed = YES;
例:
AppDelegate.h
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate,UITabBarControllerDelegate> //遵照協議
@property (strong, nonatomic) UIWindow *window;
@end
AppDelegate.m
#import "AppDelegate.h"
#import "AViewController.h"
#import "BViewController.h"
#import "CViewController.h"
@implementation AppDelegate
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController{
NSInteger index = tabBarController.selectedIndex;
NSLog(@"%d",index);
//選中tab中的某一個項後觸發
//viewController.tabBarItem.badgeValue = nil;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
AViewController *avc = [[AViewController alloc]initWithNibName:@"AViewController" bundle:nil];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:avc];
BViewController *bvc = [[BViewController alloc]initWithNibName:@"BViewController" bundle:nil];
CViewController *cvc = [[CViewController alloc]initWithNibName:@"CViewController" bundle:nil];
// 建立tabBar的實例
UITabBarController *tabVC = [[UITabBarController alloc]init];
//設置顏色
tabVC.tabBar.tintColor = [UIColor redColor];
//設置tabBar的代理
tabVC.delegate = self;
// 將多個vc放到tabBar中
tabVC.viewControllers = @[navi,bvc,cvc];
self.window.rootViewController = tabVC;
[self.window makeKeyAndVisible];
return YES;
}
AViewController.h
AViewController.m
#import "AViewController.h"
#import "OtherViewController.h"
@interface AViewController ()
@end
@implementation AViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
//配置文字
self.title = @"AVC";
//self.tabBarItem.title = @"AVC";
//配置圖片
self.tabBarItem.image =[UIImage imageNamed:@"line_bell"];
self.tabBarItem.selectedImage = [UIImage imageNamed:@"full_bell"];
self.tabBarItem.badgeValue = @"2";//配置徽章
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
//配置導航的右側按鈕
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(gotoOther:)];
}
-(void)gotoOther:(UIBarButtonItem *)barButton{
//推出otherVC
OtherViewController *ovc = [[OtherViewController alloc]initWithNibName:@"OtherViewController" bundle:nil];
//推出時,隱藏底部區域
ovc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:ovc animated:YES];
}
//點擊按鈕,跳到第三個界面
- (IBAction)gotoCVC:(id)sender {
self.tabBarController.selectedIndex = 2; 連線按鈕
}
@end
想要哪一個界面顯示,就配置哪一個界面
BViewController.h
BViewController.m
CViewController.h
CViewController.m
OtherViewController.h
OtherViewController.m
知識點
十4、其它控件
1. SegmentedControl 分段控件
SegmentedControl 分段控件
屬性:
selectedSegmentIndex 選中的分段按鈕的下標
事件:
valueChanged事件
SegViewController.h
SegViewController.m
#import "SegViewController.h"
@interface SegViewController ()
@property(nonatomic,strong)NSArray *headerImageNames;
@property (weak, nonatomic) IBOutlet UIImageView *headerImageView; 連線屬性以下圖
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmented;
@end
@implementation SegViewController
- (NSArray *)headerImageNames{
if (!_headerImageNames) {
_headerImageNames =@[@"Brad Cox.png",@"Dennis Ritchie.png",@"Ray.png"];
}
return _headerImageNames;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"分段";
self.tabBarItem.image = [UIImage imageNamed:@"line_ball"];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.titleView = self.segmented;
}
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self changeHeaderImage:self.segmented];
}
- (IBAction)changeHeaderImage:(UISegmentedControl *)sender {
//選擇的segmented中的按鈕的索引
NSInteger index = sender.selectedSegmentIndex;
self.headerImageView.image = [UIImage imageNamed:self.headerImageNames[index]];
}
@end
2. Activity Indicator 活動指示器
IndicatorViewController.h
IndicatorViewController.m
#import "IndicatorViewController.h"
@interface IndicatorViewController ()
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *indicator;
@property (weak, nonatomic) IBOutlet UIProgressView *progressView;
@end
@implementation IndicatorViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title=@"指示器";
self.tabBarItem.image = [UIImage imageNamed:@"line_cart"];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.progressView.progress = 0;
}
- (IBAction)changeIndicator:(UIButton *)sender {
//根據指示器的狀態來決定是轉動仍是中止轉動
if (self.indicator.isAnimating) {
[self.indicator stopAnimating];
}else{
[self.indicator startAnimating];
}
}
- (IBAction)beginDownload:(id)sender {
//啓動一個計時器,每隔一段時間自動的執行動做
//使用sheduledTime。。。方法建立的計時器
//不須要啓動已經開始工做
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeProgress:) userInfo:nil repeats:YES];
}
-(void)changeProgress:(NSTimer *)timer{
//修改進度條的進度
self.progressView.progress+=0.1;
if (self.progressView.progress >= 0.5) { 範圍判斷比較好
// 中止計時器
[timer invalidate];
}
}
@end
3. Progress View 進度條
4. Date Picker
DateViewController.h
DateViewController.m
#import "DateViewController.h"
@interface DateViewController ()
@property (weak, nonatomic) IBOutlet UIDatePicker *datePicker;連線
@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
@end
@implementation DateViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"時間";
self.tabBarItem.image = [UIImage imageNamed:@"line_paint"];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (IBAction)showDate:(UIButton *)sender {
NSDate *date = self.datePicker.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateString = [formatter stringFromDate:date];
self.dateLabel.text = dateString;
}
@end
5. Picker View
重要屬性:
date 獲取選中後的時間對象
通常須要轉換成指定的格式:
NSDate *date = self.datePicker.date;
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
NSString *dateString = [formatter stringFromDate:date];
PickerViewController.h
PickerViewController.m
#import "PickerViewController.h"
@interface PickerViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
@property(nonatomic,strong)NSArray *fromCity;
@property(nonatomic,strong)NSArray *toCity;
@end
@implementation PickerViewController
- (NSArray *)fromCity{
if (!_fromCity) {
_fromCity = @[@"北京",@"上海",@"廣州",@"深圳"];
}
return _fromCity;
}
- (NSArray *)toCity{
if (!_toCity) {
_toCity = @[@"杭州",@"蘇州"];
}
return _toCity;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"picker view";
self.tabBarItem.image = [UIImage imageNamed:@"line_map"];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - UIPickerView DataSource
//控件有幾列
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
//列中有幾行
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if (component == 0) {
return self.fromCity.count;
}else{
return self.toCity.count;
}
}
#pragma mark - UIPickerView Delegate
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component == 0) {
return self.fromCity[row];
}else{
return self.toCity[row];
}
}
@end
RelationPickerViewController.h
RelationPickerViewController.m
#import "RelationPickerViewController.h"
@interface RelationPickerViewController ()<UIPickerViewDataSource,UIPickerViewDelegate>
@property(nonatomic,strong)NSDictionary *dictionaryCitys;
@property(nonatomic,strong)NSArray *allCityName;
@property(nonatomic,strong)NSArray *allAreaName;
@end
@implementation RelationPickerViewController
- (NSDictionary *)dictionaryCitys{
if (!_dictionaryCitys) {
_dictionaryCitys = @{
@"北京":@[@"東城",@"西城",@"海淀"],
@"上海":@[@"徐匯",@"靜安",@"浦東"],
@"廣州":@[@"白雲",@"越秀",@"天河"]
};
}
return _dictionaryCitys;
}
- (NSArray *)allCityName{
if (!_allCityName) {
_allCityName = self.dictionaryCitys.allKeys;
}
return _allCityName;
}
- (NSArray *)allAreaName{
if (!_allAreaName) {
_allAreaName = [self.dictionaryCitys objectForKey:self.allCityName[0]];
}
return _allAreaName;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = @"地址";
self.tabBarItem.image = [ UIImage imageNamed:@"line_umbrella"];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
return 2;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
if (component==0) {
return self.allCityName.count;
}else{
return self.allAreaName.count;
}
}
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{
if (component==0) {
return self.allCityName[row];
}else{
return self.allAreaName[row];
}
}
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
if (component == 0) {
//1.獲取第一列中選中的值
NSString *cityName = self.allCityName[row];
//2.根據第一列的值作key,找到對應的子地區
self.allAreaName = [self.dictionaryCitys objectForKey:cityName];
[pickerView reloadComponent:1];
// 修改第二列第一行爲選中的值
[pickerView selectRow:0 inComponent:1 animated:YES];
}
}
@end
總:
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "SegViewController.h"
#import "IndicatorViewController.h"
#import "DateViewController.h"
#import "PickerViewController.h"
#import "RelationPickerViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
SegViewController *segVC = [[SegViewController alloc]initWithNibName:@"SegViewController" bundle:nil];
UINavigationController *navi = [[UINavigationController alloc]initWithRootViewController:segVC];
IndicatorViewController *indicatorVC = [[IndicatorViewController alloc]initWithNibName:@"IndicatorViewController" bundle:nil];
DateViewController *dateVC = [[DateViewController alloc]initWithNibName:@"DateViewController" bundle:nil];
PickerViewController *pVC = [[PickerViewController alloc]initWithNibName:@"PickerViewController" bundle:nil];
RelationPickerViewController *rVC = [[RelationPickerViewController alloc]initWithNibName:@"RelationPickerViewController" bundle:nil];
UITabBarController *tabVC = [[UITabBarController alloc]init];
tabVC.viewControllers = @[navi,indicatorVC,dateVC,pVC,rVC];
self.window.rootViewController = tabVC;
[self.window makeKeyAndVisible];
return YES;
}
3.iOS8中的警告框和操做表
3.1 建立
UIAlertController *alertController =
[UIAlertController alertControllerWithTitle:@"Title"message:@"messsage"preferredStyle:UIAlertControllerStyleAlert];
3.2 添加動做
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style: UIAlertActionStyleCancel handler:^(UIAlertAction *action) { NSLog(@"Cancel");}];
[alertController addAction:cancelAction];
3.3 添加文本框
[alertController addTextFieldWithConfigurationHandler:^(UITextField *textField) {textField.secureTextEntry = YES;}];
3.4 推出顯示警告框
[self presentViewController:alertController animated:YES completion:nil];
例:ios6
AlertViewController.h
AlertViewController.m
#import "AlertViewController.h"
@interface AlertViewController ()
@end
@implementation AlertViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (IBAction)showAlerView:(id)sender {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"title" message:@"mes" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"YES" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
UITextField *t = (UITextField *)alertController.textFields[0];
NSLog(@"%@",t.text);
}];
[alertController addAction:action];
[alertController addTextFieldWithConfigurationHandler:nil];
[self presentViewController:alertController animated:YES completion:nil];
}
========================================================================================
知識點
十4、故事板Storyboard
1.Storyboard 故事板
1.1 爲何須要故事板
由於在使用xib文件製做界面時存在如下兩個問題:
a。多個xib之間表達的界面的層級關係,以及界面的行進關係沒法在第一時間準確把握
b。代碼中會有大量的建立目標控制器,相似於initWithNibName這樣的代碼,一旦有任何改動,那麼全部initWithNibName就都須要修改,行進路線發生變更
基於以上兩個問題,但願可以將app當作一個總體,可以清晰的表達界面的行進路線,以及對各個控制器的建立工做可以進行統一管理,因而,從iOS5之後,推出了故事板技術來代替xib
1.2 什麼是故事板
一個特殊的文件,後綴是storyBoard,本質上仍是一個xml文件,用於記錄在應用中,各個界面的行進路線,可以以圖形化的方式設計界面,而且對於其中使用到的控制器可以自動的建立對象。
故事板是從應用的總體角度來進行設計產品,而且將一部分建立工做實現了編碼最大化的自動化。
1.3 故事板的簡單使用
【Demo1_StoryBoard】
a。程序啓動時的流程
在工程的配置文件中首先要配置Main Interface爲故事板,而後在故事板中再設置起始場景,而後啓動工程,第一個展現的界面對應的控制器實例就由故事板來自動建立了
b。場景 (Scene)
指的是故事板中的一個節點。節點中能夠包含 控制器、第一響應者、出口以及該場景的過渡(Segue)
c。設計界面
設計方法:與使用xib時沒有區別
連線動做:沒有區別
連線輸出口:沒有區別
重點須要注意的是:一旦須要對場景中的vc進行編碼時,必定要單首創建一個沒有xib文件的控制器器類,而且將故事板中的場景中的vc與建立的控制器類綁定在一塊兒
如何綁定:選中 場景,點擊第三個檢查器,選擇class屬性,後面的下拉框,找到對應的控制器類便可
1.4 使用storyBoard配置各類控制器
a。導航 Editor—>Embed in—>導航/標籤
b。標籤
c。表格
設置表格的步驟:
1)選中表視圖後,設置表格是static(靜態)仍是dynamic(動態)的
2)選中表視圖中的 Prototype Cell(原型單元格),在第四個檢查其中修改成自定義單元格或者是4種基本樣式中的某一箇中類型
3)必定要爲Prototype Cell設置identifier,由於這一次的設置至關於原來在viewDidLoad中寫的regist。。。註冊單元格的代碼
4)爲表視圖綁定本身建立的繼承自UITableViewController的類,回答三問一答
5)其中,viewDidLoad中已經不須要使用regist方法來註冊單元格了,在第三問中,只須要直接從隊列中按照在storyBoard中設置的identifier來dequeu單元格便可。
注意:
1。identifier區分大小寫
2。deque單元格時,可使用帶有forIndexPath參數的那個方法了
1.5 UITableView在故事板中的使用【Demo1】
a。靜態表格的配置
實現步驟:
從資源庫中添加表格控制器,在第四個檢查器中,設置第一個Content爲Static Cell
修改Prototype 屬性的值爲0
設置section屬性 (分區)
設置style屬性爲group
逐一選中各個Section設置頭和cell的數目
逐一選中Cell,設置樣式
新建一個類,繼承自UITableViewController,在故事板中選中控制器,修改第三個檢查器中的class屬性,將自定義的類與場景關聯起來
****刪除新建的類中,有關生成表格的三問一答的代碼
****若是須要對靜態表格中的控件,賦動態值,能夠在拆分視圖下,將控件連線到類中,而後在viewWillAppear:事件中爲控件賦值
b。動態表格的配置
1)系統原型
實現步驟:
從資源庫中添加表格控制器
設置表格的Prototype 的個數爲1
選中Prototype Cell,在檢查器中,設置該原型的style及identifier
建立一個類,繼承自UITableViewController
將類與故事板中的控制器綁定
在類中回答三問,其中,單元格不須要註冊,回答第三問時,直接按照屬性欄中設置的identifier去隊列中取單元格便可
2)自定義原型
實現步驟:
從資源庫中拖拽一個TableVC
添加一個單元格原型view
設定該原型的style爲Custom
設定該原型的identifier
設計cell的內容
新建一個類,繼承自UITableViewCell
選中原型cell,第三個檢查器,設定class爲新建的類
拆分視圖中,將原型cell中的各個控件連線到類中,做爲公開的輸出口
新建一個類,繼承自UITableViewController,並與故事板中的vc綁定
回答第三個問題時,從隊列中按照原型的identifier取出自定義的cell類的實例,並返回
3)混合原型
實現步驟:
在故事板中添加tableVC後,設定Prototype Cell的個數爲2
爲每個Prototype Cell設定identifier
在tableVC綁定的自定義類中,回答三問一答
其中,第三問,生成單元格時,能夠根據生成的單元格的位置及設定的規律,取隊列中,按照不一樣的identifier來取不一樣原型的單元格,而後返回
News.h
#import <Foundation/Foundation.h>
@interface News : NSObject
@property(nonatomic,strong) NSString *title;
@property(nonatomic,strong) NSString *newsImageName;
@property(nonatomic) NSUInteger commentNumber;
-(instancetype)initWithTitle:(NSString*)title
andImageName:(NSString*)imageName
andCommentNumber:(NSUInteger)commentNumber;
+(NSArray *)demoData;
@end
News.M
#import "News.h"
@implementation News
-(instancetype)initWithTitle:(NSString*)title
andImageName:(NSString*)imageName
andCommentNumber:(NSUInteger)commentNumber{
self = [super init];
if (self) {
self.title = title;
self.newsImageName = imageName;
self.commentNumber = commentNumber;
}
return self;
}
+ (NSArray *)demoData{
News *n1 = [[News alloc]initWithTitle:@"聯通被曝高危漏洞 或致用戶通話記錄等信息泄露" andImageName:@"n1.png" andCommentNumber:186];
News *n2 = [[News alloc]initWithTitle:@"CES2015回顧:民用無人機來襲 中國公司佔主導" andImageName:@"n2.png" andCommentNumber:17];
News *n3 = [[News alloc]initWithTitle:@"中企征戰CES:難尋顛覆性產品 未打通海外品牌渠道" andImageName:@"n3.png" andCommentNumber:17];
News *n4 = [[News alloc]initWithTitle:@"老話重提:「專車」是不是黑車?被查合不合法" andImageName:@"n4.png" andCommentNumber:178];
News *n5 = [[News alloc]initWithTitle:@"馬雲告誡員工千萬別碰京東:京東將會成悲劇" andImageName:@"n5.png" andCommentNumber:4374];
News *n6 = [[News alloc]initWithTitle:@"三星Q4營業利潤47億美圓超預期:內存芯片需求利好" andImageName:@"n6.png" andCommentNumber:6];
News *n7 = [[News alloc]initWithTitle:@"索尼宣佈PS4國行版延期上市 或因被舉報不鎖區" andImageName:@"n7.png" andCommentNumber:0];
News *n8 = [[News alloc]initWithTitle:@"微衆銀行開業前夕推「信用付」臨時核心系統過分" andImageName:@"n8.png" andCommentNumber:4];
return @[n1,n2,n3,n4,n5,n6,n7,n8];
}
@end
NewsCell.h
#import <UIKit/UIKit.h> 連線自定義的內容
@interface NewsCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UIImageView *newsImageVIew;
@property (weak, nonatomic) IBOutlet UILabel *newsTitleLabel;
@property (weak, nonatomic) IBOutlet UILabel *newsCountLabel;
@end
NewsCell.M
MutilProtoViewController.h
MutilProtoViewController.m
#import "MutilProtoViewController.h"
#import "News.h"
#import "NewsCell.h"
@interface MutilProtoViewController ()
@property(nonatomic,strong)NSArray *allNews;
@end
@implementation MutilProtoViewController
- (NSArray *)allNews{
if (!_allNews) {
_allNews = [News demoData];
}
return _allNews;
}
- (void)viewDidLoad
{
[super viewDidLoad];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.allNews.count*2;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row % 2) {
NewsCell *newsCell = [tableView dequeueReusableCellWithIdentifier:@"Cell2" forIndexPath:indexPath];
//按照行號找到數據
//獲得的標號是: 0 1 2 3 4 5
//實際的行號是: 1 3 5 7 9 11
News *news = self.allNews[indexPath.row/2];
//將新聞實體的各個屬性設置到cell中
newsCell.newsImageVIew.image = [UIImage imageNamed:news.newsImageName];
newsCell.newsTitleLabel.text = news.title;
newsCell.newsCountLabel.text = [NSString stringWithFormat:@"%d",news.commentNumber];
return newsCell;
}else{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell1" forIndexPath:indexPath];
cell.textLabel.text = @"訂單詳情";
return cell;
}
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.row%2) {
return 100;
}else{
return 44;
}
}
1.6跳轉 【Demo2_Goto_OtherVC】
從一個場景跳轉到另外一個場景(從一個vc跳轉到另外一個vc)的過程
實現方式:
方式一:Segue
不須要編寫代碼,經過連線的方式來實現
實現步驟:
選中原始vc,按住control,按左鍵,拖拽到目標vc,彈出菜單後,根據跳轉的須要選擇push或model便可
方式二:
從一個vc跳轉到故事板中的另外一個獨立的vc
實現步驟:
選中故事板中的vc,第三個檢查器中,設定vc的Storyboard ID
在要執行跳轉的事件中編寫代碼
獲取控制器所在的故事板對象
self.storyboard
故事板發送消息instantiateViewControllerWithIdentifier:@"SomeVC"
其中,參數填寫爲vc的storyboard ID便可 而後,推出該控制器實例
- (IBAction)gotoSomeVC:(UIButton *)sender {
//找到故事板建立的vc實例
SomeViewController *someVC = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];
//推出新vc
[self.navigationController pushViewController:someVC animated:YES];
}
方式三:跳轉到獨立的xib
實現方式:同之前的跳轉方式,使用initWithNibName方法建立vc的實例後,推出便可
- (IBAction)gotoOtherVC:(UIButton *)sender {
//根據xib的名字建立vc
OtherViewController *otherVC = [[OtherViewController alloc]initWithNibName:@"OtherViewController" bundle:nil];
//推出新vc
[self.navigationController pushViewController:otherVC animated:YES];
}
1.7 傳值
1.7.1 正向傳值:從AVC跳轉到BVC時,AVC傳數據給BVC的過程
實現思路:
a。BVC要有公開的屬性接收數據
b。AVC在跳轉到BVC以前,獲取到BVC的引用,就能夠爲空開的屬性賦值,完成正向傳值了
c.segue.destinationViewController實現跳轉
AViewController.h
AViewController.m
#import "AViewController.h"
#import "BViewController.h"
@interface AViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textFiled; 連線文本框
@end
@implementation AViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
//在跳轉到BVC的Segue發生以前
//獲取跳轉到的目標vc也就是BVC的控制權
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"segueToBVC"]) { 跳轉線
//經過segue對象獲取到目標vc
BViewController *bvc = segue.destinationViewController;
bvc.codeString = self.textFiled.text;
}
}
BViewController.h
#import <UIKit/UIKit.h>
@interface BViewController : UIViewController
@property(nonatomic,strong)NSString *codeString;
@end
BViewController.m
#import "BViewController.h"
@interface BViewController ()
@property (weak, nonatomic) IBOutlet UILabel *codeLabel;
@end
@implementation BViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated
{
self.codeLabel.text = self.codeString;
}
@end
1.7.2 反向傳值:從AVC跳轉到BVC後,BVC返回AVC的過程當中給AVC傳值的過程
實現思路:
a。BVC是委託方,作三件事(定義協議,添加delegate屬性,合適的時機發消息)
b。AVC是代理方,作三件事(遵照協議,實現方法,設置BVC的delegate爲self)
**注意:設置BVC的delegate爲self時應考慮segue方法,使用以下
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"segueGotoDVC"]) {
DViewController *dvc = segue.destinationViewController;
dvc.delegate = self;
}
}
===========================================================
知識點
十5、UICollectionViewController
1.1 是什麼?
能夠控制視圖,以多行多列的形式展現數據的一種控制器。是從UITableViewController演變而來,因此在使用上與表視圖很像。(從iOS6開始支持)
1.2 與表視圖相比的相同點
UITableViewController
.tableView (UITableView)
.dataSource (id<UITableViewDataSource>)
.delegate(id<UITableViewDelegate>)
每一行的類型是:UITableViewCell
加載數據:實現三問一答便可(有幾個分區,每一個分區多少行,每一行什麼樣)
UICollectionViewController
.collectionView (UICollectionView)
.dataSource(id<UICollectionViewDataSource>)
.delegate(id<UICollectionViewDelegate>)
每個項的類型:UICollectionViewCell
加載數據:實現三問一答便可(有幾個分區,每一個分區多少item,每個項什麼樣)
1.3與tableView相比不一樣點
a。tableViewCell默認自帶了三個顯示內容的控件(imageView,textLabel,detailLabel),而且這三個控件的擺放位置也有系統定義好的四種樣式,而collectionViewCell沒有任何事先由系統定義的用於顯示內容的控件,只有能訪問的這樣幾個屬性:backgroundColor、backgroundView、contentView
b。tableViewCell的排布順序是系統提早定義好的,都是嚴格的按照從上到下,依次排布,也就是每個cell的座標,在指定了行高之後,都有系統計算完成並顯示;collectionView沒有固定的item的排布規則,須要自定義,這是須要一個特殊的叫作佈局類(UICollectionViewLayout)來輔助CollectionView完成每個item的顯示位置的設定,系統只提供了一種佈局類,從UICollectionViewLayout派生出來的,叫作流式佈局UICollectionFlowLayout,這種系統定義的佈局類的佈局特色是:一行排滿後,自動換行,
1.4UICollectionViewController的基本使用
1.1Code 純代碼的方式【Demo1_CollectionView_Code】
a。Cell的簡單樣式 + 系統的流式佈局
UICollectionViewCell + UICollectionViewFlowLayout
b。Cell的簡單樣式 + 自定義的流式佈局
UICollectionViewCell+MyFlowLayout
c。自定義Cell + 自定義的流式佈局
MyCell + MyFlowLayout
AppDelegate.h
AppDelegate.m
#import "AppDelegate.h"
#import "MyCollectionViewController.h"
#import "MyFlowLayout.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
//建立一個默認的流式佈局類的對象
//UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
MyFlowLayout *layout = [[MyFlowLayout alloc]init];
MyCollectionViewController *vc = [[MyCollectionViewController alloc]initWithCollectionViewLayout:layout];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
return YES;
}
MyCell.h
#import <UIKit/UIKit.h>
@interface MyCell : UICollectionViewCell
@property(nonatomic,strong)UIImageView *bgImageView;
@property(nonatomic,strong)UILabel *label;
@end
MyCell.m
#import "MyCell.h"
@implementation MyCell
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
//設置圖片視圖爲cell的背景視圖
self.backgroundView = self.bgImageView;
self.label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
self.label.textAlignment = NSTextAlignmentCenter;
self.label.font = [UIFont boldSystemFontOfSize:30];
//將標籤添加到cell的內容視圖中
[self.contentView addSubview:self.label];
}
return self;
}
@end
MyFlowLayout.h
#import <UIKit/UIKit.h>
@interface MyFlowLayout : UICollectionViewFlowLayout
@end
MyFlowLayout.m
#import "MyFlowLayout.h"
@implementation MyFlowLayout
- (id)init
{
self = [super init];
if (self) {
// 流式佈局的自定義設置
self.itemSize = CGSizeMake(80, 80);
self.minimumLineSpacing = 10;
self.minimumInteritemSpacing = 10;
self.sectionInset = UIEdgeInsetsMake(154, 30, 154, 30);
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
}
return self;
}
@end
MyCollectionViewController.h
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@end
MyCollectionViewController.m
#import "MyCollectionViewController.h"
#import "MyCell.h"
@interface MyCollectionViewController ()
@end
@implementation MyCollectionViewController
static NSString *reuseIdentifier=@"MyCell";
- (void)viewDidLoad
{
[super viewDidLoad];
//註冊CollectionViewCell
[self.collectionView registerClass:[MyCell class] forCellWithReuseIdentifier:reuseIdentifier];
}
// 三問
// 第一問:多少個分區
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 3;
}
// 第二問:每一個分區多少個項
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 9;
}
// 第三問:每一個項什麼樣
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// 從隊列中按標識取cell
MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// 設置自定義cell的背景圖和標籤的內容
cell.bgImageView.image = [UIImage imageNamed:@"f.png"];
cell.label.text = [NSString stringWithFormat:@"%d",indexPath.row];
// 設置cell
// cell.backgroundColor = [UIColor whiteColor];
// UILabel *label = (UILabel *)[cell.contentView viewWithTag:1];
// if (label == nil) {
// label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, cell.bounds.size.width, cell.bounds.size.height)];
// label.font = [UIFont boldSystemFontOfSize:26];
// label.textAlignment = NSTextAlignmentCenter;
// //爲label添加tag值
// label.tag = 1;
// [cell.contentView addSubview:label];
// }
// label.text = [NSString stringWithFormat:@"%d",indexPath.row];
//
// 返回cell
return cell;
}
水平滾動顯示 豎直滾動顯示
1.2 Xib 方式
1).主要就是xib中建立的UICollectionViewController,若是是自動義的佈局需在xib的右側區域與建立的類相鏈接,而且需注意註冊時應該使用nibWithNibName,如:
- (void)viewDidLoad
{
[super viewDidLoad];
//註冊cell
//[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];
[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:reuseIdentifier];
}
***上邊的圖片是在xib中剛開始建立的時候並無與控制器鏈接,需經過黃色的方框與控制器鏈接,並經過第五個檢查器連線設置代理
2).而且注意MyFlowLayout.m中要初始化方法需使用- (id)initWithCoder:(NSCoder *)aDecoder{來設置佈局大小,滾動方向等
- (id)initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
self.itemSize = CGSizeMake(60, 60);
self.minimumInteritemSpacing = 10;
self.minimumLineSpacing = 10;
self.sectionInset = UIEdgeInsetsMake(100, 25, 100, 25);
self.scrollDirection = UICollectionViewScrollDirectionVertical;
}
return self;
}
3).而MyCell.h類中的單元格內容的設置不須要手寫代碼了,只需在xib中設置,而後公開屬性連線便可(需注意此類建立不自帶xib,需本身從新建立,User Interface—>Empty—>next—>起名字,與類名前綴起的同樣便可,並添加單元格,在單元格里添加圖片和label便可,將class與本身建立的類關聯起來)
1.3 Storyboard方式
1).故事板中導入UICollectionViewController控制器,所有選中,並將本身建立的類相關聯,
2)只選中view,設置自定義和格式,並與建立的類MyFlowLayout相關聯,滾動方向及顯示大小都經過本身建立的類來設置
3)選中故事板中的cell與本身建立的類相關聯class,本身建立的cell類在公開屬性中與故事板中建立的模型鏈接屬性便可
2.使用UICollectionViewController實現複雜佈局
2.1 自定義的複雜的流式佈局實現水平移動時的縮放
MyFlowLayout.h
MyFlowLayout.m
#import "MyFlowLayout.h"
@implementation MyFlowLayout
-(id)init
{
self = [super init];
if (self) {
self.itemSize = CGSizeMake(200, 200);
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.sectionInset = UIEdgeInsetsMake(60, 0, 60, 0);
self.minimumLineSpacing = 100;
}
return self;
}
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
return YES;
}
必須使用這個方法進行縮放
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
NSArray *array = [super layoutAttributesForElementsInRect:rect];
//建立可視化的矩形區域
CGRect visiabelRect = CGRectZero;
visiabelRect.origin = self.collectionView.contentOffset;
visiabelRect.size = self.collectionView.bounds.size;
//可視化矩形區域的中心點x
CGFloat visiableRectCenterX = CGRectGetMidX(visiabelRect);
//依次獲取系統指定的矩形區域中的每個item
//的中心點座標
//將可視化區域的中心點與item的中心點進行
//比對,根據兩個中心點的距離產生一個變化的
//比率,並將該比率做爲item的縮放比率便可
for (UICollectionViewLayoutAttributes *attributes in array) {
//獲取每個item的中心點
CGFloat itemCenterX = attributes.center.x;
//計算兩個中心點的距離
CGFloat distance = visiableRectCenterX - itemCenterX;
//設定兩個中心點的距離在200之內時
//才針對item作放大縮小的操做
if (ABS(distance) < 200) {
//根據distance的大小產生一個變化的zoomFator縮放因子
CGFloat zoomFactor = 1 + 0.5*(1-ABS(distance/200.0));
attributes.transform3D = CATransform3DMakeScale(zoomFactor, zoomFactor, 1);
}
}
return array;
}
@end
2.2 自定義的不規則佈局
補充:
1.frame屬性描述的是,視圖在父視圖中的位置及所佔的區域大小
2.bounds屬性描述的是,視圖自己的大小
3.屏幕:3.5 寬 320 高480
屏幕:4 寬 320 高568
練習: 水平滾動的 三頁九宮格
垂直滾動的 三頁九宮格
九宮格間距較緊密,居中顯示
水平滾動:(4寸)
itemSize:80 X 80
itemSpacing:10
lineSpacing:10
sectionInset:top:[568 - (80*3+10*2)]/2=154
left:[320 - (80*3+10*2)]/2= 30
總結:
若是要利用UICollectionViewController來設計界面,須要建立3個類來實現此功能
MyCollectionViewController.h
MyCollectionViewController.m
此類中主要用於實現三問一答,繼承自UICollectionViewController用來建立表格的基本模式,幾個分區,幾列以及表格的顯示內容(需注意:表格的內容需在viewDidLoad中註冊才能建立),實現表格的重用
MyFlowLayout.h
MyFlowLayout.m
此類中主要是爲了佈局,繼承自UICollectionViewFlowLayout重寫初始化方法,設置顯示的大小,項目間的距離、行高、以及水平滾動仍是豎直滾動,以及與屏幕的上下左右的間距。
self.itemSize 設置每一個單元格的大小
self.scrollDirection 設置水平滾動仍是豎直滾動
self.sectionInset 設置距離屏幕上下左右的距離
self.minimumLineSpacing 設置行間距
self.minimumInteritemSpacing 設置項目之間的距離
MyCell.h
MyCell.m
此類中主要用來設置單元格的內容,繼承自UICollectionViewCell在.h文件中設置一個公開的屬性,與MyCollectionViewController聯繫,通常狀況下設置圖片背景和標籤,在initWithFrame方法中設置。
如:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
self.backgroundView = self.bgImageView;
//邊框線條寬度
self.contentView.layer.borderWidth = 1.0f;
//邊框的顏色
self.contentView.layer.borderColor = [UIColor whiteColor].CGColor;
}
return self;
}
=========================================================================================================