—————————————————————— 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 ] ; 】
少使用,效率非常差,用起来很混乱。
//自定义View xib的用法 (项目名称:设置文件头 滚动广告 五张图片 )步骤(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;
网友评论