用sourceTree提交代码遇到的问题

用sourceTree提交代码时遇到的问题

xcuserstate

每次并没有改什么东西,只是随便点了几下就会出现的未暂存文件,可以对其停止追踪!

右键,停止追踪,提交,推送。以后就不会再有这个讨厌的文件出现了!

还没有提交就拉代码的囧境

有的时候忘了拉取代码就开始提交,往往这时候就会出现提交成功,但无法推送的报错情况:

而且这时候的状态就是既无法提交又不能拉取代码的窘境,就连贮藏也不行。

搞了很久,研究出两个办法:

  • 方法一:使用reset+贮藏
    首先,将本地的develop分支reset到之前的版本:

    reset develop to this commit

    选择软合并或者是默认的混合合并【千万不要选择硬合并!不然之前码的代码都没了】

    然后就回到了初始状态:

    这时候再暂存+贮藏一下,拉取代码,应用贮藏,解决冲突就可以了~

  • 方法二:建立一个新的分支
    右键新建一个test分支:

    然后checkout(检出,其实就是双击)到原来的分支:

    将原来的develop分支reset到初始状态(这个时候要用硬合并,因为你的代码已经保存到test分支里面了所以不用担心)

    这个时候终于可以拉取远端了!

    然后再把test分支合并到develop分支就可以了~

    其实总结一下这两个方法的原理是一样的,都是先把自己的代码存到一边,然后再拉取远端代码,再合并。如果中间遇到不能拉取的情况,一定是xcuserstate文件在作怪!嗯!

ios开发笔记(2)

iOS开发笔记(2)

关于Masonry包

Masonry就是一个自动布局框架,用起来很容易上手,也很方便。
官方给的源码例子:

1
2
3
4
5
6
7
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top); //with is an optional semantic filler
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];

or even shorter:

1
2
3
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(superview).with.insets(padding);
}]
;

大于等于、小于等于:

1
2
make.width.greaterThanOrEqualTo(@200);
make.width.lessThanOrEqualTo(@400)

除此之外,我还发现了Masonry一个特别好用的方法:倍数

1
make.width.equalTo(self.view.mas_width).multipliedBy(0.8);

但是在用的过程中,我还是发现了一些问题:

  • 使用了Masonry的相对布局后,好像无法获取控件的高度了
  • RadioButton也无法使用Masonry相对布局
  • 使用Masonry相对布局之后,Label有的时候有些功能无效,比如lineBreakMode和numberOfLines。具体什么情况可以用什么情况无效还没有测试,只是有的时候会遇到这种情况。

Label换行

1
2
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;

点击空白处收回键盘

在init View的时候加上这几句代码即可:

1
2
3
4
//点击空白处收回键盘
self.userInteractionEnabled = YES;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fingerTapped:)];
[self.view addGestureRecognizer:singleTap];

NSNumber

NSNumber类型的要用@()括起来,比如@(3)

UIScrollView

UIScrollView与其他view不同的是,要在最后设置一下contentSize:

1
self.scrollView.contentSize = CGSizeMake(width, height);

NSString

连接:

1
label.text = [model.grade stringByAppendingFormat:@"%@%@",@"  ",model.letter_count];

去掉字符串中的换行回车:

1
NSString *str = [model.content stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]
  • whitespaceCharacterSet 去除空格
  • newlineCharacterSet 去除回车
  • whitespaceAndNewlineCharacterSet 去除空格和回车

图片名称大小写问题

图片名称如果是大写,代码中使用小写的时候,在模拟机上跑可以,但是真机上就不行了!

判断字符串是否为空

判断字符串是否为空的时候,我以前习惯用

[str isEqualToString@""]

但实际上有更好的办法:判断字符串的长度:

!str.length

Label attributedText

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- (NSMutableAttributedString *)contentAttributedString:(NSString *)text
{
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString:text];
UIFont *font = [UIFont fontWithName:@"Heiti SC" size:16];
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
style.lineBreakMode = NSLineBreakByWordWrapping;
style.lineSpacing = 4;//行间距
style.paragraphSpacing = 0.5 * font.lineHeight;//段间距
style.hyphenationFactor = 1.0;
style.alignment = NSTextAlignmentLeft;
[string addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0,string.length)];
[string addAttribute:NSFontAttributeName value:kSYSTEMFONT(16) range:NSMakeRange(0,string.length)];
return string;
}

然后调用:

1
label.attributedText = [self contentAttributedString:contentLabel.text];

点击空白处收回键盘

在init view的时候加入

1
2
3
4
//点击空白处收回键盘
self.userInteractionEnabled = YES;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fingerTapped:)];
[self.view addGestureRecognizer:singleTap];

然后调用TextField的delegate:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGFloat keyboardHeight = 240.0f;//这个地方是键盘的高度,可以根据实际情况修改
if(self.view.frame.size.height - keyboardHeight > textField.frame.origin.y + textField.frame.size.height){
}
else{
CGFloat moveHeight = textField.frame.origin.y - (self.view.frame.size.height - keyboardHeight - textField.frame.size.height);
[UIView beginAnimations:@"scrollView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:0.275f];
self.view.frame = CGRectMake(self.view.frame.origin.x, -moveHeight, self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
}
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
[UIView beginAnimations:@"scrollView" context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationCurve:0.275f];
self.view.frame = CGRectMake(self.view.frame.origin.x, 0 , self.view.frame.size.width, self.view.frame.size.height);
[UIView commitAnimations];
[self.textField resignFirstResponder];

}

但是会出现问题,就是自定义的NavigationBar也会上移,目前还不知道该怎么解决。以后深入研究一下~

其他需要注意的地方

  • self.currentHeight 最好使用CGFloat类型,虽然NSIngteger也可以
  • 为button加tag的时候,tag的命名要规范,不要用数字,不然加pingback别人看不懂
  • .h文件最好不要import头文件,因为会增加编译时间。如果需要的话,可以用@class类,然后再.m文件里import头文件
  • 不要再使用!=0这种东西了!!!
  • UItableView的delegate方法里,如果数组大小为0:
1
2
3
4
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.array.count;
}

那么

1
2
3
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}

就不执行了。
所以没必要在上面那个方法中单独去判断self.array.count是否为0.

UISegmented用法

UISegmentedControl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
NSArray *subjectArray = [[NSArray alloc]initWithObjects:@"英语",@"语文",@"数学",nil];//初始化UISegmentedControl的数组
//UISegmentedControl
UISegmentedControl *subjectSegmented = [[UISegmentedControl alloc]initWithItems:subjectArray];//数据填充
subjectSegmented.frame = CGRectMake(0, 0, DF_WIDTH/2, 44);
subjectSegmented.segmentedControlStyle = UISegmentedControlStylePlain;//设置样式(总共有四种样式)
for(int i=0; i<[subjectArray count]; i++){//设置当前默认选中的选项
if([self.subject isEqualToString:self.subjectArray[i]]){
subjectSegmented.selectedSegmentIndex = i;
break;
}
}
self.navigationview.tintColor = [UIColor colorWithHexString:@"#ff393a"];//边框和字体颜色
[self.navigationview addSubview:self.subjectSegmented];
[subjectSegmented addTarget:self action:@selector(changeSubject:) forControlEvents:UIControlEventValueChanged];//点击动作
[subjectSegmented mas_makeConstraints:^(MASConstraintMaker *make) {//这里使用了相对布局,可以忽略
make.centerX.equalTo(self.navigationview);
make.centerYWithinMargins.equalTo(self.navigationview).with.offset(padding.top);
}];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//切换科目
-(void)changeSubject:(id)sender{
UISegmentedControl* control = (UISegmentedControl*)sender;//利用UISegmentedControl来控制选中选项时的操作
switch (control.selectedSegmentIndex) {
case 0:
self.subjectSegmented.selectedSegmentIndex = 0;
self.navTitle = [self.subjectArray[0] stringByAppendingString:@"课本"];
break;
case 1:
self.subjectSegmented.selectedSegmentIndex = 1;
self.navTitle = [self.subjectArray[1] stringByAppendingString:@"课本"];
break;
case 2:
self.subjectSegmented.selectedSegmentIndex = 2;
self.navTitle = [self.subjectArray[2] stringByAppendingString:@"课本"];
break;
default:
break;
}
//以下是其他操作,比如数据更新之类的
[self setSubjectEdition];
[self.rightButton setTitle:self.edition forState:(UIControlStateNormal)];
[self initData];
[self.tableView reloadData];
}

iOS开发笔记(1)

iOS开发笔记(1)

UIEdgeInsets

UIEdgeInsets,由函数
UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right );//上,左,下,右
构造出。

项目中用的加载网络图像的方法是:

[self.image  sd_setImageWithURL:[NSURL URLWithString:model.thumb] placeholderImage:[UIImage imageNamed:@"HJZ_UnLoad"]];

但是要import包:

import <UIImageView+WebCache.h>

网络请求函数

在debug过程中,异步网络请求函数是要执行两遍的,于是补了一下关于这方面的知识: