view的封装

在ios开发中,如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心,外界可以传入对应的模型数据给viewview拿到模型数据后给内部的子控件设置对应的数据。

例如,假如要开发一个如下左图的效果,我们可以自定义一个如右图所示的小view。



我们要创建一个xib文件,拖入UIView,设置UIView的尺寸,拖入需要的子控件,并创建一个继承UIView的类,将xib的class设置为该类。以下是上面程序的一些相关代码;

#import <UIKit/UIKit.h>
@class WDCAppDataModel;

@interface WDCappView : UIView

@property (nonatomic,strong) WDCAppDataModel *appDataModel;

+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel;



@end


//  appView.m
//  01-我的应用管理
//
//  Created by aaron on 14/11/17.
//  Copyright (c) 2014年 aaron. All rights reserved.
//

#import "WDCappView.h"
#import "WDCAppDataModel.h"

@interface WDCappView ()

@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameView;

@end

@implementation WDCappView

+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel{
     //读取xib文件(会创建xib中的描述的所有对象,并且按顺序放到数组中返回)
    NSBundle *bundle = [NSBundle mainBundle];
    NSArray *appViews = [bundle loadNibNamed:@"appView" owner:nil options:nil];
    
    WDCappView *appView = [appViews lastObject];
    
    appView.appDataModel = appDataModel;
    
    return appView;
}

//重写set方法
- (void)setAppDataModel:(WDCAppDataModel *)appDataModel{
    
    _appDataModel = appDataModel;
    
    self.iconView.image = [UIImage imageNamed:appDataModel.icon];
    self.nameView.text = appDataModel.name;
}


@end

在控制器中,我们通过方法
+ (instancetype)appViewWithAppDataModel:(WDCAppDataModel *)appDataModel,将数据模型直接传入view中,实现封装;
</pre><pre name="code" class="objc" style="font-size: 18px; -webkit-text-stroke-color: rgb(0, 0, 0);"></pre></p><pre name="code" class="objc">// 总列数
    int totalColums = 3;
    
    // app尺寸和间隙
    CGFloat appW = 85;
    CGFloat appH = 90;
    CGFloat marginX = (self.view.frame.size.width - appW * totalColums) / (totalColums + 1);
    CGFloat marginY = 15;
    
   
    
    // 添加appview
    for (int index = 0; index < self.apps.count; index++) {
        
<span style="white-space:pre">	</span>WDCappView *appView = [WDCappView appViewWithAppDataModel:self.apps[index]];
        [self.view addSubview:appView];
        
        // appView的行数以及列数
        int row = index / totalColums;
        int colum = index % totalColums;
        // 设置Frame
        CGFloat appX = marginX * (colum + 1) + appW * colum;
        CGFloat appY = 30 + marginY * row + appH * row;
        [appView setFrame:CGRectMake(appX, appY, appW, appH)];

使用xib封装一个自定义view的步骤

1> 新建一个继承UIView的自定义view,假设类名叫做(WDCAppView)

2> 新建一个WDCAppView.xib文件来描述WDCAppView内部的结构

3> 修改UIView的类型为WDCAppView真实类型

4> 将内部的子控件跟WDCAppView进行属性连线

5> WDCAppView提供一个模型属性

6> 重写模型属性的set方法,因为在set方法中可以拿到外界传递的模型数据

7> 把模型数据拆开,分别设置数据到对应的子控件中

8> 提供一个创建WDCAppView的类方法,将读取xib文件的代码屏蔽起来


需要代码的可以在评论里留下邮箱。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值