Xcode 5.0 下载,安装,使用 & iOS开发 -应用管理使用 xib及mvc封装

本文详细介绍了Xcode5.0的更新内容,包括支持64位应用开发、OSX Mavericks开发、TDD、Continuous Integration等。同时,深入探讨了XIB文件与MVC封装的概念、加载方式以及实现过程,提供了从XIB文件到MVVM模式的转换方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)xcode5.0

http://magicalboy.com/xcode-5-0/

Xcode 5.0 是一个大版本,改变自然也多,支持我的 iPhone5s 和 iOS7.0 开发必须的工具。另外也支持 64bit app 开发,还有支持 OS X Mavericks 开发,TDD,Continuous Integration,自动化配置等。改进方面有界面 Flat 化,可视化调试,静态分析,代码管理等。 具体请见What’s New in Xcode 5

Xcode 5.0 下载

Xcode 5.0 正式版发布于2013年9月18日(美国当地时间),可以从Mac Store上下载安装,免费。前提条件上是,系统版本必须 Mountain Lion 10.8.5 及以上,否则:


Xcode 5.0 安装

下载好DMG安装包后,打开会发现 Xcode 以 app 的形式发布,直接复制到本地磁盘即可,比如 ~/Development 下,与之前版本的 Xcode 路径不同即可。

Xcode 5.0 使用

这里说一下初步使用情况。

  1. Code Signing 增加了 Provisioning Profile,真机调试的时候要注意先选择对应的Profile,再选选 Identify,否则会找不到。
  2. 旧项目升级问题,如果项目代码用到 SVN 1.7 之前版本来管理,会提示升级到 1.7,升级后,旧的Xcode就识别不了啦。
  3. 与旧项目兼容问题,主要是指项目中的 XIB 文件,在 Xcode 5.0 中会自动升级,只要你打开过。升级后的 XIB 在旧的 Xcode 打不开,重要的是有些 XIB 升级后,布局乱了,主要是坐标混乱。。
  4. 不支持 4.3 模拟器,项目Target却允许支持到 4.3,估计还支持真机调试(未测试)。

技术升级太快,一下子就 iOS 7, Xcode 5 了,得勇于面对新事物,快速学习新的知识才不被落后啊,一起努力吧,求交流。


(2) xib及mvc封装

1.xib简单介绍

在iOS5之前,苹果使用xib文件来描述UI界面


在iOS5之后,苹果采取了更加强大和先进的storyboard文件来描述界面

xib和storyboard的比较,一个轻量级一个重量级。

共同点:

都用来描述软件界面

都用Interface Builder工具来编辑

不同点:

Xib是轻量级的,用来描述局部的UI界面

Storyboard是重量级的,用来描述整个软件的多个界面,并且能展示多个界面之间的跳转关系

2.要想随意调整xib中view的尺寸,首先要设置size为Freeform




3.xib的加载

Xib文件可以用来描述某一块局部的UI界面

Xib文件的加载
方法1
NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"MJAppView" owner:nil options:nil];
这个方法会创建xib中的所有对象,并且将对象按顺序放到objs数组中
(如果xib如右图所示,那么objs数组中依次会有3个对象:1个UIView、1个UIButton、1个UISwitch)


方法2
bundle参数可以为nil,默认就是main bundle
UINib *nib = [UINib nibWithNibName:@"MJAppView" bundle:[NSBundle mainBundle]];
NSArray *objs = [nib instantiateWithOwner:nil options:nil];


在开发阶段,面向开发者的是xib文件; 当把应用装到手机上时,xib文件就会转为nib文件

4.实现

4.1 xib


4.2封装——新建MJAppView类
如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心


外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
//  MJAppView.h

#import <UIKit/UIKit.h>

@class MJApp;

@interface MJAppView : UIView

/**
 *  模型数据
 */
@property (nonatomic, strong) MJApp *app;

+ (instancetype)appView;

/**
 *  通过模型数据来创建一个view
 */
+ (instancetype)appViewWithApp:(MJApp *)app;

@end
//
//  MJAppView.m

#import "MJAppView.h"
#import "MJApp.h"

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

@implementation MJAppView

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

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

+ (instancetype)appView
{
    return [self appViewWithApp:nil];  //调用上面的appViewWithApp方法
}

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

@end

4.3模型类
//
//  MJApp.h

//  模型类:用来存放数据的类

#import <Foundation/Foundation.h>

/**
 copy : NSString
 strong: 一般对象
 weak: UI控件
 assign:基本数据类型
 */

@interface MJApp : NSObject
/**
 *  名称
 */
@property (nonatomic, copy) NSString *name;
/**
 *  图标
 */
@property (nonatomic, copy) NSString *icon;

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

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

//  MJApp.m

//

#import "MJApp.h"

@implementation MJApp
- (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

4.4控制器
//
//  MJViewController.m

#import "MJViewController.h"
#import "MJApp.h"
#import "MJAppView.h"

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

@implementation MJViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 添加应用信息
    
    // 0.总列数(一行最多3列)
    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
        MJAppView *appView = [MJAppView appViewWithApp:self.apps[index]];   //依据xib依次创建apps.count个小格子
        
        // 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);
        
        // 3.4.传递模型设置数据  (调用MJAppView类的set方法)
//        appView.app = self.apps[index];
    }
}

- (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.创建模型对象
            MJApp *app = [MJApp appWithDict:dict];
            
            // 3.2.添加模型对象到数组中
            [appArray addObject:app];
        }
        
        // 4.赋值
        _apps = appArray;
    }
    return _apps;
}

@end


5.运行结果




6.封装总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值