iOS学习之UIView+UIViewController

—————————————————————— UIView  

iOS学习之UIView+UIViewController_第1张图片

//已经有强指针指向它了。 所以不需要用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 ] ; 】

少使用,效率非常差,用起来很混乱。



iOS学习之UIView+UIViewController_第2张图片
iOS学习之UIView+UIViewController_第3张图片


iOS学习之UIView+UIViewController_第4张图片
iOS学习之UIView+UIViewController_第5张图片
//自定义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;

你可能感兴趣的:(iOS学习之UIView+UIViewController)