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字體


7    【UI】UITableView不顯示分隔線

cityTableView.separatorStyle = UITableViewCellSeparatorStyleNone;


8 【UI】UITableViewCell去掉點擊效果

相當於Android中的ListView的selector設置成空/透明的:

1.XIB設置


上圖中的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指定分辨率截圖



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


解決方案:

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://stackoverflow.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 【編譯】存在大量重複定義的標記


原因:

       在靜態方法中使用了非靜態的字符串常量

錯誤聲明方法:

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";


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章