IOS开发 - Xib 九宫格应用管理

Xib 九宫格应用管理

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

 1> 新建一个继承UIView的自定义view,假设类名叫做(AppView)
 2> 新建一个AppView.xib文件来描述MJAppView内部的结构
 3> 修改UIView的类型为MJAppView真是类型
 4> 将内部的子控件跟MJAppView进行属性连线
 5> AppView提供一个模型属性
 6> 重写模型属性的set方法,因为在set方法中可以拿到外界传递的模型数据
 7> 把模型数据拆开,分别设置数据到对应的子控件中
 8> 补充:提供一个创建MJAppView的类方法,将读取xib文件的代码屏蔽起来
#import "ViewController.h"
#import "MyApp.h"
#import "MyAppView.h"

@interface ViewController ()
/**
 *  存放用户信息
 */
@property(nonatomic,strong)NSArray* apps;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //添加应用信息
    //0.总列数(一行最多三列)
    int totalColumns=3;

    //1.应用的尺寸
    CGFloat appW=85;
    CGFloat appH=90;

     // 2.间隙 = (控制器view的宽度 - 3 * 应用宽度) / 4
    CGFloat marginX=(self.view.frame.size.width-totalColumns*appW)/(totalColumns+1);
    CGFloat marginY=15;

     // 3.根据应用个数创建对应的框框(index 0 ~ 11)
    for (int index=0; index<self.apps.count; index++) {
        // 3.1.创建view
        MyAppView *appView = [MyAppView appViewWithApp:self.apps[index]];

        // 3.2.添加view
        [self.view addSubview:appView];

        // 3.3.设置frame
        int row = index / totalColumns;
        int col = index % totalColumns;
        // 计算x和y
        CGFloat appX = marginX + col * (appW + marginX);
        CGFloat appY = 30 + row * (appH + marginY);
        appView.frame = CGRectMake(appX, appY, appW, appH);
    }
}

- (NSArray*)apps
{
    if (_apps==nil) {
        // 1.获得plist的全路径
        NSString* path=[[NSBundle mainBundle]pathForResource:@"app.plist" ofType:nil];

        //2.加载数组
        NSArray* dictArray=[NSArray arrayWithContentsOfFile:path];

        // 3.将dictArray里面的所有字典转成模型对象,放到新的数组中
        NSMutableArray* appArray=[NSMutableArray array];
        for (NSDictionary* dict in dictArray) {
         // 3.1.创建模型对象
            MyApp* app=[MyApp appWithDict:dict];

         // 3.2.添加模型对象到数组中
            [appArray addObject:app];

        }
        //4.赋值
        _apps=appArray;
    }
    return _apps;
}
@end
#import <UIKit/UIKit.h>
@class MyApp;
@interface MyAppView  : UIView
/**
 *  数据模型
 */
@property(nonatomic,strong)MyApp* app;

+(instancetype)appView;

/**
 *  通过模型数据来创建一个view
 */
+ (instancetype)appViewWithApp:(MyApp*)app;
@end
#import "MyAppView.h"
#import "MyApp.h"

@interface MyAppView ()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;

@end

@implementation MyAppView

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

+ (instancetype)appView
{
    return [self appViewWithApp:nil];
}

- (void)setApp:(MyApp *)app
{
    _app=app;
    //1.设置图标
    self.iconView.image=[UIImage imageNamed:app.icon];
    //2.设置名称
    self.nameLabel.text=app.name;
}
@end

Xib

Model

@interface MyApp : NSObject

/**
 *  名称
 */
@property(nonatomic,copy)NSString* name;

/**
 *  图标
 */
@property(nonatomic,copy)NSString* icon;

/**
 *   通过字典来初始化模型对象
 *  @param dict 字典对象
 *  @return 已经初始化完毕的模型对象
 */
- (instancetype)initWithDict:(NSDictionary*)dict;

+ (instancetype)appWithDict:(NSDictionary*)dict;

@end
@implementation MyApp
- (instancetype)initWithDict:(NSDictionary*)dict
{
    if (self=[super init]) {
        self.name=dict[@"name"];
        self.icon=dict[@"icon"];
    }
    return self;
}

+ (instancetype)appWithDict:(NSDictionary*)dict;
{
    return [[self alloc]initWithDict:dict];
}
@end

实例图

时间: 2024-08-05 10:30:24

IOS开发 - Xib 九宫格应用管理的相关文章

iOS开发基础-九宫格坐标(4)

对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联.  WJQAppView 类中声明3个 IBOutlet 属性,与 appxib.xib 中的视图对象包含的 UIImageView . UILabel 和 UIButton 建立连接. WJQAppView 头文件代码如下所示: 1 //WJQAppView.h 2 @interface WJQAp

iOS开发基础-九宫格坐标(6)

继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppInfo 类实现. 实例代码 在 WJQAppInfo.h 中添加一个向外公开的接口,其返回处理好的模型数组,方法定义如下: + (NSArray *)appInfoArray; 实现代码如下: 1 //WJQAppInfo.m.将数据处理部分搬到模型类中进行处理 2 + (NSArray *)app

ios开发-UI基础-应用管理(单纯界面)改进4-xib封装

[注意]转载请注明出处:吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 上篇文章结尾介绍了一下为什么要对xib进行封装,这里不再赘述. 大体整理了一下封装的思路(我自己的想法,可能不是很清晰): 为了扩展,将xib的代码封装,创建一个类,来描述xib >在新建的.m文件中,新建一个类扩展(类似于viewController) >在新建的.h文件中,加入一个模型的属性(@class) >在新建的.m文件中,重写模型的set方法(在.h文件中已经加入了,自动生

iOS开发系列-九宫格算法-xib

给大家演示 应用程序下载 小项目,效果图:涉及知识点:懒加载,九宫格算法,字典转模型,自定义UIView ,xib文件的使用 首先把素材拖到Xcode项目中:简单看一下素材文件 此时大家应该首先关注.plist后缀的文件,里面存放的是我们用的数据,接下来看一下plist文件里面的数据 从这里面可以看到有12个应用程序下载,也就是12个UIView控件, 接下来,我们就加载这个plist文件,使用里面的数据.首先不是把plist文件拖拽到Xcode中就会自动使用的,而是加载plist文件,才能使用

ios开发-UI基础-应用管理(单纯界面)

功能分析 以九宫格的形式展示应用信息 点击下载按钮后,做出相应操作(弹出一个提示"正在下载",相应应用的下载按钮变为"已下载") 步骤分析 搭建UI界面 加载应用信息 根据应用的个数创建对应的view 监听下载按钮的点击 应用截图: 这个小的综合实例涉及到的知识点: UIView的常见属性和方法 九宫格的计算方法 字典转模型 xib的使用 view的封装 简单的MVC 九宫格分析: 搭建九宫格的步骤 明确每一块用的是什么view 明确每个view之间的父子关系 先尝

iOS开发笔记 - 用CocoaPods管理第三方库

在iOS项目中使用第三方类库可以说是非常常见的事,但是要正确配置这些第三方库会非常的繁琐,还好我们有CocoaPods来做这件事情,就如同在Java的世界里有Maven和Gradle,当然Maven的作用不仅仅是第三依赖库管理.通过CocoaPods工具我们可以为项目添加被称为"Pods"的依赖库(这些类库必须是CocoaPods本身所支持的),并且可以轻松管理其版本. ??CocoaPods意义体现在两个方面.第一,在引入第三方库时它可以自动为我们完成各种各样的配置,包括配置编译阶段

ios开发-UI基础-应用管理(单纯界面)改进2

本篇文章,通过字典转模型来改进上篇文章中的代码. 字典转模型,之前的文章已经介绍过,这里再重复一下:  字典转模型 字典:用来存储数据的,用键值对存储数据,是一个nsdictionary ,(不好处:key值容易写错) 模型: 用来存储数据的,一个字典对应一个模型,模型用属性来存储数据,是一个纯洁的object对象 @property(nonatomic,copy)NSString *name; @property(nonatomic,copy)NSString *icon; 字典转模型:一个字

iOS开发中的内存管理

一.为什么要进行内存管理 系统资源有限,iOS会为每个运行的程序分配30M的内存,超过20M会收到内存警告,超过30M将会终止应用程序.因此,要及时回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,以保证应用程序能正常运行. 二.需要管理的内存 应用程序在运行过程中,会占用一定栈空间和堆空间,也就是说,应用程序运行过程中的数据,有的是放在栈中,有的是放在堆中.栈中的数据由系统维护,无需开发人员来管理,而堆中的数据需要程序员来维护. 堆空间由开发人员请求分配的,比如开发人员发

ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/ 前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击. 在原来的基础上,使用代理的主要思路分析: 首先要新建一个协议 声明协议的要实现的方法(一般为optional) 声明一个遵守该协议的代理的属性 使用代理,通知其代理完成操作 在代理中的实现步骤: 遵守协议 设置代理(一般通过拖线