iOS学习之UIView+UIViewController

作者: TenMios | 来源:发表于2016-09-02 21:21 被阅读387次

    —————————————————————— 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;

    相关文章

      网友评论

        本文标题:iOS学习之UIView+UIViewController

        本文链接:https://www.haomeiwen.com/subject/tplkettx.html