iphone怎么回滚win10系统回滚 简书

本周下载排行榜再次点击tabBarItem回滚并刷新当前页面 - 简书
再次点击tabBarItem回滚并刷新当前页面
这次要实现一个类似新浪微博那种再次点击当前tabBarItem刷新当前页面的功能,在网上找了一些方法都觉得不合适,最后还是发现一个最简单的仅需要几行代码也不需要自定义的方法,在这边记录一下!
1.在TabBarController遵守代理UITabBarControllerDelegate,并设置self.delegate =
2.实现代理方法在这个方法中,tbc.selectedViewController是上一次点击对应的controller,vc是本次点击对应的controller,当两个controller相同时,说明你两次点击的tabBarItem相同,这个时候发送通知【因为我只需要在首页进行刷新,所以同时规定了选中的index等于0时才发送通知】
tbc.selectedIndex -- 上次点击的index
tbc.selectedViewController -- 上次点击的controller
- (BOOL)tabBarController:(UITabBarController *)tbc shouldSelectViewController:(UIViewController *)vc {
if ([tbc.selectedViewController isEqual:vc] && tbc.selectedIndex == 0) {
[[NSNotificationCenter defaultCenter] postNotificationName:@"doubleClick" object:nil];
return YES;
3.在对应controller里监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollAndLoad) name:@"doubleClick" object:nil];
实现方法【这里可以直接用MJRefresh的beginRefreshing方法,直接就可以回滚到顶部,并且刷新】
- (void)scrollAndLoad {
//这个方法可直接实现回滚到顶部并且开始刷新
[_streetSnapTableView.mj_header beginRefreshing];新买iPhone6s丢了咋办 教你轻松找回被偷iPhone - 简书
新买iPhone6s丢了咋办 教你轻松找回被偷iPhone
iPhone6s被偷了怎么办?对于刚刚入手新款iPhone 6s的用户而言,丢失或被盗 iPhone 6s手机确实是一件非常不幸运的事情。这里笔者为大家介绍一下iPhone6s被盗后需要做的一些事情,帮大家将损失降到最低。一般情况下,手机被偷盗找回来的机会很渺茫。对于丢失 iPhone 手机而言,很多人可能都更为在乎手机硬件的成本,却忽略了一些重要的个人隐私数据。这些个人数据,如果被他人恶意利用的话,可能还会为用户带来二次损失。一、先了解 iPhone 上的防盗防丢失功能1、自从 iOS6 系统开始,苹果为 iPhone 增加了一个叫做“查找我的 iPhone”的功能,它其实是用于防丢失防盗锁机用的。
2、这个功能位于【设置-iCloud】列表中,需要事先用自己的 Apple ID 登录 iCloud 服务以后,然后才可以启用这个功能。
3、如果一旦 iPhone 丢失或被盗时,便可以通过登录 iCloud 服务使用的 Apple ID 与丢失或被盗的 iPhone 手机取得联系。
4、在知道了 iPhone 防盗功能的工作方式以后,接下来就可以开始动手做一些善后处理了。当确定了在 iPhone 丢失或被盗以前,位于 iCloud 中的【查找我的iPhone】功能是打开的话,接下来便可以继续下面的操作了。
二、通过网络远程锁定或抹掉 iPhone 上的数据1、首先可以通过百度直接搜索“iCloud 官网”关键字,直达 iCloud 主页,如图所示
2、接下请在 iCloud 页面中,输入自己的 Apple ID 账号与密码,如图所示
3、随后请在 iCloud 主页面中,点击【查找我的 iPhone】图标,如图所示
4、接下来请等待系统定位 iPhone 当前的位置,如图所示
5、对于被盗的 iPhone 手机,相信都会被立即抢行关闭手机,从而让机主无法取得与 iPhone 手机的联系,所以一般情况下这里都会看到是离线状态的 iPhone 手机。当然如果是看到在线的话,那对于找回是有一定帮助的。如下图所示,当前这部 iPhone 是处于灰色,代表它是处于离线状态的。
6、此时请点击 iPhone 手机,可在在页面右上角看到对此 iPhone 的一些操作选项。对于被盗的 iPhone 手机,由于找回的机会非常渺茫,所以在这里建议大家为了自己个人的数据安全,直接选择【抹掉 iPhone】这个选项。7、最后再根据提示操作,便可以向被盗的 iPhone 发送远程抹掉数据的指令了。只要 iPhone 一开机并接入网络,它便会自动接收到删除指令,自动删除手机上所有的数据,避免个人数据被泄露。====科技圈=====最实用的玩机技巧、有逼格的科技评测、最前端的科技资讯!尽在微信公众号:kejiquancc(长按进行复制)iOS中几种数据持久化方案:我要永远地记住你!
招聘信息:
作者: 授权本站转载概论所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案:plist文件(属性列表)preference(偏好设置)NSKeyedArchiver(归档)SQLite 3CoreData沙盒在介绍各种存储方法之前,有必要说明以下沙盒机制。iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”。1.结构既然沙盒就是一个文件夹,那就看看里面有什么吧。沙盒的目录结构如下:"应用程序包"
&&&&Caches
&&&&Preferences
tmp2.目录特性虽然沙盒中有这么多文件夹,但是没有文件夹都不尽相同,都有各自的特性。所以在选择存放目录时,一定要认真选择适合的目录。"应用程序包": 这里面存放的是应用程序的源文件,包括资源文件和可执行文件。&&NSString&*path&=&[[NSBundle&mainBundle]&bundlePath];
&&NSLog(@"%@",&path);Documents: 最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据。&&NSString&*path&=&NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstO
&&NSLog(@"%@",&path);Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。&&NSString&*path&=&NSSearchPathForDirectoriesInDomains(NSCachesDirectory,&NSUserDomainMask,&YES).firstO
&&NSLog(@"%@",&path);Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。&&NSString&*path&=&NSTemporaryDirectory();
&&NSLog(@"%@",&path);plist文件plist文件是将某些特定的类,通过XML文件的方式保存在目录中。可以被序列化的类型只有如下几种:NSA
NSMutableA
NSMutableD
NSMutableD
NSMutableS
NSD1.获得文件路径&&&&NSString&*path&=&NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstO
&&&&NSString&*fileName&=&[path&stringByAppendingPathComponent:@"123.plist"];2.存储NSArray&*array&=&@[@"123",&@"456",&@"789"];
[array&writeToFile:fileName&atomically:YES];3.读取NSArray&*result&=&[NSArray&arrayWithContentsOfFile:fileName];
NSLog(@"%@",&result);4.注意只有以上列出的类型才能使用plist文件存储。存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。读取时使用arrayWithContentsOfFile:方法。Preference1.使用方法//1.获得NSUserDefaults文件
NSUserDefaults&*userDefaults&=&[NSUserDefaults&standardUserDefaults];
//2.向文件中写入内容
[userDefaults&setObject:@"AAA"&forKey:@"a"];
[userDefaults&setBool:YES&forKey:@"sex"];
[userDefaults&setInteger:21&forKey:@"age"];
//2.1立即同步
[userDefaults&synchronize];
//3.读取文件
NSString&*name&=&[userDefaults&objectForKey:@"a"];
BOOL&sex&=&[userDefaults&boolForKey:@"sex"];
NSInteger&age&=&[userDefaults&integerForKey:@"age"];
NSLog(@"%@,&%d,&%ld",&name,&sex,&age);2.注意偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。NSKeyedArchiver归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。1.遵循NSCoding协议NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。遵循协议和设置属性&&//1.遵循NSCoding协议&
&&@interface&Person&:&NSObject&&&//2.设置属性
&&@property&(strong,&nonatomic)&UIImage&*
&&@property&(copy,&nonatomic)&NSString&*
&&@property&(assign,&nonatomic)&NSInteger&
&&@end实现协议方法&&//解档
&&-&(id)initWithCoder:(NSCoder&*)aDecoder&{
&&&&&&if&([super&init])&{
&&&&&&&&&&self.avatar&=&[aDecoder&decodeObjectForKey:@"avatar"];
&&&&&&&&&&self.name&=&[aDecoder&decodeObjectForKey:@"name"];
&&&&&&&&&&self.age&=&[aDecoder&decodeIntegerForKey:@"age"];
&&&&&&return&
&&-&(void)encodeWithCoder:(NSCoder&*)aCoder&{
&&&&&&[aCoder&encodeObject:self.avatar&forKey:@"avatar"];
&&&&&&[aCoder&encodeObject:self.name&forKey:@"name"];
&&&&&&[aCoder&encodeInteger:self.age&forKey:@"age"];
&&}特别注意如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;2.使用需要把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile: 方法。&&NSString&*file&=&[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstObject&stringByAppendingPathComponent:@"person.data"];
&&Person&*person&=&[[Person&alloc]&init];
&&person.avatar&=&self.avatarView.
&&person.name&=&self.nameField.
&&person.age&=&[self.ageField.text&integerValue];
&&[NSKeyedArchiver&archiveRootObject:person&toFile:file];需要从文件中解档对象就调用NSKeyedUnarchiver的一个工厂方法 unarchiveObjectWithFile: 即可。&&NSString&*file&=&[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstObject&stringByAppendingPathComponent:@"person.data"];
&&Person&*person&=&[NSKeyedUnarchiver&unarchiveObjectWithFile:file];
&&if&(person)&{
&&&&&self.avatarView.image&=&person.
&&&&&self.nameField.text&=&person.
&&&&&self.ageField.text&=&[NSString&stringWithFormat:@"%ld",&person.age];
&&}3.注意必须遵循并实现NSCoding协议保存文件的扩展名可以任意指定继承时必须先调用父类的归档解档方法SQLite3之前的所有存储方法,都是覆盖存储。如果想要增加一条数据就必须把整个文件读出来,然后修改数据后再把整个内容覆盖写入文件。所以它们都不适合存储大量的内容。1.字段类型表面上SQLite将数据分为以下几种类型:integer : 整数real : 实数(浮点数)text : 文本字符串blob : 二进制数据,比如文件,图片之类的实际上SQLite是无类型的。即不管你在创表时指定的字段类型是什么,存储是依然可以存储任意类型的数据。而且在创表时也可以不指定字段类型。SQLite之所以什么类型就是为了良好的编程规范和方便开发人员交流,所以平时在使用时最好设置正确的字段类型!主键必须设置成integer2. 准备工作准备工作就是导入依赖库啦,在iOS中要使用SQLite3,需要添加库文件:libsqlite3.dylib并导入主头文件,这是一个C语言的库,所以直接使用SQLite3还是比较麻烦的。3.使用创建数据库并打开操作数据库之前必须先指定数据库文件和要操作的表,所以使用SQLite3,首先要打开数据库文件,然后指定或创建一张表。/**
*&&打开数据库并创建一个表
-&(void)openDatabase&{
&&&//1.设置文件名
&&&NSString&*filename&=&[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstObject&stringByAppendingPathComponent:@"person.db"];
&&&//2.打开数据库文件,如果没有会自动创建一个文件
&&&NSInteger&result&=&sqlite3_open(filename.UTF8String,&&_sqlite3);
&&&if&(result&==&SQLITE_OK)&{
&&&&&&&NSLog(@"打开数据库成功!");
&&&&&&&//3.创建一个数据库表
&&&&&&&char&*errmsg&=&NULL;
&&&&&&&sqlite3_exec(_sqlite3,&"CREATE&TABLE&IF&NOT&EXISTS&t_person(id&integer&primary&key&autoincrement,&name&text,&age&integer)",&NULL,&NULL,&&errmsg);
&&&&&&&if&(errmsg)&{
&&&&&&&&&&&NSLog(@"错误:%s",&errmsg);
&&&&&&&}&else&{
&&&&&&&&&&&NSLog(@"创表成功!");
&&&}&else&{
&&&&&&&NSLog(@"打开数据库失败!");
}执行指令使用 sqlite3_exec() 方法可以执行任何SQL语句,比如创表、更新、插入和删除操作。但是一般不用它执行查询语句,因为它不会返回查询到的数据。/**
*&&往表中插入1000条数据
-&(void)insertData&{
NSString&*nameS
NSInteger&
for&(NSInteger&i&=&0;&i&<&1000;&i++)&{
&&nameStr&=&[NSString&stringWithFormat:@"Bourne-%d",&arc4random_uniform(10000)];
&&age&=&arc4random_uniform(80)&+&20;
&&NSString&*sql&=&[NSString&stringWithFormat:@"INSERT&INTO&t_person&(name,&age)&VALUES(&#39;%@&#39;,&&#39;%ld&#39;)",&nameStr,&age];
&&char&*errmsg&=&NULL;
&&sqlite3_exec(_sqlite3,&sql.UTF8String,&NULL,&NULL,&&errmsg);
&&if&(errmsg)&{
&&&&&&NSLog(@"错误:%s",&errmsg);
NSLog(@"插入完毕!");
}查询指令前面说过一般不使用 sqlite3_exec() 方法查询数据。因为查询数据必须要获得查询结果,所以查询相对比较麻烦。示例代码如下:sqlite3_prepare_v2() : 检查sql的合法性sqlite3_step() : 逐行获取查询结果,不断重复,直到最后一条记录sqlite3_coloum_xxx() : 获取对应类型的内容,iCol对应的就是SQL语句中字段的顺序,从0开始。根据实际查询字段的属性,使用sqlite3_column_xxx取得对应的内容即可。sqlite3_finalize() : 释放stmt/**
*&&从表中读取数据到数组中
-&(void)readData&{
&&&NSMutableArray&*mArray&=&[NSMutableArray&arrayWithCapacity:1000];
&&&char&*sql&=&"select&name,&age&from&t_";
&&&sqlite3_stmt&*
&&&NSInteger&result&=&sqlite3_prepare_v2(_sqlite3,&sql,&-1,&&stmt,&NULL);
&&&if&(result&==&SQLITE_OK)&{
&&&&&&&while&(sqlite3_step(stmt)&==&SQLITE_ROW)&{
&&&&&&&&&&&char&*name&=&(char&*)sqlite3_column_text(stmt,&0);
&&&&&&&&&&&NSInteger&age&=&sqlite3_column_int(stmt,&1);
&&&&&&&&&&&//创建对象
&&&&&&&&&&&Person&*person&=&[Person&personWithName:[NSString&stringWithUTF8String:name]&Age:age];
&&&&&&&&&&&[mArray&addObject:person];
&&&&&&&self.dataList&=&mA
&&&sqlite3_finalize(stmt);
}4.总结总得来说,SQLite3的使用还是比较麻烦的,因为都是些c语言的函数,理解起来有些困难。不过在一般开发过程中,使用的都是第三方开源库 FMDB,封装了这些基本的c语言方法,使得我们在使用时更加容易理解,提高开发效率。FMDB1.简介FMDB是iOS平台的SQLite数据库框架,它是以OC的方式封装了SQLite的C语言API,它相对于cocoa自带的C语言框架有如下的优点:使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码对比苹果自带的Core Data框架,更加轻量级和灵活提供了多线程安全的数据库操作方法,有效地防止数据混乱注:2.核心类FMDB有三个主要的类:FMDatabase一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句FMResultSet使用FMDatabase执行查询后的结果集FMDatabaseQueue用于在多线程中执行多个查询或更新,它是线程安全的3.打开数据库和c语言框架一样,FMDB通过指定SQLite数据库文件路径来创建FMDatabase对象,但FMDB更加容易理解,使用起来更容易,使用之前一样需要导入sqlite3.dylib。打开数据库方法如下:NSString&*path&=&[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&NSUserDomainMask,&YES).firstObject&stringByAppendingPathComponent:@"person.db"];
FMDatabase&*database&=&[FMDatabase&databaseWithPath:path];&&&&
if&(![database&open])&{
&&&&NSLog(@"数据库打开失败!");
}值得注意的是,Path的值可以传入以下三种情况:具体文件路径,如果不存在会自动创建空字符串@"",会在临时目录创建一个空的数据库,当FMDatabase连接关闭时,数据库文件也被删除nil,会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁4.更新在FMDB中,除查询以外的所有操作,都称为“更新”, 如:create、drop、insert、update、delete等操作,使用executeUpdate:方法执行更新://常用方法有以下3种:&&&
-&(BOOL)executeUpdate:(NSString*)sql,&...
-&(BOOL)executeUpdateWithFormat:(NSString*)format,&...
-&(BOOL)executeUpdate:(NSString*)sql&withArgumentsInArray:(NSArray&*)arguments
[database&executeUpdate:@"CREATE&TABLE&IF&NOT&EXISTS&t_person(id&integer&primary&key&autoincrement,&name&text,&age&integer)"];&&&
[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES(?,&?)",&@"Bourne",&[NSNumber&numberWithInt:42]];5.查询查询方法也有3种,使用起来相当简单:-&(FMResultSet&*)executeQuery:(NSString*)sql,&...
-&(FMResultSet&*)executeQueryWithFormat:(NSString*)format,&...
-&(FMResultSet&*)executeQuery:(NSString&*)sql&withArgumentsInArray:(NSArray&*)arguments查询示例://1.执行查询
FMResultSet&*result&=&[database&executeQuery:@"SELECT&*&FROM&t_person"];
//2.遍历结果集
while&([result&next])&{
&&&&NSString&*name&=&[result&stringForColumn:@"name"];
&&&&int&age&=&[result&intForColumn:@"age"];
}6.线程安全在多个线程中同时使用一个FMDatabase实例是不明智的。不要让多个线程分享同一个FMDatabase实例,它无法在多个线程中同时使用。 如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题。所以,请使用 FMDatabaseQueue,它是线程安全的。以下是使用方法:创建队列。FMDatabaseQueue&*queue&=&[FMDatabaseQueue&databaseQueueWithPath:aPath];使用队列[queue&inDatabase:^(FMDatabase&*database)&{&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_1",&[NSNumber&numberWithInt:1]];&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_2",&[NSNumber&numberWithInt:2]];&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_3",&[NSNumber&numberWithInt:3]];&&&&&&
&&&&&&&&&&FMResultSet&*result&=&[database&executeQuery:@"select&*&from&t_person"];&&&&
&&&&&&&&&while([result&next])&{&&&
&&&&&&&&&}&&&&
}];而且可以轻松地把简单任务包装到事务里:[queue&inTransaction:^(FMDatabase&*database,&BOOL&*rollback)&{&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_1",&[NSNumber&numberWithInt:1]];&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_2",&[NSNumber&numberWithInt:2]];&&&&
&&&&&&&&&&[database&executeUpdate:@"INSERT&INTO&t_person(name,&age)&VALUES&(?,&?)",&@"Bourne_3",&[NSNumber&numberWithInt:3]];&&&&&&
&&&&&&&&&&FMResultSet&*result&=&[database&executeQuery:@"select&*&from&t_person"];&&&&
&&&&&&&&&&&&&while([result&next])&{&&&
&&&&&&&&&&&&&}&&&
&&&&&&&&&&&//回滚
&&&&&&&&&&&*rollback&=&YES;&&
&&&&}];FMDatabaseQueue 后台会建立系列化的G-C-D队列,并执行你传给G-C-D队列的块。这意味着 你从多线程同时调用调用方法,GDC也会按它接收的块的顺序来执行。CoreData详见我的另一篇笔记:声明:以上内容属于本人整理的笔记,如有错误的地方希望能告诉我,大家共同进步。以上内容有些段落或语句可能是本人从其他地方Copy而来,如有侵权,请及时告诉我。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6194点击量4495点击量3640点击量3605点击量3281点击量2860点击量2787点击量2720点击量2616
&2016 Chukong Technologies,Inc.
京公网安备89列表视图最简洁的回滚到顶部的解决方案 - 简书
列表视图最简洁的回滚到顶部的解决方案
iOS中的列表视图自带回滚到顶部的功能,就是设置scrollsToTop属性为YES即可,但是当控制其中有多个视图的时候,就不灵了,我也看过网上给过的解决方案,需要设置其他UIScrollView视图的scrollsToTop属性为NO才奏效。这样个人感觉很麻烦,为什么不用黑魔法呢,哈哈,请看我的解决方案。1. 首先我们得找到系统的statusBar,怎么找呢?系统提供了我们设置StatusBar的各种属性,例如常用的
[UIApplication sharedApplication].statusBarHidden所以我怀疑statusBar会是UIApplication的私有化的属性,然后进去了UIApplication的API文档,找到了@class UIStatusBar。所以我个人认为statusBar应该是[UIApplication sharedApplication] 这个单例类所持有的视图(应该是继承于UIView),所以statusBar应该是具有唯一性的。然后顺藤摸瓜,我们通过Runtime来扒一扒。先找到对应的type,找到对应的那么,最后通过KVC,拿到statusBar对象。
2. 在什么地方调用 statusBarView 方法呢?个人认为得在UIViewController中调用,一般逻辑处理都在控制器中进行。最后选择在控制器的生命周期方法viewDidLoad 中调用,只能用方法交换来处理了,不然太low了,所以得用category了。在load类方法中我们得做一个方法交换了。
load中的方法是我对NSObject的category中做的交换方法所用的。
这样我就可以在交换后的方法 swizz_viewDidLoad 中获取statusBar了,取出statusBar后,我又对UIStatusBar中的变量遍历打印,没有发现点击手势之类的属性,好吧,只能我自己添加了。
很明显思路已经清晰了,我们可以在手势的点击方法中做相关的处理,我目前是在UIViewController的categroy中添加Block属性,category中动态添加属性只能通过关联引用了。
最后我们在控制器中的属性Block回调中就可以通过设置UIScrollView的setContentOffset 为CGPointZero 来达到回滚到顶部的效果啦!!! 逻辑处理在UIViewController中,需要哪个UIScrollView回滚,直接调用setContentOffset 方法即可,不用管理其他视图的,简单粗暴哦。Note: 以下是新添加的内容,有关手势的移除问题:在项目中运用后,发现当控制器移除后,再次点击statusBar会出现这种内存错误 -[XXXController tapGestureAction]: message sent to deallocated instance 0x,很明显是控制器移除了,但是点击手势还是存在的,当向一个释放掉的对象发送消息时,会出现这种Crash: EXC_BAD_ACCESS(code=1,address=0x0) 。所以我们应该在控制器的生命周期结束之前,把手势的响应方法移除掉才行。必须混写dealloc方法了,注意直接混写dealloc是会报错的,ARC forbids use of 'dealloc' in a @selector.so, 换一种方式,在load方法中这样写:[self swizzWithClass:[self class] originSel:NSSelectorFromString(@"dealloc") newSel:@selector(swizz_dealloc)];然后在混写后的方法中,对相应的点击手势做一个移除操作就OK了。
以上是全部内容,有异议或者有更好的建议的,欢迎大家指正,谢谢!}

我要回帖

更多关于 ios回滚系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信