在UIView中添加点击事件

在项目中,点击某个按钮需要整个屏幕用阴影覆盖,点击阴影后阴影消失。因为阴影是个UIView,所以需要给阴影加上点击事件。

以UIView类型的self.baseView为例:

  • 首先设定UIView(或其子类)为可交互的:

    1
    self.baseView.userInteractionEnabled = YES;

    这里要说明一下,UIImageView和UILabel默认的userInteractionEnabled为NO,而UIView默认为YES。

  • 添加tap手势:

    1
    2
    //tap手势
    UITapGestureRecognizer* singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
  • 将手势添加至需要相应的view中

    1
    [self.baseView addGestureRecognizer:singleTap];
  • 执行触发的方法:

    1
    2
    3
    -(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    //在这里写触发事件
    }
  • 默认为单击触发事件:

  • 设置手指个数:

    1
    [handleSingleTap setNumberOfTapsRequired:1];
  • 获取是哪个View触发了此方法:

    1
    sender.view ;

git命令备忘

github常用命令备忘

创建版本库

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

第二步,使用命令git commit,完成。

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

关联远程库

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

使用git在本地创建一个项目的过程

1
2
3
4
5
6
7
8
makdir ~/hello-world    //创建一个项目hello-world
cd ~/hello-world //打开这个项目
git init //初始化
touch README
git add README //更新README文件
git commit -m 'first commit' //提交更新,并注释信息“first commit”
git remote add origin git@github.com:mocilas/hello-world.git //连接远程github项目
git push -u origin master //将本地项目更新到github项目上去

github提交代码的命令:

第一次关联仓库,提交:

1
2
3
4
5
6
7
8
echo "# about-me" >> README.md
git init
git add <file>
git commit -m "first commit"
git remote add origin https://github.com:mocilas/about-me.git
git push -u origin master …or push an existing repository from the command line
git remote add origin https://github.com:mocilas/about-me.git
git push -u origin mastergitgit

其中在仓库已经建立好、链接好之后,如果修改了代码再提交只需使用:

1
2
3
git add --all
git commit -m "修改了代码"
git push -u origin gh-pages

常见错误

  • 如果输入git remote add origin git@github.com:mocilas/about-me.git
    提示出错信息:fatal: remote origin already exists.
    解决办法如下:
    1、先输入git remote rm origin
    2、再输入git remote add origin git@github.com:mocilas/about-me.git就不会报错了!

  • 如果输入git push origin master
    提示出错信息:error:failed to push som refs to …….
    解决办法如下:
    1、先输入git pull origin master //先把远程服务器github上面的文件拉下来
    2、再输入git push origin master
    3、如果出现报错 fatal: Couldn’t find remote ref master或者fatal: ‘origin’ does not appear to be a git repository以及fatal: Could not read from remote repository.
    4、则需要重新输入git remote add origingit@github.com:mocilas/about-me.git

IOS开发随笔1

问题记录

这周在做项目的时候遇到了几个问题,记录一下:

  • 在写UITableView的Footer的时候,可能是系统自带函数写错,导致footer不能正常显示,在这里记录一下,以后这种函数不要再写错:
    - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{}

  • ios系统自带有翻书效果:UIPageViewController 之后有机会要研究一下!

  • 项目中有一个从后台拉取数据显示的页面。从后台拉取的数据models需要按照其所属的课文分类。

    • 一开始是用NSMutableDictionary类型的sections存放这些models,键值就是课文名;然后用NSMutableArray类型的sortedSections存放这些models的课文名。这样导致的后果就是如果课文名是重复的,那么后面传送过来的数据就会插到前面来:因为我们是根据sortedSections里面的内容去sections中查找的。
    • 后来的解决办法是sortedSections不变,使用sortedSections中的序号作为sections的key。例如:self.sortedSections[0]=@"识字(一)";相应于sections中,以“识字(一)”为标签的数据对应的key由原来的“识字(一)”改为“0”。这样即使内容是有重复的,但是序号是不会重复的。
  • 在做课本目录的时候,有一个阴影要叠加。但是我明明都把初始化view的函数写好了,阴影仍然不显示。后来发现是初始化的顺序有问题。应该先init UITableView,再init阴影。否则阴影就被tableview覆盖了,就显示不出来了。

  • [view removeFromSuperview];这个命令只是把view从它的上一层superview中移除,而view本身并没有被销毁,只是看不见了,如果再add进去的话还是有的。如果要销毁这个view的话,直接置空即可:view = nil;

    • - (void)removeFromSuperview
  • 在添加下拉菜单的时候,每个选项都是相同的,而我是一个一个控件写的,后来被峰峰批评了= =,说应该用for循环的。于是我改为了for循环,源码如下。这样如果还要有新的选项加进去的话,只需要往数组里添加字符串就行了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    NSArray *subject = @[@"语文课本",@"数学课本",@"英语课本"];
    for(int i=0; i<[subject count]; i++){
    //分割线
    UIView *line = [[UIView alloc] init];
    line.frame = DF_FRAME(0, now_H, width, self.line_height);
    line.backgroundColor = [UIColor colorWithHexString:@"#d0d0d0"];
    [self.titleView addSubview:line];
    now_H = DF_NowHeight(line);
    //按钮
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setTitle:subject[i] forState:(UIControlStateNormal)];
    if([self.navTitle isEqual:subject[i]])
    [button setTitleColor:kThemeTitleColor forState:UIControlStateNormal];//当前的字体颜色要不一样
    else
    [button setTitleColor:[UIColor colorWithHexString:@"#343434"] forState:UIControlStateNormal];
    [button setTitleColor:kThemeTitleColor forState:UIControlStateHighlighted];
    button.frame = CGRectMake(0, now_H, width, self.button_height);
    [self.titleView addSubview:button];
    [button addTarget:self action:@selector(selectSubject:) forControlEvents:UIControlEventTouchUpInside];
    now_H = DF_NowHeight(button);//每次循环都要更新一下高度
    }

数组排序

数组排序

引用来源:http://objccn.io/issue-7-1/

如果数组存储的是字符串对象,sortedArrayUsingSelector:是第一选择:

NSArray *array = @[@"John Appleseed", @"Tim Cook", @"Hair Force One", @"Michael Jurewitz"];
NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

下面的代码对存储数字的内容同样很好,因为 NSNumber 实现了 compare::

NSArray *numbers = @[@9, @5, @11, @3, @1];
NSArray *sortedNumbers = [numbers sortedArrayUsingSelector:@selector(compare:)];

如果想更可控,可以使用基于函数指针的排序方法:

- (NSData *)sortedArrayHint;
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator
                      context:(void *)context;
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator
                      context:(void *)context hint:(NSData *)hint;

苹果增加了一个方法来加速使用 sortedArrayHint 的排序。

hinted sort 方式在你有一个已排序的大数组 (N 个元素) 并且只改变其中一小部分(P 个添加和删除,这里 P远小于 N)时,会非常有效。你可以重用原来的排序结果,然后在 N 个老项目和 P 个新项目进行一个概念上的归并排序。为了得到合适的 hint,你应该在原来的数组排序后使用 sortedArrayHint 来在你需要的时候(比如在数组改变后想重新排序时)保证持有它。

因为block的引入,也出现了一些基于block的排序方法:

- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr;
- (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts
            usingComparator:(NSComparator)cmptr;

性能上来说,不同的方法间并没有太多的不同。有趣的是,基于 selector 的方式是最快的。可以在 GitHub 上找到测试用的源代码:

Sorting 1000000 elements. selector: 4947.90[ms] function: 5618.93[ms] block: 5082.98[ms].

hexo使用方法

为了备忘,把hexo的使用方法记一下:

在teminal上新建一个Markdown文件:

1
$ hexo new '文件名'

其中文件名可以用单引号,也可以用双引号。

在做好md文件之后,在terminal中输入

1
$ hexo s --debug

来看一下有没有问题。
此时便可以在http://localhost:4000/ 上看到自己的博客了。

然后command+t另开启一个terminal,输入

1
$ hexo g

生成本地静态网页文件。

最后输入

1
$ hexo d

部署到github上,过一阵便可以在http://mocilas.github.io 上看到更新后的博客了。
ps:如果http://mocilas.github.io 上还没有更新,可以去自己的github仓库里看有没有上传成功。