简介:iOS的一些基础知识,还有应用管理App的封装版
学习完“下载app” 和 “疯狂猜图“ 这两个应用,相当于自学摸索半年
Supporting Files:除了源代码之外的资源文件的存放路径
1. 打开终端
2. 显示文件夹:chflags nohidden ~/Library
隐藏文件夹:chflags hidden ~/Library (默认是隐藏的)
这样就可以找到资源库文件夹了
/Users/aplle/资源库/Developer/Xcode/DerivedData
或者
/Users/aplle/Library/Developer/Xcode/DerivedData
当然我们也可以直接覆盖原来的文档。Xcode自带头文件的路径:
/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks
插件介绍
@property (nonatomic, weak) UIButton *btn;
// 字符串类型使用copy
@property (nonatomic, copy) NSString *str;
// 其他数据类型(NSArray。。。)使用strong
@property (nonatomic, strong) NSArray *apps;
// 基本数据类型assign
@property (nonatomic, assign) NSArray *apps;
模型应该提供一个可以传入字典参数的构造方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
instancetype只能用在返回值类型上,不能像id一样用在参数类型上
instancetype比id多一个好处:编译器会检测instancetype的真实类型
// //3. 添加view数据 使用xib
// BJApp *app = self.apps[index];
// UIImageView *iconView = appView.subviews[0];
// iconView.image = [UIImage imageNamed:app.icon];
//
// UILabel *nameLab = appView.subviews[2];
// nameLab.text = app.name;
我们已经使用xib对代码做了简化,但是数据还是暴漏在外面,
VC对于View得内部结构知道的一清二楚,我们需要对数据进行封装
// //3. 添加view数据 自定义BJAppView对数据进行封装
// BJApp *app = self.apps[index];
//
// appView.iconView.image = [UIImage imageNamed:app.icon];
//
// appView.nameLab.text = app.name;
//3. 添加view数据 自定义BJAppView对数据进行进一步封装,在setApp方法中设置数据
BJApp *app = self.apps[index];
appView.app = app;
外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
________________________________________________________________________________
该App需要掌握一下几点:
• UIView 的常见属性和方法
学习完“下载app” 和 “疯狂猜图“ 这两个应用,相当于自学摸索半年
1、xcode项目结构
Images.xcassets:用于存放图片资源Supporting Files:除了源代码之外的资源文件的存放路径
3、显示User中资源库的方法
开始使用mac系统进行iOS开发时,会遇到找不到模拟器所在文件夹。那是因为Library被隐藏了,只要在终端输入下面命令就可以实现显示和隐藏了:1. 打开终端
2. 显示文件夹:chflags nohidden ~/Library
隐藏文件夹:chflags hidden ~/Library (默认是隐藏的)
这样就可以找到资源库文件夹了
4、 修改了系统自带头文件后,Xcode会报错
解决方案:删掉下面文件夹的缓存即可(aplle是电脑的用户名)/Users/aplle/资源库/Developer/Xcode/DerivedData
或者
/Users/aplle/Library/Developer/Xcode/DerivedData
当然我们也可以直接覆盖原来的文档。Xcode自带头文件的路径:
/Applications/Xcode6-Beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/System/Library/Frameworks
5、xcode安装插件的方法
直接打开插件,run一下,退出xcode,run again ,Okay!插件介绍
6、定义属性
// 控件使用weak@property (nonatomic, weak) UIButton *btn;
// 字符串类型使用copy
@property (nonatomic, copy) NSString *str;
// 其他数据类型(NSArray。。。)使用strong
@property (nonatomic, strong) NSArray *apps;
// 基本数据类型assign
@property (nonatomic, assign) NSArray *apps;
7、自定义构造方法(alloc init.....)都是以(instancetype)开头,构造方法都是返回自定义类型
构造方法需要写if(self = [super init])8、字典转模型
字典转模型的过程最好封装在模型内部模型应该提供一个可以传入字典参数的构造方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
9、instancetype
instancetype在类型表示上,跟id一样,可以表示任何对象类型instancetype只能用在返回值类型上,不能像id一样用在参数类型上
instancetype比id多一个好处:编译器会检测instancetype的真实类型
#import "MJApp.h"
@implementation MJApp
- (instancetype)initWithDict:(NSDictionary *)dict
{
if (self = [super init]) {
self.name = dict[@"name"];
self.icon = dict[@"icon"];
}
return self;
}
/**
* 这里使用self,self表示谁调用方法代表谁。如果是BJApp的子类调用这个方法,则代表子类
*
* @param dict <#dict description#>
*
* @return 该对象
*/
+ (instancetype)appWithDict:(NSDictionary *)dict
{
return [[self alloc] initWithDict:dict];
}
@end
10、封装项目
// //3. 添加view数据 使用xib
// BJApp *app = self.apps[index];
// UIImageView *iconView = appView.subviews[0];
// iconView.image = [UIImage imageNamed:app.icon];
//
// UILabel *nameLab = appView.subviews[2];
// nameLab.text = app.name;
我们已经使用xib对代码做了简化,但是数据还是暴漏在外面,
VC对于View得内部结构知道的一清二楚,我们需要对数据进行封装
// //3. 添加view数据 自定义BJAppView对数据进行封装
// BJApp *app = self.apps[index];
//
// appView.iconView.image = [UIImage imageNamed:app.icon];
//
// appView.nameLab.text = app.name;
//3. 添加view数据 自定义BJAppView对数据进行进一步封装,在setApp方法中设置数据
BJApp *app = self.apps[index];
appView.app = app;
11、MVC
控制器负责加载模型数据,然后将数据给View12、view的封装
如果一个view内部的子控件比较多,一般会考虑自定义一个view,把它内部子控件的创建屏蔽起来,不让外界关心外界可以传入对应的模型数据给view,view拿到模型数据后给内部的子控件设置对应的数据
#import <UIKit/UIKit.h>
@class MJApp;
/**
* 使用xib的时候,需要将他的继承类改称BJAppView,然后在BJAppView中进行拖线
*/
@interface MJAppView : UIView
/**
* 模型数据
*/
@property (nonatomic, strong) MJApp *app;
+ (instancetype)appView;
/**
* 通过模型数据来创建一个view
*/
+ (instancetype)appViewWithApp:(MJApp *)app;
@end
// 重写模型的set方法,在set方法中将模型数据传递给View
- (void)setApp:(MJApp *)app
{
_app = app;
// 1.设置图标
self.iconView.image = [UIImage imageNamed:app.icon];
// 2.设置名称
self.nameLabel.text = app.name;
}
13、加载xib的方法
•
Xib
文件可以用来描述某一块局部的
UI
界面
•
•
Xib
文件的加载
Ø
方法
1
NSArray *objs = [[NSBundlemainBundle] loadNibNamed:@"MJAppView"owner:niloptions:nil];
UIButton *btn = objs[1];
这个方法会创建xib中的所有对象,并且将对象按顺序放到objs数组中
(如果xib如右图所示,那么objs数组中依次会有3个对象:1个UIView、1个UIButton、1个UISwitch)
Ø
方法
2
bundle参数可以为nil,默认就是mainbundle
UINib *nib = [UINibnibWithNibName:@"MJAppView"bundle:[NSBundlemainBundle]];
NSArray *objs = [nib instantiateWithOwner:niloptions:nil];
•
在开发阶段
,
面向开发者的是
xib
文件
;
当把应
用装到手机上时
,xib
文件就会转为
nib
文件
14、项目思路
加载数据,设置界面,封装数据________________________________________________________________________________
该App需要掌握一下几点:
• UIView 的常见属性和方法
•
九宫格计算方法
•
字典转模型
•
Xib
的使用
•
自定义
view
(
view
的封装)
•
简单的
MVC
————————————————————————————————————————————————————————————————————
用模型取代字典的好处
————————————————————————————————————————————————————————————————————
用模型取代字典的好处
•
使用字典的坏处
Ø
一般情况下,设置数据和取出数据都使用“字符串类型的
key
”,编写这些
key
时,编译器不会有任何友善提示,需要手敲
dict[@"name"] =@"Jack";
NSString *name = dict[@"name"];
Ø
手敲字符串
key
,
key
容易写错
Ø
Key
如果写错了,编译器不会有任何警告和报错,造成设错数据或者取错数据
•
使用模型的好处
Ø
所谓模型,其实就是数据模型,专门用来存放数据的对象
,
用它来表示数据会更加专业
Ø
模型设置数据和取出数据都是通过它的属性,属性名如果写错了,编译器会马上报错,因此,保证了数据的正确性
Ø
使用模型访问属性时,编译器会提供一系列的提示,提高编码效率
app.name =@"Jack”;
NSString *name = app.name;