12

EGORefreshTableHeaderView,列表视图下拉刷新开源类

关于如何在页面中使用EGORefreshTableHeaderView的文章网上一大把, 抄来抄去的, 但也都没什么大问题.  只是在XCode4.2的ARC环境中使用的时候, 错误一把. 借此机会, 完整的记录一下如何排除错误, 及使用的方法.

首先第一步当然是下载这个下拉更新的框架了.  https://github.com/enormego/EGOTableViewPullRefresh/downloads

 

下载之后解包, 然后将

EGORefreshTableHeaderDelegate.h

EGORefreshTableHeaderDelegate.m

这两个文件, 以及项目中的图片文件都复制到你的项目文件内, 这时候, 如果你启用了ARC, 应该会报一片错误, 让我们来具体看一下.

 

启用了ARC之后, 就不允许手动的release了, 因此, [view release], [lable release] 还有 autorelease这样的代码都需要删除掉.

在EGORefreshTableHeaderDelegate.m的这个文件中,   @synthesize delegate=_delegate;  会报错,  “Existing ivar “delegate” for assign property “delegate” must be… 

解决办法是需要将EGORefreshTableHeaderDelegate.h文件中的 assign 换为retain

 

  1. //@property(nonatomic,assign) id <EGORefreshTableHeaderDelegate> delegate;   //删除掉. 换为下面的
  2. @property(nonatomic,retain)id <EGORefreshTableHeaderDelegate> delegate;

 

这样代码就会通过编译了~ 这样就需要将EGORefreshTableHeaderView与我们的tableview整合了, 然后按照Demo的方法,

添加EGORefreshTableHeaderDelegate的接口,

定义_reloading, 和EGORefreshHeaderView

声明reloadTableViewDataSource和doneLoadingTableView这两个函数

 

 

  1. #import <UIKit/UIKit.h>
  2. #import “EGORefreshTableHeaderView.h”
  3. @interface FMFutureMessage : UIViewController<UITableViewDelegate, UITableViewDataSource,EGORefreshTableHeaderDelegate>
  4. {
  5.     BOOL _reloading;
  6.     EGORefreshTableHeaderView *_refreshHeaderView;
  7. }
  8. @property(strong, nonatomic) IBOutlet UITableView *tbView;
  9. -(void)reloadTableViewDataSource;
  10. -(void)doneLoadingTableViewData;
  11. @end

接下来, 我们需要将xib文件中的TableViewController与这里定义的tbView建立关联, 因为我忘记了指定tbView与XIB中的TabViewController, 导致了刷新箭头怎么样也显示不出来, 所以一定不要忘记啊~~~~
现在我们处理一下.m文件

 

处理m文件, 建立关联.和响应事件.

 

  1. – (void)viewDidLoad
  2. {
  3.     [super viewDidLoad];
  4.     // Do any additional setup after loading the view from its nib.
  5.     if(_refreshHeaderView == nil)
  6.     {
  7.         EGORefreshTableHeaderView *view = [[EGORefreshTableHeaderView alloc] initWithFrame:CGRectMake(0.0f, 0.0f – self.tbView.bounds.size.height, self.view.frame.size.width, self.tbView.bounds.size.height)];
  8.         view.delegate = self;
  9.         [self.tbView addSubview:view];
  10.         _refreshHeaderView = view;
  11.     }
  12.     [_refreshHeaderView refreshLastUpdatedDate];
  13. }

 

 

响应事件, 事件的响应代码就简单的多了, 按照DEMO的方法, 把接口的函数都声明了就OK了.

 

  1. -(void)reloadTableViewDataSource
  2. {
  3.     NSLog(@”==开始加载数据”);
  4.     [self.tbView reloadData];
  5.     _reloading = YES;
  6. }
  7. – (void)doneLoadingTableViewData{
  8.      NSLog(@”===加载完数据”);
  9.     //  model should call this when its done loading
  10.        _reloading = NO;
  11.     [_refreshHeaderView egoRefreshScrollViewDataSourceDidFinishedLoading:self.tbView];
  12. }
  13. #pragma mark –
  14. #pragma mark UIScrollViewDelegate Methods
  15. – (void)scrollViewDidScroll:(UIScrollView *)scrollView{
  16.     [_refreshHeaderView egoRefreshScrollViewDidScroll:scrollView];
  17. }
  18. – (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
  19.     [_refreshHeaderView egoRefreshScrollViewDidEndDragging:scrollView];
  20. }
  21. #pragma mark –
  22. #pragma mark EGORefreshTableHeaderDelegate Methods
  23. – (void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView*)view{
  24.     [self reloadTableViewDataSource];
  25.     [self performSelector:@selector(doneLoadingTableViewData) withObject:nil afterDelay:3.0];
  26. }
  27. – (BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView*)view{
  28.     return _reloading; // should return if data source model is reloading
  29. }
  30. – (NSDate*)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView*)view{
  31.     return [NSDate date]; // should return date data source was last changed
  32. }

最后, 如果是开发中文应用程序, 不要忘记进入EGORefreshTableHeaderView.m中, 将提示的英文换成中文.

MYSQL中的基本命令(三)

WHERE子句用于SELECT语句中指定搜索的条件,WHERE子句在表名(FROM子句)之后给出。

1、SELECT column_name1,column_name2 FROM products WHERE column_name2=25

检索给出的两个列,并限定返回column_name2值为25的行

2、WHERE子句的操作符

=                  等于

<>               不等于

!=                不等于

<                 小于

<=              小于等于

>                大于

>=             大于等于

BETEEN  在制定的两个值之间

3、空值查询

在创建表时可以制定其中某个列是否可以不包含值。当一个列不包含值时,称其为空值。空值用NULL表示,与0,空字符或仅仅包含空格。

在用WHERE子句指定条件时的具体用法为:

WHERE column_name1 IS NULL;

4、WHERE子句中的逻辑操作符

(1)AND用来指示搜索满足所有给出条件的行(逻辑与的关系)。

SELECT column_name1,column_name2 FROM products a WHERE column_name2=25 AND column_name1=”FALL” ;

(2)OR用来表示检索匹配任意给定条件的行(逻辑或的关系)。

SELECT column_name1,column_name2 FROM products WHERE column_name2=25 OR column_name1=”FALL” ;

PS: 在WHERE子句中结合AND和OR操作符使用时,MYSQL语句优先处理AND操作符。所以要尽量使用”()”来消除歧义,得到想要的执行次序

(3)IN操作符用来指定条件的范围,与OR操作符作用十分相似,用法如下

SELECT column_name1,column_name2 FROM products WHERE IN

(column_name2=25,column_name=10);

与OR操作符相比IN操作符语法更清晰直观且高效,同时IN可以包含其他SELECT语句。

5、NOT操作符,否定它后面给出的任何条件

SELECT column_name1,column_name2 FROM products WHERE  NOT IN

(column_name2=25,column_name=10);

腾讯微博API IOS-SDK-2.0开发初探

                                     腾讯微博API IOS-SDK-2.0开发初探

——IOS平台登陆腾讯微博功能详解

本篇文章记录下了笔者在使用腾讯微博IOS平台的SDK开发包开发iphone端APP时,所遇到的种种问题以及解决方法,就此类开发项目,甚至说IOS平台的项目开发而言,笔者本人也是一个新手,目前也是在逐步的学习、探索之中,写出此篇文章,旨在与诸多开发同人交流,记录下自己在工作、学习的过程中点滴的心得,如有纰漏、不当之处,望请诸位看官多多指点不吝赐教。

在刚开始接触腾讯微博SDK的时候,笔者第一印象对于腾讯微博的demo小样就表示一头雾水,当然,可能笔者才疏学浅见识不多,只是针对本人来说基本没有有可以通过demo小样即可马上理解的API,对于给出的各种功能端口的测试也是十分费解,为何都是如此混乱的一堆代码?为何不是常见的用户界面?而最令人难过的还是官方对此并未给出任何的解释说明。。。在开发指南中,甚至连如何配置SDK开发包都未作说明。。。当然可是文档的编写者认为配置项目这种基本操作无需多言。。。在具体API的讲解中,指南里只是简单的贴出了API中的数个函数原型的截图,和效果图,仅有一个登陆和发表的示例,而其中讲解的文字不足百字。。。想要使用API进行开发的开发者来说,这寥寥数语无异于杯水车薪。。。。而过于稀少的示例,以及demo中令人费解的演示过程也让整个SDK开发包在一个刚接触它的人眼中显得就像是一个反编编译过的代码一样无法理解- –

在经过数日努力之后,终于逐渐了解了其中少数API的具体用法,以及授权协议在IOS平台上具体应该是如何操作的,今天我们就首先来说说,IOS上腾讯微博API中登陆相关的部分

在API中目前我发现的登陆方式有两种,第一种即是在官方提供的开发指南中演示的API,直接在自己的按钮事件中调用该API就会自动弹出登陆的页面,而另一种则是使用一个名为AccessToken的字符串标识进行登陆,该标识是在用户登陆过之后,可以通过SDK开发包中的API获取到的,具体如何获取呢?下面我来详细叙述一下如何使用AccessToken登陆腾讯微博。而在这之前,请看官先确认已经在腾讯开放平台上面创建APP并且获得了AppID以及AppSecret,并且已经把官方提供的开发指南中极其简单的调用登陆窗口登陆的方式已经掌握。

使用AccessToekn登陆的API函数原型如下:

对于刚接触此类API的人来说,你们看到这个API时的第一反应应该和我一样,根据名称来看的确是一个登陆函数,但是AccessToken时什么?Expiredfimet又是什么,OpenID呢?RefreshToken呢?他们看起来好像跟我们没什么关系,是从哪得来呢?莫非API中也存在游戏中RMB战士一样的RMB函数么?好吧,或许有,但我们见到的还并不是,因为腾讯如果真的想要保留RMB函数,自然不会把源代码都给你看了。

AccessToken是用户在登陆授权之后,可以通过API中的方法向服务器申请的一个字符串标识。

Expiredfimet是代表本次AccessToken的失效时间,他是一个NSTimeInterval类型的对象,而实际上他并不是对象,是基本型,其实是double类型,是由c定义的,该类型,他可以用以标示两个日期之间间隔的时间,单位是以秒来计算,当然,在这里需要传送的参数时一个字符串

OpenID是一个类似于AccessToken的字符串标识,就像注释上所说的,这是一个用户的唯一标识,而且在很多其他功能的API中一样也需要这个OpenID,至于他与AccessToken有什么区别,为什么要需要这样一个标识请原笔者的无能。。。尚未参透。。。

RefreshToken同样也是一个字符串类型的标识,它的主要功能是在使用API方法向服务器请求刷新AccessToken时使用至于它更多的详解,笔者也同OpenID一样尚未研究透彻。。。

知道了这4个参数分别是什么了,那么我该怎么来取得这4个参数呢,之前既然说过AccessToken是在成功登陆之后分配的,那么自然不管怎么取得,我们可以确定的是必须在调用登陆窗口的API的成功登陆回调函数中来实现他时最为妥当的。笔者在研究如何取得这4个参数的时候首先想到的是回调函数中是否会有参数提供,当然这个想法一闪而过就被我否决了,因为在开发指南的示例回调函数中并未有设置参数,所以笔者并未多做尝试。即使有参数,无法知道会给鱼的参数列表我们也时无法使用这些参数的。。。其次笔者想到的时类内会不会有属性,当我看到确认了这个想法之后,我觉得开始有了眉目,那么会不会在用户登陆成功后这些属性已经被赋值了呢,我在反复的查询各种API的过程中发现的确有类似设置这些属性函数的方法在登陆的过程中呗调用过,然而我却在登陆属性中取值失败了,但是并非一无所获,我取得了到了一个RefreshToken,没错,这个值存在了,那么就有下文了。

笔者在翻阅API代码的时候发现了一个函数,叫做refreshAccessToken,当我看到这个函数之后,我才真的看到了希望,函数原型如下:

AppKey是在官方申请应用时所分配的一个字符串标示,在我们按照官方给出的开发指南使用调用登陆窗口方法进行登陆的时候相信大家已经很明确这个字符串标识是什么了,我也就不再多加叙述。而refreshtoken我们之前提到过在登陆成功之后,我们仅能取得到的一个字符串标示。grantType经过笔者了解,此处是一个询问授权类型的参数,但是他的参数是一个字符串让人很难知道该如何使用(为何不做成枚举呢。。。)但是好在笔者通过翻阅源码发现在这里我们只要给出固定的值@”refresh_token”即可。

现在如何调用该函数我们理解了,而取出的AccessToken又在哪里呢?类内的属性经过测试发现依然没有被赋值,而参数中亦没有出参可以使用,于是笔者就试着输出一下返回值的NSString输出结果为下:

2012-12-17 09:07:25.739 GroupSend[473:11c03] relutStr:access_token=42d48d39554685347c3798a3c4d2c70d&expires_in=604800&refresh_token=1fd107582e266bd9794b9f552743486a&openid=70b2b4763fd2fc94ac905ef2f1c1db2b&name=elecxiaoxuan&nick=均衡教主&state=

是的就如你所看到的,这个并非一个值的字符串,而是一连串键值,对与我们来说有两个消息,好消息时,我们终于找到了获取accessToken的办法,并且还取得了其他所有相关的键值,甚至还会包括用户昵称。但坏消息是,没错你需要写一个虽然不是很长但是很麻烦很恼人的字符串提出函数。。。。。在此我将自己用来提取此字符串中参数的方法公开以供大家参考:

//根据刷新返回字符串提取各种值

-(NSDictionary *)getParameterForString:(NSString *) parameter

{

    @autoreleasepool {

        NSMutableDictionary  *reslut=[[NSMutableDictionary  alloc] init];

        NSMutableArray *keys=[[NSMutableArray alloc] init];

        NSMutableArray *values=[[NSMutableArray alloc] init];

        int lastIndex=0;

        for (int i=0; i<parameter.length; i )

        {

            if(“=”==[parameter characterAtIndex:i])

            {

                [keys addObject:[parameter substringWithRange:NSMakeRange(lastIndex, i-lastIndex)]];

                NSLog(@”键:%@”,[keys objectAtIndex:[keys count]-1]);

                lastIndex=i 1;

            }

            if (“&”==[parameter characterAtIndex:i])

            {

                [values addObject:[parameter substringWithRange:NSMakeRange(lastIndex, i-lastIndex)]];

                NSLog(@”值:%@”,[values objectAtIndex:[keys count]-1]);

                lastIndex=i 1;

            }

        }

        if(keys.count>values.count)

        {

            [keys removeLastObject];

        }

        [reslut addEntriesFromDictionary:[[NSDictionary alloc] initWithObjects:values forKeys:keys]];

        return reslut;

    }

}

//根据getParameterForString方法返回的Dictionary提取键值保存到类内属性

-(void)setParameterToProperty:(NSDictionary *) parameterReslut

{

    self.SuccessToken=[parameterReslut objectForKey:@”access_token”];

    self.ExpireTime=[parameterReslut objectForKey:@”expires_in”];

    self.FlashToken=[parameterReslut objectForKey:@”refresh_token”];

    self.OpenId=[parameterReslut objectForKey:@”openid”];

}

 

本文至此也就告一段落了,取得各参数之后自然使用AccessToken进行登陆的方法也就简洁明了了,该函数并不会弹出一些窗口,而是调用后直接连接服务器,但是一样会有登陆成功以及登陆失败的回调函数,最后在此建议大家使用和调用登陆界面相同的回调函数,因为如此可以在每次用户开启登陆时都进行一次AccessToken的刷新,可以减少用户因为AccessToken过期而需要重新登陆的麻烦。

Mac系统下XAMPP配置虚拟主机

1 Mac系统下编辑hosts文件

命令行下 $ sudo -s

# nano /etc/hosts

填入想要加入的虚拟主机域名

2 编辑XAMPP下Apache虚拟主机配置文件,填入虚拟主机配置。

# nano /Applications/XAMPP/xamppfiles/etc/extra/httpd-vhosts.conf

<VirtualHost *:80>
ServerName www.ciliu.com
DocumentRoot “程序路径”
ServerAdmin 邮箱
</VirtualHost>
<Directory “程序路径”>
AllowOverride All
order allow,deny
Allow from all
Options All
</Directory>

3 最后,重启Apache即可。

MySQL查询表中字段个数

想在MySQL数据库的某个表中查询一共存在多少个字段,大致有两种方法:

1 执行以下SQL语句,得出结果的行数即总字段数。

desc 表名

2 查询系统表中数据,执行以下SQL语句。

SELECT COUNT( * )  as cnt FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = “数据库名” AND TABLE_NAME = “数据表名”

分布式版本控制系统Git

据说Git是一个开源的分布式版本控制系统。

自诞生于 2005 年以来日臻成熟完善,

用以有效、高速的处理从很小到非常大的项目版本管理。

它还有着令人难以置信的非线性分支管理系统,可以应付各种复杂的项目开发需求。

主要特点:

  • 每个开发者机器上都有一个服务器的数据库
  • —近乎所有操作都是本地执行
  • 直接记录快照,而非差异比较
  • —时刻保持数据完整性
  • —多数操作仅添加数据
  • —多主机异地协同工作

在CentOS6.3下安装:

# yum install git -y

# yum install -y git-doc git-gui gitk

开启git命令补齐:

# . /etc/bash_completion.d/git

另外,在/etc/profile和~/.bashrc文件中加入以下代码:

#——————————————————————–
if [ -f /etc/bash_completion.d/git ]; then
. /etc/bash_completion.d/git
fi
#——————————————————————–
注:什么是命令补齐?
Linux 的 shell 环境(bash)通过 bash-completion 软件包提供命令补齐功能,
在录入命令参数时按一次tab键可实现参数的自动补齐。
例如在命令行输入 git com 后按下 tab 键,会自动补齐为 git commit

CentOS6.3防火墙开启80端口

按照shenyang童鞋的文章安装完LNMP后,
出现客户端可以ping通服务器,但在客户端用互联网浏览器打不开服务器端网站的情况。
查了一下,原来是iptables防火墙未打开80端口。
查看iptables防火墙端口设置情况:
# /etc/init.d/iptables status
具体打开80端口方法如下:
# /sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT
# /sbin/iptables -I INPUT -p tcp –dport 22 -j ACCEPT
之后,保存防火墙端口设置即可。
# /etc/rc.d/init.d/iptables save

12