IOS开发问题索引(七)

全系列文章索引:

IOS开发问题索引(一)

IOS开发问题索引(二)

IOS开发问题索引(三)

IOS开发问题索引(四)

IOS开发问题索引(五)

IOS开发问题索引(六)

IOS开发问题索引(七)

IOS开发问题索引(八)

IOS开发问题索引(九)


1 【编译】xcode突然编译不通过,报错不支持64位

    此种场景出现在将project中32位第三方库替换成64位时,project中如何存在相同的第三方库,最好把原来32位相同的库删除,再添加。不然Xcode编译时,有可能索引到重复的那个32位库。造成编译通不过。


2 【UI】设置UIButton的文字显示位置、字体的大小、字体的颜色

http://blog.csdn.net/chengyingzhilian/article/details/8363855

btn.frame= CGRectMake(x, y, width, height);

[btn setTitle: @"search" forState: UIControlStateNormal];

//设置按钮上的自体的大小

//[btn setFont: [UIFont systemFontSize: 14.0]];    //这种可以用来设置字体的大小,但是可能会在将来的SDK版本中去除改方法

//应该使用

btn.titleLabel.font = [UIFont systemFontOfSize: 14.0];

[btn seBackgroundColor: [UIColor blueColor]];

//最后将按钮加入到指定视图superView

[superViewaddSubview: btn];

==========================================================

tvnamelabel = [[UIButtonalloc]initWithFrame:CGRectMake(5,5,200,40)];

这样初始化的button,文字默认颜色是白色的,所有如果背景也是白色的话,是看不到文字的,

btn.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;//设置文字位置,现设为居左,默认的是居中

[btn setTitle:@“title”forState:UIControlStateNormal];// 添加文字

有些时候我们想让UIButton的title居左对齐,我们设置

btn.textLabel.textAlignment= UITextAlignmentLeft

是没有作用的,我们需要设置

btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;

但是问题又出来,此时文字会紧贴到做边框,我们可以设置

btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);

使文字距离做边框保持10个像素的距离。

=======================================================

设置UIButton上字体的颜色设置UIButton上字体的颜色,不是用:

[btn.titleLabelsetTextColor:[UIColorblackColor]];

btn.titleLabel.textColor=[UIColorredColor];

而是用:

[btn setTitleColor:[UIColor blackColor]forState:UIControlStateNormal];


3 【UI】indicatorView不显示菊花

    indicatorView必须要在viewWillAppear方法中启动动画,而不要在viewDidLoad方法中,不然无法显示。

[_indicatorView startAnimating]


4 【编译】Unsupportedcompiler 'com.apple.compilers.llvmgcc42' selected for architecture 'armv7'

Unsupported compiler 'com.apple.compilers.llvmgcc42'selected for architecture 'armv7'

XCode5  编译出错的问题:

解决方法:

Change your compiler for

C/C++/ObjectiveC Go to Build Settings->Build OPtions->compiler for

C/C++/ObjectiveC; select Default(Apple LLVM5.0)


5  【UI】UILabel圆角

在ios7下处理方法:

在lblBadgeValue.layer.cornerRadius = 10;后要加一句

[[lblBadgeValue layer]

setMasksToBounds:YES];


6 【UI】IOS helveticaneue字体

IOS开发问题索引(七)

7    【UI】UITableView不显示分隔线

cityTableView.separatorStyle = UITableViewCellSeparatorStyleNone;


8 【UI】UITableViewCell去掉点击效果

相当于Android中的ListView的selector设置成空/透明的:

1.XIB设置

IOS开发问题索引(七)

上图中的Selection设置成空

2.代码

UITableViewCell*cell;

......

......

cell.selectionStyle = UITableViewCellSelectionStyleNone;


9 【NSString】使用CFStringTransform将汉字转换为拼音

http://blog.csdn.net/meegomeego/article/details/23253939

        iOS在CoreFoundation中提供了CFStringTransform函数,但在Foundation中却没有相对应的方法。它的定义如下:

BooleanCFStringTransform(CFMutableStringRef string, CFRange *range, CFStringReftransform, Boolean reverse);

        其中string参数是要转换的string,比如要转换的中文,同时它是mutable的,因此也直接作为最终转换后的字符串。range是要转换的范围,同时输出转换后改变的范围,如果为NULL,视为全部转换。transform可以指定要进行什么样的转换,这里可以指定多种语言的拼写转换。reverse指定该转换是否必须是可逆向转换的。如果转换成功就返回true,否则返回false。

        如果要进行汉字到拼音的转换,我们只需要将transform设定为kCFStringTransformMandarinLatin或者kCFStringTransformToLatin(kCFStringTransformToLatin也可适用于非汉字字符串):

CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR("中国"));

CFStringTransform(string,NULL, kCFStringTransformMandarinLatin, NO);

NSLog(@"%@",string);

这段代码将输出:

2013-11-2214:41:14.644 Test[2436:907] zhōng guó

        可以看出,CFStringTransform正确的输出了“中国”的拼音,而且还带上了音标。有时候我们不需要音标怎么办?还好CFStringTransform同时提供了将音标字母转换为普通字母的方法kCFStringTransformStripDiacritics。我们在上面的代码基础上再加上这个:

CFStringTransform(string,NULL, kCFStringTransformStripDiacritics, NO);

NSLog(@"%@",string);

那么最终将输出:

2013-11-22 14:47:00.380Test[2470:907] zhong guo


示例程序:

+ (NSString*) getPinyinStringWithString:(NSString*) str

{

    CFMutableStringRefstring = CFStringCreateMutableCopy(NULL, 0, (__bridge CFStringRef)str);

    CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);

   CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);

    NSLog(@"%@",string);

    return (__bridge NSString*)(string);

}


10 【NSString】ARC中NSString*与CFStringRef的相互转换

http://www.tuicool.com/articles/MJRr226

// CFStringRef to NSString*

NSString *yourFriendlyNSString = ( __bridge NSString * ) yourFriendlyCFString ;

// NSString * toCFStringRef

CFStringRef yourFriendlyCFString = ( __bridge CFStringRef ) yourFriendlyNSString ;


11 【文件目录】iOS Documents、Library和tmp的作用

1.Documents:

        只有用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在/Documents 目录下面,并将通过iCloud自动备份。

2.Library:

        可以重新下载或者重新生成的数据应该保存在 /Library/Caches 目录下面。举个例子,比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹。

3.tmp:

        只是临时使用的数据应该保存到 /tmp 文件夹。尽管 iCloud 不会备份这些文件,但在应用在使用完这些数据之后要注意随时删除,避免占用用户设备的空间


        ios开发中,所有的美术、音乐、存储数据文件都放在resource文件夹下面,要获取该resource文件夹的路径,可以使用下面几个方法。

1.NSString* resourcePath = [[NSBundlemainBundle] resourcePath];//返回的是resource文件夹的路径,但是在iphone simulator里运行,在控制台把resourcePath打印出来的时候,会发现,路径里没有resource这个文件夹。

        原因:mac os是类unix操作系统,它有自己的文件系统,跟windows不一样。作为开发者只需要记住把该需要的资源文件都存放到resource文件夹里就好了。

2.另外一个获取Xcode中,项目里的resource文件夹下的资源文件的方法是:

NSString* outputStr = [[NSBundlemainBundle] pathForResource:@"data" ofType:"json"];

        注意:当使用NSString* outputStr =[NSBundle mainBundle] pathForResource:@"data" ofType:"json"inDirectory:@"RefineScene"];

        这个方法时,并不能得到对应目录下的文件,返回的是个null值,也就是说即使在resource文件夹下新建了个文件夹,XCode也会无视,不过这样方便开发人员开发。所以使用1中的方法就可以了,得到路径后再通过appendString或者appendFormat来添加文件名字符串,就得到了resource下面的路径字符串,然后就可以在resource下面创建一个文件来储存数据。如:[outputStr appendString:@"/highscore.txt"],或者[outputStrappendFormat:@"/high%d.txt",2];

iOS学习7:iOS沙盒(sandBox)机制(一)之获取沙盒路径及目录说明

http://my.oschina.net/joanfen/blog/151145

IOS中获取各种文件的目录路径的方法

http://blog.csdn.net/zhenzhenzhao12/article/details/8162793


12 【NSUserDefault】NSUserDefaults读取和写入自定义对象

http://blog.csdn.net/chyroger/article/details/5785297

NSUserDefaults可以存取一些短小的信息。

比如存入再读出一个字符串到NSUserDefaults:

NSString *string = [NSString stringWithString @"hahaha"];

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

[ud setObject: string forKey:@"myKey"];

NSString *value;

value = [ud objectForKey: "myKey"];

        但是并不是所有的东西都能往里放的。NSUserDefaults只支持:NSString, NSNumber, NSDate, NSArray, NSDictionary.

        如果把一个自定义的类存到一个NSArray里,然后再存到NSUserDefaults里也是不能成功的。不信可以试试,如果你成功的请告诉我。

        那怎么办呢?

        我找到的方法是,让这个自定义类实现协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法(obj-c的协议protocol就是java的接口interface,就是C++的纯虚函数),然后把该自定义的类对象编码到NSData中,再从NSUserDefaults中进行读取。

粘代码:

假设有这样一个简单的类对象

@interface BusinessCard : NSObject {

    NSString *_firstName;

    NSString *_lastName;

}

    @property (nonatomic, retain) NSString *_firstName;

    @property (nonatomic, retain) NSString *_lastName;

@end;


@implementation BusinessCard

@synthesize _firstName, _lastName;

- (void)dealloc{

    [_firstName release];

    [_lastName release];

    [super dealloc];

}

- (id) initWithCoder: (NSCoder *)coder

{

    if(self = [super init])

    {

        self._firstName = [coder decodeObjectForKey:@"_firstName"];

        self._lastName = [coder decodeObjectForKey:@"_lastName"];

    }

    return self;

}

- (void) encodeWithCoder: (NSCoder *)coder

{

    [coder encodeObject:_firstName forKey:@"_firstName"];

    [coder encodeObject:_lastName forKey:@"_lastName"];

}


@end

然后再存取时通过NSData做载体:

BusinessCard *bc = [[BusinessCard alloc] init];

NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];

NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject: bc];

[ud setObject: udObject forKey:@"myBusinessCard"];

[bc release];

udObject = nil;

udObject = [ud objectForKey: @"myBusinessCard"];

bc = [NSKeyedUnarchiver unarchiveObjectWithData: udObject] ;

    以上的代码时由另一个程序中截取的,没有测试过,但意思就是这样了。

    如果一个自定义类中由另一个自定义类对象,那么所有嵌套的类都要实现。


13 IOS系统版本比较宏

// System Versioning Preprocessor Macros

#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare: v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare: v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare: v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare: v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare: v options:NSNumericSearch] != NSOrderedDescending)


14 PS指定分辨率截图

IOS开发问题索引(七)


15  【编译】framework not foundAudioUnit

解决方案:

remove AudioUnit.framework, only addAudioToolbox.framework,may be this solution can help u. hav a try.


16 【编译】出现大量duplicate symbols错误问题

ld: 282 duplicate symbols for architecturei386

clang: error: linker command failed with exit code 1 (use -v to see

invocation)


1、有可能是重复引用了同一个第三方库的问题,例如本项目中引用了,而CocoaPods中也引用了;

2、有可能是主Framework引用次Framework打包时,误将次Framework也打包进去了,导致业务工程引用主次Framework时造成了重复引用问题。解决方案是:将次Framework从link Binary中移除,只是在工程中引入。

3、有可能是定义的字符串常量有问题;


17 【网络】JSON text did not startwith array or object and option

        AFNetworking请求时,返回“JSONtext did not start with array or object and option”错误

原因:

       服务端返回的数据不是JSON格式的,必须将响应***器改为其他的

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//   AFJSONResponseSerializer * responseSer = [AFJSONResponseSerializer new];

    AFHTTPResponseSerializer*responseSer = [AFHTTPResponseSerializer new];

    [manager setResponseSerializer: responseSer];


18 【api】NSDictionary排序

按NSDictionary的key来对其进行排序:

        先将dict的allkeys赋给一个数组,然后通过sortedArrayUsingComparator:方法对数组排序,然后遍历数组取字典对应key的值就ok

int i = 0;

NSArray *keys = [dict allKeys];

NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, idobj2) {

        return [obj1 compare: obj2 options:NSNumericSearch];

}];

for (NSString *categoryId in sortedArray) {

    ⋯⋯

    NSLog(@"[dict objectForKey: categoryId] === %@",[dict objectForKey: categoryId]);

}


19 JSONKITisa错误的解决办法

        在开发IOS的时候,好多第三方库使用JSONKIT这个库,在IOS6.0以上的版本编译的话,会提示 Semantic Issue错误。

        错误显示:direct access to Objective-C's isa is deprecated in favorof object_getClass()

        看资料说是 使用 array->isa 这个弃用的函数,网上查大部分的资料都说要使用object_getClass 和object_setClass来更正。

        看到Bee中Demo没有更改这个函数,花费很长时间终于整明白了如果使IOS不报这个错误,从项目中搜索 Direct usage of 'isa' 将 YES(treat as error) 改为NO 就可以了。


20 (XCTest.hfile not found)cocoapods引入Specta库之后报XCTest.h文件无法找到

1、点击Pods - TARGETS -[Pods-你的项目名Tests-Specta]-Build Settings ,搜索Framework sear

2、在Framework Search Paths 后双击,点击加号新增path,$(PLATFORM_DIR)/Developer/Library/Frameworks

IOS开发问题索引(七)

解决方案:

It looks like your main target is linkingto XCTest.framework as well as your test target. It should only be linked tothe main target.

1) Go to Project settings -> 

2) Go to your apps main target -> other linker flags 

3) remove '-framework XCTest' 

4) make sure the 'other linker flags' field for your test target still contains '-framework XCTest';


        Instead of removing, you can also make your framework optional by doing-weak_framework "XCTest"


Xcode 5.0.2 dyld: Library not loaded:@rpath/XCTest.framework/Versions/A/XCTest

http://*.com/questions/20340763/xcode-5-0-2-dyld-library-not-loaded-rpath-xctest-framework-versions-a-xctest

XCTest/XCTest.h not found on old projects built in Xcode

http://blog.sina.com.cn/s/blog_5df876f30102v9rd.html


21 【编译】存在大量重复定义的标记

IOS开发问题索引(七)

原因:

       在静态方法中使用了非静态的字符串常量

错误声明方法:

NSString *const XMLNS_XMPP_DISCO_INFO = @"http://jabber.org/protocol/disco#info";


正确声明方法;

static NSString *const XMLNS_XMPP_DISCO_INFO = @"http://jabber.org/protocol/disco#info";