欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS 应用程序管理的实现

程序员文章站 2023-12-18 10:26:52
ios 应用程序管理的实现 1. 项目名称:应用管理 2. 项目截图展示 3. 项目功能 展示应用图标,名称和下载按钮 点击下载按钮,出现“正在下载”图标...

ios 应用程序管理的实现

1. 项目名称:应用管理

2. 项目截图展示

IOS 应用程序管理的实现

3. 项目功能

展示应用图标,名称和下载按钮

点击下载按钮,出现“正在下载”图标

4. 项目代码

模型代码:appinfo.h

#import <foundation/foundation.h>
#import <uikit/uikit.h>

@interface appinfo : nsobject

@property (nonatomic, copy) nsstring *name;
@property (nonatomic, copy) nsstring *icon;

@property (nonatomic, strong, readonly) uiimage *image;

/** 使用字典实例化模型 */
- (instancetype)initwithdict:(nsdictionary *)dict;

/** 快速实例化一个对象 */
+ (instancetype)appinfowithdict:(nsdictionary *)dict;

/** 返回所有plist中的数据模型数组 */
+ (nsarray *)applist;


@end

模型代码:appinfo.m

#import "appinfo.h"

@implementation appinfo

// 合成指令,主动指定属性使用的成员变量名称
@synthesize image = _image;

//图片模型
- (uiimage *)image
{
  if (_image == nil) {
    _image = [uiimage imagenamed:self.icon];
  }
  return _image;
}

- (instancetype)initwithdict:(nsdictionary *)dict
{

  self = [super init];
  if (self) {
    // 用字典给属性赋值
    //    self.name = dict[@"name"]; //将字典的内容赋值给属性
    //    self.icon = dict[@"icon"];
    [self setvaluesforkeyswithdictionary:dict];
  }
  return self;
}

+ (instancetype)appinfowithdict:(nsdictionary *)dict
{
  return [[self alloc] initwithdict:dict];
}

+ (nsarray *)applist
{
  nsarray *array = [nsarray arraywithcontentsoffile:[[nsbundle mainbundle] pathforresource:@"app.plist" oftype:nil]];

  // 创建一个临时可变数组
  nsmutablearray *arraym = [nsmutablearray array];

  // 遍历数组,依次转换模型
  for (nsdictionary *dict in array) {
    [arraym addobject:[appinfo appinfowithdict:dict]];
  }

  return arraym;
}

@end

模型view:appview.h

#import <uikit/uikit.h>

@class appinfo;

@interface appview : uiview

/** 类方法,方便调用视图 */
+ (instancetype)appview;

/** 实例化视图,并使用appinfo设置视图的显示 */
+ (instancetype)appviewwithappinfo:(appinfo *)appinfo;

// 自定义视图中显示的数据来源是数据模型
// 使用模型设置自定义视图的显示
@property (nonatomic, strong) appinfo *appinfo;

@end

模型view:appview.m

#import "appview.h"
#import "appinfo.h"

@interface appview()

@property (weak, nonatomic) iboutlet uiimageview *iconview;
@property (weak, nonatomic) iboutlet uilabel *label;

@end

@implementation appview

//实例化xib
+ (instancetype)appview
{
  return [[[nsbundle mainbundle] loadnibnamed:@"appview" owner:nil options:nil] lastobject];
}

//根据模型实例化xib
+ (instancetype)appviewwithappinfo:(appinfo *)appinfo
{
  // 1. 实例化一个视图
  appview *view = [self appview];

  // 2. 设置视图的显示
  view.appinfo = appinfo;//包含,appview有appinfo的属性

  // 3. 返回视图
  return view;
}

/**
 利用setter方法设置视图的界面显示
 */
- (void)setappinfo:(appinfo *)appinfo
{
  _appinfo = appinfo;

  self.label.text = appinfo.name;
  self.iconview.image = appinfo.image;
}

/** 按钮监听方法 */
- (ibaction)click:(uibutton *)button
{
  // 添加一个uilabel到界面上
  uilabel *label = [[uilabel alloc] initwithframe:cgrectmake(80, 400, 160, 40)];
  // 数值是0表示黑色,1表示纯白;alpha表示透明度
  label.backgroundcolor = [uicolor colorwithwhite:0.0 alpha:0.2];

  label.text = self.appinfo.name;
  label.textalignment = nstextalignmentcenter;

  // self.superview就是视图控制器中的self.view
  [self.superview addsubview:label];

  // 动画效果
  label.alpha = 0.0;

  // 禁用按钮,如果点击了按钮以后就禁用按钮
  button.enabled = no;

  // 动画结束之后删除
  [uiview animatewithduration:1.0f animations:^{
    // 要修改的动画属性
    label.alpha = 1.0;
  } completion:^(bool finished) {
    [uiview animatewithduration:1.0 animations:^{
      label.alpha = 0.0;
    } completion:^(bool finished) 
      [label removefromsuperview];
    }];
  }];
}

@end

viewcontroller.m

#import "viewcontroller.h"
#import "appinfo.h"
#import "appview.h"

#define kappvieww 80
#define kappviewh 90
#define kcolcount 3
#define kstarty  20

@interface viewcontroller ()

/** 应用程序列表 */
@property (nonatomic, strong) nsarray *applist;

@end

@implementation viewcontroller


- (nsarray *)applist
{
  if (_applist == nil) {
    _applist = [appinfo applist];
  }
  return _applist;
}

- (void)viewdidload
{
  [super viewdidload];

  // 搭建九宫格
  // 320 - 3 * 80 = 80 / 4 = 20
  cgfloat marginx = (self.view.bounds.size.width - kcolcount * kappvieww) / (kcolcount + 1);
  cgfloat marginy = 10;

  for (int i = 0; i < self.applist.count; i++) {

    // 行
    int row = i / kcolcount;

    // 列
    int col = i % kcolcount;

    cgfloat x = marginx + col * (marginx + kappvieww);
    cgfloat y = kstarty + marginy + row * (marginy + kappviewh);

    //加载第i个xib视图
    appview *appview = [appview appviewwithappinfo:self.applist[i]];

    // 设置视图位置
    appview.frame = cgrectmake(x, y, kappvieww, kappviewh);

    [self.view addsubview:appview];

    }
}

5. 本项目必须掌握的代码段

字典转模型

- (instancetype)initwithdict:(nsdictionary *)dict
{
  self = [super init];
  if (self) {
    [self setvaluesforkeyswithdictionary:dict];
  }
  return self;
}

+ (instancetype)appinfowithdict:(nsdictionary *)dict
{
  return [[self alloc] initwithdict:dict];
}

+ (nsarray *)applist
{
  nsarray *array = [nsarray arraywithcontentsoffile:[[nsbundle mainbundle] pathforresource:@"app.plist" oftype:nil]];

  // 创建一个临时可变数组
  nsmutablearray *arraym = [nsmutablearray array];

  // 遍历数组,依次转换模型
  for (nsdictionary *dict in array) {

    [arraym addobject:[appinfo appinfowithdict:dict]];
  }

  return arraym;
}

kvc

 [self setvaluesforkeyswithdictionary:dict];

6. 笔记

字典转模型:

plist文件有多个字典,把字典的元素转换成模型类对象的成员变量,将模型类对象放入数组中 模型的属性名称和plist文件中的key名称必须一致

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

上一篇:

下一篇: