view的封装

来源:互联网 发布:打电话免费的软件 编辑:程序博客网 时间:2024/05/21 11:12

在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文件的代码屏蔽起来


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


0 0
原创粉丝点击