您的位置:首页 > 移动开发 > IOS开发

iOS_开发中遇到的那些问题_6

2015-12-14 20:30 471 查看
【自编号:590】【代码获取info.plist中的url schemes】
#pragma mark - 支付宝客户端回调url schemes
- (NSString *)pay_end_callBack_url
{
//    NSString *versionStr = [[NSBundle mainBundle]objectForInfoDictionaryKey:@"CFBundleVersion"];

NSArray *urlTypesArr = [[NSBundle mainBundle]objectForInfoDictionaryKey:@"CFBundleURLTypes"];
NSDictionary *dict = [urlTypesArr lastObject];
NSArray *subArr = [dict objectForKey:@"CFBundleURLSchemes"];
NSString *callBackUrl = subArr[0];
return callBackUrl;//QQASDFASDF
}
【2015-09-15 13:55:07 by beyond】

【自编号:593】【可变参数的实现】
//姑且设定 输出一个人的姓名,性别,还有去过的城市~~
//类名很挫  别介意  有成果就行

MutableParameter.h

- (void) MutableParameterTest:(NSString    *) name gender:(Boolean) gender, ...;

MutableParameter.m

- (void) MutableParameterTest:(NSString    *) name gender:(Boolean) gender,...
{
if (gender) {
NSLog(@"name:%s gender:male",name);
}
else {
NSLog(@"name:%s gender:famela",name);
}

NSString *city;
va_list cityList;

if (gender) {
va_start(cityList,gender);

while (city=va_arg(cityList,id)) {
NSLog(@"%@",city);
}
}
}

调用

MutableParameter *mp=[[MutableParameter alloc] init];
[mp MutableParameterTest:@"Jonsn" gender:YES ,@"xian",@"wuhan",@"guanghzou"];

解释下~~

va_list argList:定义一个指向个数可变的参数列表指针;

#define va_start(v,l)    __builtin_va_start(v,l)
va_start(argList,statement):使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,说明:argN是位于第一个可选参数之前的固定参数,(或者说,最后一个固定参数;…之前的一个参数),函数参数列表中参数在内存中的顺序与函数声明时的顺序是一致的。如果有一va函数的声明是void va_test(char a, char b, char c, …),则它的固定参数依次是a,b,c,最后一个固定参数argN为c,因此就是va_start(arg_ptr, c)。

#define va_end(v)    __builtin_va_end(v)
va_end(arg_ptr):清空参数列表,并置参数指针arg_ptr无效。

#define va_arg(v,l)    __builtin_va_arg(v,l)
va_arg(argList,id):返回参数列表中指针arg_ptr所指的参数,返回类型为type,并使指针arg_ptr指向参数列表中下一个参数。

#if !defined(__STRICT_ANSI__) || __STDC_VERSION__ + 0 >= 199900L
#define va_copy(d,s)    __builtin_va_copy(d,s)
#endif
#define __va_copy(d,s)    __builtin_va_copy(d,s)

va_copy(d,s)
前面的参数貌似是目的变量  后面的是源变量  这个没用过~~
【2015-09-15 18:08:25 by beyond】

【自编号:596】【捋捋更新的逻辑】
//正常状态下
// 老版本 当时打包的时候是 3,新版本的时候改成4(与服务器一样)
// 那么,当点击了老版本的检查更新的时候,服务器取回的是4>3(当时的本地的值),就会提示更新
// 那么,当点击了新版本的检查更新的时候,服务器取回的是4>4(此次的本地的值),就会提示当前最新
if(VersionInfo.FVersionNo>UpDateAppCode){

WCAlertView *alert =[WCAlertView showAlertWithTitle:@"软件版本更新" message:@"版本有更新,是否升级?"  customizationBlock:^(WCAlertView *alertView){

[alertView setStyle:WCAlertViewStyleBlack];

} completionBlock:^(NSUInteger buttonIndex, WCAlertView *alertView) {

if (buttonIndex == 1){

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[[Tools readforplist] objectForKey:@"KLChannel"][0]]];
}

} cancelButtonTitle:@"下次再说" otherButtonTitles:@"马上升级", nil];

//如果是自动检测  在版本状态不属于警告和提醒的情况下 不提醒用户升级版本
if(![mode isEqualToString:@"1"])
{
[alert show];
}

}else{

if([mode isEqualToString:@"2"]){

if (IS_MORE_IOS7) {

[SVProgressHUD showSuccessWithStatus:@"当前版本已是最新"];
}
else
{

UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"当前版本已是最新" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil];

alertView.delegate = self;

[alertView show];

}
}
}
【2015-09-17 17:08:52 by beyond】

【自编号:597】【AFN返回原始数据】
- (id)responseObject {
[self.lock lock];
if (!_responseObject && [self isFinished] && !self.error) {
NSError *error = nil;
self.responseObject = [self.responseSerializer responseObjectForResponse:self.response data:self.responseData error:&error];
if (error) {
self.responseSerializationError = error;
}
}
[self.lock unlock];

return _responseObject;
}

po self.response
{ URL: http://192.168.1.124:888/rest/v10/GetHvHotelDetail } { status code: 200, headers {
"Cache-Control" = "no-cache";
"Content-Length" = 1458;
"Content-Type" = "application/json; charset=utf-8";
Date = "Thu, 17 Sep 2015 10:49:15 GMT";
Expires = "-1";
Pragma = "no-cache";
Server = "Microsoft-IIS/7.5";
"X-AspNet-Version" = "4.0.30319";
"X-Powered-By" = "ASP.NET";
} }

po self.responseString
{"Success":true,"Msg":"","Content":{"FVID":"471449d6-baf2-48c3-9d64-839392a8b178","FVName":"打算打打杀杀","FHouse":null,"FRight":null,"FInteraction":null,"FTravel":null,"FTitle":"出不出得来","FSummary":"123456","FDescription":"
1323123123123

","FAddress":"12312312312","FAbout":null,"FEID":"00000000-0000-0000-0000-000000000000","FIsCollect":false,"LImages":[{"Id":0,"Url":"http://folder-image1.oss.aliyuncs.com/201509/smart-hv/content/bd323a24-05ca-41fb-ba33-8fb94110c69e.png","FDescribe":null,"FStyle":0},{"Id":0,"Url":"http://folder-image1.oss.aliyuncs.com/201509/smart-hv/content/8dae776c-b52d-4eaa-9ecd-f9e2c134fa30.png","FDescribe":null,"FStyle":1},{"Id":0,"Url":"http://folder-image1.oss.aliyuncs.com/201509/smart-hv/content/0e94a5d3-ac83-4134-a163-629ef17810af.png","FDescribe":null,"FStyle":2}],"LHotelRule":[{"HRID":"7f377c1d-5063-416f-86a0-2b963a21529a","FTitle":"dasdasd","FMInformation":"dasdasdas","FStyle":4,"FIsAbout":false}],"LHotelRuleAbout":[],"FCustodianID":585944,"FAcreage":120,"FCustodianPhone":"15622222222","FDiscountInfo":"","FRooms":1,"FBeds":0,"FHouseType":"三室一厅","FPeoples":2,"FLevaeTime":"12:00","FCustodianName":"吴里涛","FCustodianUrl":null,"FEquipment":[],"LRemarkItems":null,"FOriginal":332.00,"FContent":"111111","FRemarkScore":0.0,"FCollections":0,"FRemarkCount":0,"FHType":"三室一厅","FPrice":124.00,"Id":"e05b8fd2-fc8c-4122-acaf-7cc3b7196584","FName":null,"FTitleImgUrl":null},"Zip":false}
【2015-09-17 18:51:53 by beyond】

【自编号:599】【sqlite时间比较】
iOS关于SQLite存取时间数据类型的两条常用方法。

通过在Google,StackOverFlow很多的东西,大概有经验的程序猿会这样:
1.把时间通过NSDateFormatter 通过stringFromDate某种格式,然后存字符串。取的时候同样取某个串,通过同一个formatter 的dateFromDate获取NSDate对象。
NSDateFormatter*dateFormat =[[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString*dateString=[dateFormat stringFromDate:[NSDate date]];

sqlite3_bind_text(saveStmt,1,[dateString UTF8String],-1, SQLITE_TRANSIENT);

2.把时间通过NSDate的timeIntervalSince1970获取double类型存进数据库,
取时间时会通过NSDate timeIntervalSince1970:doubleValue 获取NSDate对象。

I typically use a double, something like:
sqlite3_bind_double(statement, index,[dateObject timeIntervalSince1970]);

where dateObject is an NSDate*. Then, when getting the data out of the DB, use
[NSDate dateWithTimeIntervalSince1970:doubleValueFromDatabase];
【2015-09-20 16:05:28 by beyond】

【自编号:600】【iOS中的空】
nil :指向一个对象的空指针 (可以给对象赋值)   形式 Nsstring * str = nil;  	Nil :类的空指针 (类指针为空)       				Class  class = Nil;   	null: 其他类型(基本类型,c类型)        			int * num = null;	(重点)NSNull 表示集合中的空值 (数组字典中可以使用来做占位符) NSArray * arr  = [NSArray arrayWithObjects:@"1",1,[NSNull null],nil];    问题就出在 后台服务器 有时候会传  NSNull集合类型  在以前的的项目中 碰到过这样的问题  只能用[NSUull  null] 去判断
【2015-09-21 19:38:05 by beyond】

【自编号:602】【webView和textView自带的检测dataDetectorTypes】
typedef NS_OPTIONS(NSUInteger, UIDataDetectorTypes) {
UIDataDetectorTypePhoneNumber   = 1 << 0,          // Phone number detection
UIDataDetectorTypeLink          = 1 << 1,          // URL detection
#if __IPHONE_4_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
UIDataDetectorTypeAddress       = 1 << 2,          // Street address detection
UIDataDetectorTypeCalendarEvent = 1 << 3,          // Event detection
#endif

UIDataDetectorTypeNone          = 0,               // No detection at all
UIDataDetectorTypeAll           = NSUIntegerMax    // All types
};
【2015-09-22 11:55:00 by beyond】

【自编号:605】【iOS 8创建交互式通知】
为了创建交互式通知,需要iOS 8提供的3个新类:UIUserNotificationSettings, UIUserNotificationCategory, UIUserNotificationAction 以及它们的变体。
【查看原文】 【2015-09-22 20:59:03 by beyond】

【自编号:606】【userDefault测试】
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
[userDefault setObject:[NSDate date] forKey:@"currentTime"];
[userDefault synchronize];

Documents
Library:Caches+Preferences
tmp
xxx.app
默认的保存位置是:
app--->Library--->Preferences---->com.31.xxx.app.plist
打开后,可以看到root是一个字典
currentTime对应的2015/09/23 9:47:28

// 将代码改动一下,key名字换成currentTime2,再次运行cmd+r
结果 发现文件变大了,原来的currentTime还在,又多了一个currentTime2

// 结论就是:

// 下面再测试一下 覆盖安装的方法
先从http://www.pgyer.com可fir.im下载demo,安装 后,运行后,结束程序;
打开iFunBox,打开app里面的plist,看到currentTime--->2015/09/23 10:20:36

重要的来了,再次下载demo,覆盖安装,但是不打开,不运行;
使用iFunBox,打开app里面的plist,看到依然还在!!!

结论:覆盖安装时,原来userDefault保存的数据 不会被清空
【2015-09-23 10:35:33 by beyond】

【自编号:607】【涉及到金额,不要用float和double;】
服务器要FAmout,传NSNumber;
NSNumber怎么来?NSNumberFormatter类的对象方法  numberFromString,可以将string转成NSNumber
string怎么来?用单价乘以金额方法在最下面NSDecimalNumber

NSString *str = @"0.09";
NSNumberFormatter *nf = [[NSNumberFormatter alloc]init];
NSNumber *num = [nf numberFromString:str];
NSLog(@"----%@",num);

- (NSString *)tool_totalPrice
{
int count = [self tool_countNumber];
NSString *s1 = [NSString stringWithFormat:@"%d",count];
NSString *s2 = [NSString stringWithFormat:@"%.02f",[self.roomPrice floatValue]];
NSString *result = [self decimalNumberMutiplyWithString:s1 andString:s2];

// 乘以 晚 数
NSString *s3 = [NSString stringWithFormat:@"%d",[self tool_daySpan]];
result = [self decimalNumberMutiplyWithString:result andString:s3];
DLog(@"result--%@",result);
return result;

}

- (NSString *)decimalNumberMutiplyWithString:(NSString *)multiplierValue andString:(NSString *)multiplicandValue
{
DLog(@"%@----%@",multiplicandValue,multiplicandValue);
NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:multiplierValue];
NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:multiplicandValue];
NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];
NSString * result = [product stringValue];
DLog(@"乘积:%@",result);
return result;
}
【2015-09-23 17:05:26 by beyond】

【自编号:611】【iOS9支持HTTPS】
NSAppTransportSecurity

NSAllowsArbitraryLoads
【2015-09-28 11:45:37 by beyond】

【自编号:613】【去重复】
- (NSMutableArray *)p_queryJoinSites
{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:1];
// 新增 FAppVerCode = 1,其中1是sht,3是xfxc
NSString *where = @"FAppVerCode != 3 AND FUpSCode = '' AND FIsUserBind = 0 AND FName != '' AND FStatusCode != -2 AND FStatusCode != -1";

NSString *order = @"FStickDate DESC, FStatusCode ASC, FIsRealAudit DESC, FIsGroupSite DESC, FSCode ASC";

NSMutableArray *datas = [self.helper query4Table:KLTB_SITE_INFO
args:where
order:order
columns:nil];

for (NSDictionary *dic in datas) {

KLSiteInfoJoin *site = [self p_joinSiteFormatWithDic:dic];
if (site.FUpSCode.length > 0 || site.FName.length == 0 || site.FStatusCode.intValue == -2 || site.FStatusCode.intValue == -1) {
continue;
}

[array addObject:site];
}

DLog(@"--old count:%d",array.count);

NSMutableArray *distinctArr = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < [array count]; i++){
KLSiteInfoJoin *model = array[i];
NSString *sid = model.FSCode;

// 遍历前,设置检测标记
BOOL isContains = NO;
for (KLSiteInfoJoin *newModel in distinctArr) {

NSString *newsid = newModel.FSCode;
if ([sid isEqualToString:newsid]) {
// 一旦发现已经有了,中止此层循环
isContains = YES;
break;
}

}
// 遍历后,仍没有发现,此时方可添加
if (!isContains) {
[distinctArr addObject:model];
}

}
DLog(@"--new count:%d",distinctArr.count);

return distinctArr;
}
【2015-09-28 16:55:44 by beyond】

【自编号:618】【10-character App ID Seed】
distribution时build有关于application-identifier的警告
 http://tiny4cocoa.com/viewthread.php?tid=1839&extra=&ordertype=1 
This bundle is invalid. The application-identifier entitlement is not formatted correctly; it should contain your 10-character App ID Seed, followed by a dot, followed by your bundle identifier: com.companyname.appname (-19053)

问题解决了。把解决方法写在这,方便以后其它人遇到类似的问题可以参考。
我是添加了一个entitlements.plist文件然后设置key为application-identifier的值85B9GK2627.com.[mycompanyname].[appname] 。这样build后就不再出现这个bug了。
【2015-10-01 02:42:15 by beyond】

【自编号:619】【超赞_iOS Provisioning Profile(Certificate)与Code Signing详解】【查看原文】 【2015-10-01 02:54:47 by beyond】

【自编号:621】【有关代码签名的】【进入网址】 【2015-10-01 03:09:43 by beyond】

【自编号:622】【webView音频不全屏】
首先HTML里video必须加上webkit-playsinline属性
【2015-10-07 19:11:12 by beyond】

【自编号:623】【github上的Reachability】【点击下载】 【2015-10-08 10:15:40 by beyond】

【自编号:627】【iOS9开始在安装时:网页上的plist填写的bundleID必须和app中info.plist中的、以及证书中的bundleID一模一样】【2015-10-08 17:15:26 by beyond】

【自编号:630】【iOS上所有的字体】
NSArray* familys = [UIFont familyNames];

for (int i = 0; i<[familys count]; i++) {

NSString* family = [familys objectAtIndex:i];

NSLog(@"Fontfamily:%@=====",family);

NSArray* fonts = [UIFont fontNamesForFamilyName:family];

for (int j = 0; j<[fonts count]; j++) {

NSLog(@"FontName:%@",[fonts objectAtIndex:j]);

}
【查看原文】 【2015-10-08 22:20:53 by beyond】

【自编号:632】【SVProgressHUD的github】【点击下载】 【2015-10-08 23:19:56 by beyond】

【自编号:634】【加分项:Masonry介绍与使用实践(快速上手Autolayout)】【查看原文】 【2015-10-09 09:52:51 by beyond】

【自编号:635】【启动图片设置详解】【查看原文】 【2015-10-09 10:39:01 by beyond】

【自编号:636】【自动生成的启动xib】
Launch screen interface file base name

LaunchScreen.xib
【2015-10-09 10:44:23 by beyond】

【自编号:639】【启动图片尺寸】
找到项目中的Images.xcassets,右击中区域,选择New Launch Image;
点击LaunchImage,可在最右边过滤要适配的设备及横竖屏;
将下面图片拖到对应的格子里面

Non-Retina 320X480
Retina 2x :640X960

Retina 4inch :640X1136

Retina 4.7inch :750X1334
Retina 5.5inch :1242X2208
【2015-10-09 13:56:40 by beyond】

【自编号:641】【iPhone作为服务器】【查看原文】 【2015-10-09 18:27:31 by beyond】

【自编号:642】【build时,找不到库】
ld: library not found for -lMobClickLibrary
clang: error: linker command failed with exit code 1 (use -v to see invocation)

其实是:libMobClickLibrary,自动加 ib
【2015-10-10 11:34:33 by beyond】

【自编号:648】【遇到一个bug】
在nib画cell的时候,手一抖,拖了一个label 与cell平级了,后来马上删掉了(这里埋下祸根了,应该要ctrl+z)
然后运行程序 就一直崩溃在:[self.tableView dequeueReusableCellWithIdentifier:cellID];(打开全局断点了)
提示信息是:
*** Assertion failure in -[UITableView _dequeueReusableViewOfType:withIdentifier:], /SourceCache/UIKit/UIKit-2935.138/UITableView.m:5413

不知所云,无奈,f7单步进入报错的内存地址列表,
命令行输入:po $r0
invalid nib registered for identifier (NoticeHasImageCell) - nib must contain exactly one top level object which must be a UITableViewCell instance
这时候,才看到错误所在了,就是由于先前手一抖,在cell的xib拖了一个顶级的label,导致tableview register nib时,生产不出来cell了
【2015-10-12 15:27:52 by beyond】

【自编号:649】【xib上添加手势】
1.打开目标Label的userInteractionEnabled
2.在右下的控件面板找到想要添加的手势
3.将找到手势拖动到目标Label上
4.这时xib中间模块会多出一个Objects,里面放有一个手势,将这个与.m连线(sendAction或IBOutlet)
【2015-10-13 16:33:05 by beyond】

【自编号:650】【iOS9上window必须有rootVC】
否则报错
*** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3505.16/UIApplication.m:3294

解决方法:
UIViewController* myvc = [[UIViewController alloc] initWithNibName:nil bundle:nil];
或
UIViewController* vc = [UIViewController new];
self.window.rootViewController = myvc;
【2015-10-13 16:44:29 by beyond】

【自编号:651】【xib上的scrollView的弹簧效果】
原则就是contentSize中的height要比scrollView的高度大1个点

示例:
scrollview上面有一个button,距离顶10,左10;中间是一个很大的空白;底部是一个bottomLabel;底部bottomLabel距离下方scrollview10
先连上要用到的控件:
scrollView、topBtn、bottomLabel、还有dynamicVConstraint(底标签距topBtn的动态距离,随手机高度动态变化)

开始上代码:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];

// 默认是67
CGFloat vconstant = (self.scrooView.height - CGRectGetMaxY(self.xib_rightBtn.frame) - self.xib_bottomLabel.height -10)+1;
DLog(@"vconstant__%f",vconstant);
self.dynamicVConstraint.constant = vconstant;

[self.view setNeedsLayout];
[self.view layoutIfNeeded];

}
【2015-10-13 16:52:58 by beyond】

【自编号:652】【iOS7.1.2莫名崩溃,iOS,negError】
一个xib界面,scrollView里面的有一个5:3的ratio的两个按钮
结果,总是在ctrl界面快要崩溃,错误信息类似如下所示:

Objective: {objective 0x7f8eb2562bf0: <750:8 17136e-08="" 251:162="" 250:444=""> + <750:1 250:-4="" 4788="">*0x7f8eb260bc30.negError{id: 225} + <251:1 250:4="" 4788="">*0x7f8eb260bc30.posErrorMarker{id: 224} + <750:1>*0x7f8eb260bcd0.negError{id: 227} + <251:1>*0x7f8eb260bcd0.posErrorMarker{id: 226} + <750:1 250:1="">*0x7f8eb260c2a0.negError{id: 229} + <750:1 250:1="">*0x7f8eb260c300.negError{id: 231}

后来百思不得其解,百度关键字【iOS negError】迅速找到类似的求助 http://stackoverflow.com/questions/28111635/ios-aspect-ratio-constraint-breaks-on-ios7-works-on-ios8 原来是:处理ratio比率的时候 崩溃了
把5:3改成一个固定为100,另一个占据余下的屏幕后,正常运行了
<!--750:1--><!--750:1--><!--251:1--><!--750:1--><!--251:1--><!--750:1--><!--750:8-->
【2015-10-13 18:17:50 by beyond】

【自编号:655】【-[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (0) beyond bounds (0) for section (0).】
错误:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '-[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:]: row (0) beyond bounds (0) for section (0).'

3   UIKit                               0x000000010d616d7c -[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:] + 1178
4   UIKit                               0x000000010d61794a -[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:] + 33

解决方法:
1.1在还没加载数据时就设置选中了,所以报错,应该加载完table以后再设置。。
1.2如果数据源为0时,就不用滚动了,加入if判断
【2015-10-16 10:05:10 by beyond】

【自编号:656】【NSUserDefaults的dictionaryRepresentation】
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSDictionary *dictionary = [userDefaults dictionaryRepresentation];
NSLog(@"[NSUserDefaults allKeys] count ====== %ld", (long)[dictionary allKeys].count);
for (NSString *key in [dictionary allKeys]) {
if ([@"kLocalAddress" isEqualToString:key] || [@"kPosX" isEqualToString:key] || [@"kPosY" isEqualToString:key]) {
continue;
}
[userDefaults removeObjectForKey:key];
}
[userDefaults synchronize];
【2015-10-16 15:30:14 by beyond】

【自编号:657】【sqlcipher加密数据库】【查看原文】 【2015-10-16 15:49:59 by beyond】

【自编号:658】【SQLite加密工具】
官方示例整合iOS:https://www.zetetic.net/sqlcipher/ios-tutorial/
【查看原文】【点击下载】 【2015-10-19 13:48:07
by beyond】

【自编号:662】【UILabel顶对齐】
// -- file: UILabel+VerticalAlign.h
#pragma mark VerticalAlign
@interface UILabel (VerticalAlign)
- (void)alignTop;
- (void)alignBottom;
@end

// -- file: UILabel+VerticalAlign.m
@implementation UILabel (VerticalAlign)
- (void)alignTop {
CGSize fontSize = [self.text sizeWithFont:self.font];
double finalHeight = fontSize.height * self.numberOfLines;
double finalWidth = self.frame.size.width;    //expected width of label
CGSize theStringSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(finalWidth, finalHeight) lineBreakMode:self.lineBreakMode];
int newLinesToPad = (finalHeight  - theStringSize.height) / fontSize.height;
for(int i=0; i
【查看原文】 【2015-10-19 15:06:06 by beyond】

【自编号:664】【https请求的代理方法处理】【查看原文】 【2015-10-21 17:42:28 by beyond】

【自编号:665】【瀑布流中偶得】
1,scrollView在滚动的时候,也会调用layoutSubviews方法
2,数组中存所有的CGRect时,要先将其转成NSValue对象,valueWithCGRect:
【2015-10-21 23:06:46 by beyond】

【自编号:666】【objc_msgSend报错参数太多】
objc_msgSend()报错Too many arguments to function call ,expected 0,have3

Build Setting--> Apple LLVM 6.0 - Preprocessing--> Enable Strict Checking of objc_msgSend Calls  YES改为 NO
【2015-10-22 10:50:54 by beyond】

【自编号:669】【给按钮设置NSMutableAttributedString】
NSString *oldStr = [NSString stringWithFormat:@"已有%@条反馈",response];

NSMutableAttributedString *arrString = [[NSMutableAttributedString alloc]initWithString:oldStr];

// 设置前面几个字串的格式 fontWithName:@"Helvetica-Bold" size:16.0f
NSString *numStr = [NSString stringWithFormat:@"%@",response];
[arrString addAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18.0f],
NSForegroundColorAttributeName:kColor(0, 117, 231)
}
range:[oldStr rangeOfString:numStr]];

[blockSelf.coutbtn setAttributedTitle:arrString forState:UIControlStateNormal];
【2015-10-26 17:58:29 by beyond】

【自编号:671】【应用内置appstore评分功能】
在ios6.0,APPle增加了一个心得功能,当用户需要给APP评分时候,不再跳转到appstore了,可以在应用内实现打开appstore,苹果提供了一个框架StoreKit.framework,实现步骤如下:
1:导入StoreKit.framework,在需要跳转的控制器里面添加头文件#import
2:实现代理SKStoreProductViewControllerDelegate
3:- (void)evaluate{

//初始化控制器
SKStoreProductViewController *storeProductViewContorller = [[SKStoreProductViewController alloc] init];
//设置代理请求为当前控制器本身
storeProductViewContorller.delegate = self;
//加载一个新的视图展示
[storeProductViewContorller loadProductWithParameters:
//appId唯一的
@{SKStoreProductParameterITunesItemIdentifier : @"587767923"} completionBlock:^(BOOL result, NSError *error) {
//block回调
if(error){
NSLog(@"error %@ with userInfo %@",error,[error userInfo]);
}else{
//模态弹出appstore
[self presentViewController:storeProductViewContorller animated:YES completion:^{

}
];
}
}];
}

//取消按钮监听
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController{
[self dismissViewControllerAnimated:YES completion:^{

}];
}
【2015-10-27 10:33:40 by beyond】

【自编号:675】【常用物理动画介绍】【查看原文】 【2015-10-28 16:50:54 by beyond】

【自编号:676】【app动态交互设计合辑】【进入网址】 【2015-10-28 18:41:33 by beyond】

【自编号:677】【【长篇高能】ReactiveCocoa 和 MVVM 入门】
</pre><a target=_blank href="http://www.cocoachina.com/ios/20150526/11930.html" target="_blank">【查看原文】</a> 【2015-10-29 10:58:14 by beyond】<hr />【自编号:680】【XCode调试之chisel】<a target=_blank href="https://github.com/facebook/chisel" target="_blank">【进入网址】</a> 【2015-10-30 18:26:15 by beyond】<hr />【自编号:682】【apple官方LLDB简介】<a target=_blank href="https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/gdb_to_lldb_transition_guide/document/lldb-command-examples.html#//apple_ref/doc/uid/TP40012917-CH3-SW5" target="_blank">【查看原文】</a> 【2015-11-02 16:21:09 by beyond】<hr />【自编号:683】【详情底部的footView死活不能接收点击事件】<pre name="code" class="objc">原因:详情底部的footView 上面盖了一层 透明的view,
该透明的view是:tabbar的父view
因此阻挡了事件传递
【2015-11-03 11:27:53 by beyond】

【自编号:684】【提示attempt to insert nil,但是断不下来】
使用LLDB命令,在提示的方法上面,下内存断点
(LLDB) b -[__NSPlaceholderDictionary initWithObjects:forKeys:count:];
即可断下来,原来是:请求的dict中lastGetTime是从缓存中取的,第一次是nil
【2015-11-03 17:02:47 by beyond】

【自编号:685】【因继承带来的unrecognized selector sent to instance】
===========问题描述:======================

BaseCtrl中有一个GlobalNetService(继承直BaseNet)
在GlobalNetService定义了请求方法 xxxRequest

BeyondCtrl中有一个BeyondNetService(坑:继承自BaseNet)

BeyondCtrl是BaseCtrl的子类

============问题现象:=====================

当编译时:可以找到 GlobalNetService的方法xxxRequest
但是,当运行时,崩溃,提示找不到BeyondNetService的方法xxxRequest(本身也就没有)

============问题原因:=====================
因控制制的继承 成功地骗过了编译器:
BaseCtrl的GlobalNetService发送消息给xxxRequest
但是真正运行时的self是子类(BeyondCtrl)的BeyondNetService发送消息给xxxRequest
因此,导致崩溃unrecognized selector sent to instance

============解决方法:=====================
让BeyondNetService 继承  GlobalNetService即可
【2015-11-04 16:56:43 by beyond】

【自编号:697】【ASIdentifierManager】【查看原文】 【2015-11-07 19:08:48 by beyond】

【自编号:700】【IAP_的那些坑】【进入网址】

【点击观看】
【查看原文】 【2015-11-08 20:46:04 by beyond】

【自编号:703】【xib冲突报错:Line 507 :Extra content at the end of the document,最后找了一个正常的xib覆盖错的】【2015-11-10 16:09:18 by beyond】

【自编号:704】【从根控制器push到其他ctrl的时候,如果直接设置tabbar.hidden,会有问题:在其他控制器内:底部44的高度无法接收点击事件;原因是:底部44区域依然是tabbar控制器的,不属于当前的控制器,不知道对不对???】【2015-11-10 16:21:39 by beyond】

【自编号:706】【lipo详解+duplicate symbol】
http://blog.csdn.net/yqmfly/article/details/45148081 http://blog.sina.com.cn/s/blog_3e70804401019nzo.html http://www.cnblogs.com/wengzilin/p/3734751.html http://www.cnblogs.com/wengzilin/p/3800856.html 代码大全

apns 官方文档 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html?spm=a3c0d.7662650.2.298.b8T9Pd
【2015-11-16 17:17:11 by beyond】

【自编号:709】
</pre>【2015-11-16 17:18:56 by beyond】<hr />【自编号:718】【ronglianyun的IM Demo下载后,一直报错,结果是:Build Phase里面的链接库有红色的,解决方法:将红色删除,重新按文档添加相应的链接库即可】<a target=_blank href="http://www.yuntongxun.com/api/im/im_3_1#point_box" target="_blank">【查看原文】</a> 【2015-11-19 10:09:05 by beyond】<hr />【自编号:719】【困扰两天的ronglianyun_IM问题】<pre name="code" class="objc">登录的时候 由于调用了代码: [[ECDevice sharedInstance] SwitchServerEvn:YES]; 设置成了 沙盒环境

结果 导致:
发送语音的时候:
报错 消息发送回调失败 560004

解决方法:  因为5.1.7以后 全部改成生产环境,问题就解决了
【2015-11-19 17:17:44 by beyond】

【自编号:736】【录音一直不成功】
录音之前加上这句就好了
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

以下转载
这些天一直在纠结这个问题:在后台有音乐播放时,我用AVAudioRecorder进行录音,后台音乐被无情的停止了,直到最近才解决!解决方法如下:
首先,在开始录音之前,设置
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

然后在录音结束后,既就是在它的回调函数
- (void)audioRecorderDidFinishRecording:(AVAudioRecorder *)aRecorder successfully:(BOOL)flag
里加上:[[AVAudioSession sharedInstance] setActive:NO error:nil]; 即可。
(用AVAudioPlayer来播放音乐也同样处理)
AVAudioSession的Active属性,既就是设置你的音频会话的启动与关闭
在你的录音结束后,一定要关闭AVAudioSession,后台音乐才会自己启动的。(网上的好多例子都只是启动它,但是并没有关闭,所以导致了AVAudioSession一直是激活状态,堵塞了后台音乐的正常播放)
AVAudioSession的Category属性是设置其类别,它有一下几种类别:
获取输入硬 件 获取输出硬件 与IPOD混合 遵从振铃/静音
AVAudioSessionCategoryAmbient 否 是 是 是
AVAudioSessionCategorySoloAmbient 否 是 否 是
AVAudioSessionCategoryPlayback 否 是 否 否
AVAudioSessionCategoryRecord 是 否 否 否
AVAudioSessionCategoryPlayAndRecord 是 是 否 否
如果你想让你的音乐在程序退出后继续在后台播放,
可以这样设置:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
再在你工程的plist里加上

在info.plist里面添加

Required background modes

App plays audio
【2015-11-29 11:55:39 by beyond】

【自编号:740】【字典的遍历】【查看原文】 【2015-12-02 18:29:43 by beyond】

【自编号:741】【Paros 抓包】【查看原文】

【软件介绍】 【2015-12-02 18:30:48 by beyond】

【自编号:742】【NSNotification与多线程】【查看原文】 【2015-12-03 16:14:17 by beyond】

【自编号:747】【iOS_切换扬声器状态】
if ([[[AVAudioSession sharedInstance] category] isEqualToString:AVAudioSessionCategoryPlayback])
{
//切换为听筒播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];
[self showTipInfo:@"切换为听筒模式"];

}
else
{
//切换为扬声器播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[self showTipInfo:@"切换为扬声器模式"];
}
【2015-12-04 17:12:49 by beyond】

【自编号:755】【Xcode真机测试could not find developer disk image解决方法】
在使用Xcode进行真机调试的时候,有时根据真机的系统不同,会出现could not find developer disk image 错误,这是由于真机系统过高或者过低,Xcode中没有匹配的配置包文件,我们可以通过这个路径进入配置包的存放目录: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 里面有类似这样的一些文件夹,如果这些文件夹中没有包含我们真机的系统,则不能进行真机测试。但是我们可以通过将相应的配置包添加入这个文件夹来解决问题:
【查看原文】
【点击下载】 【2015-12-09 11:52:16 by beyond】

【自编号:760】【dyld: Library not loaded: Reason: image not found 解决办法】
在要使用的动态库的 工程的编译选项中,target--->Build Phases--->Embed Frameworks,手动添加要使用的framework
【2015-12-09 18:16:57 by beyond】

【自编号:766】【一堆的错误...】
类似这种

"_sqlite3_bind_blob", referenced from:
-[FMDatabase bindObject:toColumn:inStatement:] in FMDatabase.o
-[ECFMDatabase bindObject:toColumn:inStatement:] in libCCPiPhoneSDK_IMLib.a(ECFMDatabase.o)

结果:一般是Targets-->Build Phases--->Link Binary With Libraries, 发现少了,或者一堆红色
【2015-12-13 16:20:31 by beyond】

【自编号:769】【iOS隐藏tableview多余的分割线】
// iOS隐藏tableview多余的分割线
self.tableView.tableFooterView = [[UIView alloc] init];
【2015-12-13 22:35:10 by beyond】

【自编号:770】【libxml 找不到的解决办法】
#import  找不到的解决办法
导入了libxml2.dylib,但是却提示libxml/HTMLparser.h file not found,那是因为你的开发环境默认的路径无法找到这个libxml2.dylib框架,修改方法:

(两种方法都试一下吧)

第一种方法:
点击左边项目的根目录,再点击右边的Build Settings,手工输入文字:“Header search paths”,然后单击(或双击,点击弹出面板下面的“+”号进行添加)“Header search paths ”右边的空白处,输入:/usr/include/libxml2
如果还不行,试试这个方法:
点击左边项目的根目录,再点击右边的Build Settings,手工输入文字:“Header search paths”,然后单击(或双击,点击弹出面板下面的“+”号进行添加)“ Header search paths ”右边的空白处,输入:${SDK_DIR}/usr/include/libxml2
【2015-12-14 14:30:43 by beyond】
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios XCODE 问题