UIPageViewController,值得注意的是设置了datasource,此外,datasource最好是一个直接继承NSObject的自定义类。
此外还需要设置initial content就是设置viewControllers这个是必须的,因为这个是第一页内容的显示。
Datasource
Delegate
Controllers(Array)
Gestures(Array)
UIgesturerecognization: http://blog.csdn.net/totogo2010/article/details/8615940/
—2015.11.4
IOS uitabbarcontroller和UInavigation 综合使用的时候,在设置viewcontrollr的Title的时候要用viewcontroller.navigationitem.title,而不是viewcontroller.title,因为如果用后者那么navigation.tabbaritem.title的值会被覆盖。
今天修理了前面做的细节问题:
1. cell有自带的label,imageView属性,
这样就可以省去再添加这些,可以节省空间。
2. 用UITableViewDelegate的方法
这个方法只是对对应的行进行了预留,而不是改变cell的高度。Cell的高度一般要重写initWithFrame的方法,或者是自定义cell改变其高度。不过cell的高度并不影响显示效果。(目前是这样的)。
3. 往工程添加文件或者图片的时候,故事版要选择ADD的Copy if needed的选项,否则可能会出现显示不出或者程序找不到文件。
4.就是调用顺序的问题,在用某个对象的属性值的时候,要先确保该对象已经初始化并且赋值。
5. UIPageContrl的currentPage属性是跟当前显示的页面一致的,所以显示哪一页其值自动更新。
6.拿到一个页面布局的时候要考虑其扩展性。
7.在 iOS 7 中,如果某个 UIViewController 的 self.view 第一个子视图是 UIScollView, 同时当这个 UIViewController 被 push 或 initWithRootController 成为 UINavigationController控制的Controller时,这个 UIViewController的 view 的子视图 UIScollView 的所有子视图, 都会被下移 64px。
这个下移 64px 的前提是 navigationBar 和 statusBar 没有隐藏。因为为 statusBar 默认的 Height 是 20px,而 navigatiBar 默认的 Height 是 44px。
解决办法一:在 ViewController 的 init 的方法中增加一行代码:
self.automaticallyAdjustsScrollViewInsets = NO;
解决办法二:让UIScrollView 不要成为 ViewController 的 View 的第一个子视图。具体操作:将 viewDidLoad方法 修改成如下:
- (void)viewDidLoad
{
[super viewDidLoad];
UIView *firstSubView = [[UIView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:firstSubView];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0, 64.0, 260.0, 300.0)];
[scrollView setBackgroundColor:[UIColor redColor]];
UIView *view = [[UIView alloc] initWithFrame:scrollView.bounds];
[view setBackgroundColor:[UIColor blueColor]];
[scrollView addSubview:view];
[self.view addSubview:scrollView];
}
解决办法三: 将 UIScorllView 的子视图上移 64.0px 。修改 viewDidLoad 方法:
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(30.0, 64.0, 260.0, 300.0)];
[scrollView setBackgroundColor:[UIColor redColor]];
CGRect viewFrame = CGRectMake(0, -64.0, CGRectGetWidth(scrollView.frame),
CGRectGetHeight(scrollView.frame));
UIView *view = [[UIView alloc] initWithFrame: viewFrame];
[view setBackgroundColor:[UIColor blueColor]];
[scrollView addSubview:view];
[self.view addSubview:scrollView];
对于我的项目,是Scroll与pageControl的结合使用,办法三是不可取的,因为视图自动上移64px,当pageControl自动更新,会上移,所以我采取的是最简洁的第一种解决办法。
ios强大的第三方库:
MBProgressHub,SDWebimage,AFNetworking.KVOController,Mantle,MessageDisplayKit.
回调:
block,不影响程序的正常运行,但是是程序的部分。相当于程序做自己的事的同时分出一个线程去执行另一件事,然后在特定条件下返回结果。
–2015.12.2
iOS NSCoder,NSCoding,NSKeyedachiver,NSUserDefault
1到底这个序列化有何作用?
面向对象的程序在运行的时候会创建一个复杂的对象图,经常要以二进制的方法序列化这个对象图,这个过程叫做Archiving. 二进制流可以通过网络或写入文件中。
当你写的数据需要本地存储时,即将你的数据写到硬盘上的时候,你就必须对其进行序列化,转换成二进制文件,从而便于在磁盘上的读写,同理在取出的时候必须将其在反序列化,这样才能将数据读出来,就好比加密和解密的过程。
2 为什么将数据写到plist 中的时候,也是存储到本地的磁盘上,但是没有序列化?
大家有没有发现,其实plist 的数据是类型是有限制的,就那么几种特定的数据类型nsstring ,大家有没有尝试过将一个自己定义的类放进去(写进plist ),再读出来?
结果是什么大家可以先猜想。
其实在nsstring 的类的定义中已经添加了协议 即实现了nscoding 代理的方法。
@interface NSString : NSObject <NSCopying, NSMutableCopying, NSCoding>
深入
3 NScoder 和 NScoding
NScoding 是一个协议,主要有下面两个方法
-(id)initWithCoder:(NSCoder *)coder;//从coder中读取数据,保存到相应的变量中,即反序列化数据
-(void)encodeWithCoder:(NSCoder *)coder;// 读取实例变量,并把这些数据写到coder中去。序列化数据
NSCoder 是一个抽象类,抽象类不能被实例话,只能提供一些想让子类继承的方法。
NSKeyedUnarchiver 从二进制流读取对象。
NSKeyedArchiver 把对象写到二进制流中去。
4.一个简单的例子
一般是在自己定义的类中需要在.h 文件中加入
在.m 文件众实现他的的两个代理方法,这个代理方法将会被自动调用
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.InsureSolutionID forKey:@"personName"];
[aCoder encodeObject:self.InsureSolutionName forKey:@"personAge"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self)
{
self.InsureSolutionID = [aDecoder decodeObjectForKey:@"personName"];
self.InsureSolutionName = [aDecoder decodeObjectForKey:@"personAge"];
}
return self;
}
以上是对该类序列化和反序列化。
NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:self.DataArray];
[[NSUserDefaults standardUserDefaults] setObject:archiveCarPriceData forKey:@"DataArray"];
NSData *myEncodedObject = [[NSUserDefaults standardUserDefaults] objectForKey:@"DataArray"];
self.dataList = [NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
iOS NSUserDefaults:
1. NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了
2. 了解NSUserDefaults以及它可以直接存储的类型
NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前提,也是大家喜欢用它保存简单数据的一个主要原因。
使用 NSUserDefaults 存储自定义对象的最初,我们必须认识NSUserDefaults可以存储哪一些类型的数据,下面一一列出:
NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
- 如何存储自定义对象
1、将自定义类型转换为NSData类型
当数据重复而且多的时候(例如想存储全班同学的学号,姓名,性别(这个数据量可能太大了 )),如果不用SQLite 存储 (多数据最好还是用这个),你可以选择使用归档,再将文件写入本地,但是这种方式和 NSUserDefaults 比起来麻烦多了(因为NSFileManage 本来就挺复杂) ,但是问题是,NSUserDefaults 本身不支持自定义对象的存储,不过它支持NSData的类型,下面举一个例子来介绍。
我们先建立一个叫Student 的类,这个类里有三个属性(学号,姓名,性别)
#import <Foundation/Foundation.h>
@interface Student:NSObject<NsCoding>
@property(strong,nonamic) NSString *name;
@property(strong, nonamic) NSString *number;
@property(strong, nonamic) NSString * sex;
@end
@implement Student
@Synthesize name;
@Synthesize number;
@Synthesize sex;
-(void)encodeWithCoder:(NsCoder *)aCoder{
[aCoder encodeWithCoder:self.name forKey:@"name"];
[aCoder encodeWithCoder:self.number forKey:@"number"];
[aCoder encodeWithCoder:self.sex forKey:@"sex"];
}
-(id)initWithCoder:(NSCoder *)aDecoder{
if(self == [super init])
{
self.name = [aDecoder decodeObjectforKey:@"name"];
self.name = [aDecoder decodeObjectforKey:@"number"];
self.name = [aDecoder decodeObjectforKey:@"sex"];
}
return self;
}
将自定义对象转换成NSData类型。
2、将自定义类型数据存入 NSUserDefaults 中
如果要存储全班同学的信息,我们可以建一个NSMutableArray 来存放全班同学的信息(里面存储的全是NSData对象)在需要存储的地方加入代码:
具体代码在2015.12 -> NSUserDefault
因为去年做iOS开发是自己做的笔记,所以都记了日期!