—————————————————————— UIView ?
//已經有強指針指向它了。 所以不需要用strong? 用weak 可以減少很多不必要的問題。
@Property (nonatomic , weak )IBOutlet UILabel * label
1.系統調用
2.控制器的view 加載完畢的時候調用。
3.控件的初始化,數據的初始化 。(懶加載)
-(void)viewDidLoad {
[super viewDidLoad]
}
UIView:
它是一個控件,? 它是所有控件的父類..每一個控件其實都是一個容器。可以將其他控件放到該控件的內部。
比較常見的還是將UIView 作為容器。每一個控制器中都有一個UIView。控制器本身是不可見。
能夠看到的是控制器的View 。每一個控制器中都有一個UIView 屬性。
控制器中管理的所有控件都是該控件的子控件。
在sb中只能用UIView 來裝, 只能用代碼。
常見屬性:? UIView? superview ; // 父視圖? 【當前視圖所在的父視圖】
NSArray? subviews
NSInteger? tag? 父控件可以通過tag 來找到對應的子控件。
常見方法: addSubview : 添加一個子控件的view。
removeFromoSuperview 將自己從父控件中移除
tag? 根據tag 拿到對應的UIView? ? ? ? 【設置? 紅色的tag = 1 ; UIView *redView = [self.view viewWithTag: 1 ] ; 】
少使用,效率非常差,用起來很混亂。
步驟(1)創建 新文件 userInterface? 中的 empty 文件? 取名CZHeaderView
(2)xib 中加入View 4中屬性size取freedom? statusBar 取None 5中取大小 W 375 H 200
加入scrollView? 到View 中? ? 設置5中 10 10 355 140
加入新View? ? ? 到主View 中? ? 設置5中 0 160 375 1? //一條線就畫好了
加入新View? ? ? 到主View 中? ? 設置5中 0 200 375 1? //一條線就畫好了
加入Label? ? ? ? 到主View 中? ? 設置5中 10, 170,100,21? label.text= 猜你喜歡
(3)//封裝起來(自定義View)
創建一個類 CZHeaderView? 然后繼承 UIView//名字最好和xib的取名一樣
(4)點擊父View 設置自定義類型 中設置3中 Custom Class 中class 設置成 CZHeaderView
(5)連線? option+ Command + 回車? 在CZHeaderView.m 中連線
//? ? ? ? ? ? ? 手動寫入代碼
@interface CZHeaderView()
//scrollView連線
@property(weak,nonatomic) IBOutlet UIScrollView *scrollView;
@end
(6)//如何加載? 回到 ViewController.m 中
導入頭文件 #import"CZHeaderView.h"
-(void)viewDidLoad? //原有的代碼 這行不需要自己寫入
{
self.tableView.tableHeaderView = [CZHeaderView headerView];//手動寫入代碼
}
(7)//回到 CZHeaderView.h 中
+(instancetype)headerView;//手動寫入代碼
//回到 CZHeaderView.m 中
//類方法 快速初始化對象
+ (instancetype)headerView
{
CZHeaderView *headerView = [[[NSBundle mainBundle] loadNibNamed:@"CZHeaderView" owner:nil options:nil] lastObject];
return headerView;
}
//當xib中的控件加載完成會調用此方法
- (void)awakeFromNib
{
CGFloat iconW = self.scrollView.frame.size.width;
CGFloat iconH = self.scrollView.frame.size.height;
for (int i = 0; i < 5; i++) {
NSString *imgName = [NSString stringWithFormat:@"ad_%02d",i];
UIImageView *iconView = [[UIImageView alloc] init];
[self.scrollView addSubview:iconView];
iconView.image = [UIImage imageNamed:imgName];
CGFloat iconX = i * iconW;
CGFloat iconY = 0;
iconView.frame = CGRectMake(iconX, iconY, iconW, iconH);
}
self.scrollView.contentSize = CGSizeMake(5 * iconW, 0);
}
IOS是一個閉源系統,從uiview跳轉到uiviewcontroller需要有特殊的工具,跳轉是在控制器之間發生的,應該是由一個控制器跳轉到另一個控制器,跳轉后就可以把當前的控制器默認的View添加到窗口上,而不是由UIView跳轉到控制器,不要犯這樣的錯;
控制器跳轉辦法:
1、用UINavigationController 的pushViewController
2、用self的presentViewController
3、再就是用storyBoard的segue進行跳轉
self.cover.alpha = 0.3;
常用的方法總結:
1.懶加載
作用: 用到的時候再創建。
01. @Property (strong ,nonatomic) MIOViewController *vc;
02. -(MIOViewController *)vc
{
if(!_vc)
{ self.vc =[ [MIOViewController alloc]init];
self.vc.view.frame = CGRectMake(100,100,100,100);
}
}
知識點: 1. 一個控制器的view 是可以隨意調整尺寸和顯示位置的。
2.? 一個控制器的view 是可以隨意添加到其他view 中
3 . 如果將一個控制器的view 添加到其他view中 那么要想辦法保證控制器不被銷毀,
4. 原則: 主要view? 在 view所在的控制器必須得在,這樣才能保證view 內部的數據和業務邏輯正常
知識點:如果一個view? 添加到另一個viewController? 上添加千次萬次, 也只會添加一次,它會自動判斷。 比如:【self.view addsubview:test.view】;
知識點: 從控制器 移除的view? 并不會銷毀(死了),只要這個控制器還在, 它就還活著, 只是暫時移除出去了。
【self.view? removeFromSupview】;? // 暫時從父控件移除,暫時看不見而已。是否銷毀看是否有強指針指著它。
知識點: 控制器中又有控制器 【UIViewController? -> UIViewController】
在? 控制器 A 中? 添加另一個tableview控制器B
存在的問題:
tableview 能活到現在是因為 [ self.view addSubview:test.view]; 被加入進去,所以能夠顯示出來。
但是 控制器 HMTestViewController 不能活到今天,因為它是個局部變量。
所以它死了。數據源也就死了。意味著沒有人給它數據。所有沒有數據
因為它的數據源是 test.view.dataSource = test ;? 但是死了就會變成? test.view.dataSource = nil ;
需求: 控制器的view 還在,但是view 上面的數據不顯示,極大可能是因為:控制器提前被銷毀了。
解決方式:
加入強引用:@property (strong,nonatomic) HMTestViewController *test;
self.test = test
就能夠看到數據了。
問題: EXC _ BAD_ACCESS? 經典錯誤? 壞內存訪問
控制器死了,view 還在 ; view中的 button 被點擊的時候。? 相當于讓死人管理里面的控件,所以會成為壞內存。
解決。 控制器要強引用。
@property (strong,nonatomic) UIViewController *viewControlelr;