首頁  >  文章  >  後端開發  >  iOS 開發百問(9)

iOS 開發百問(9)

黄舟
黄舟原創
2017-01-20 09:47:001156瀏覽

101、編譯錯誤:ld: library notfound for -lPods
當專案中使用了 cocoaPods 時,經常出現此錯誤(通常是 release 的時候)。
這是由於 pod install 後,cocoaPods 會建立一個新的 workspace。你必須關閉項目並重新打開。問題即可解決。
102、為什麼 iOS 的時間總是比真實時間慢8小時 
例如,一個北京時間"2014-4-4 22:00"(字串),需要轉換成 NSDate。字串轉換成 NSDate 一般是透過 NSDateFormatter 進行的。而在iOS 上NSDate 以GMT 時間存儲,因此NSDateFormatter會自動將字串當前時區的本地時間處理,即將被轉換的北京時間(字符串"2014-4-4 22:00")換成GMT 時間(" 2014-4-4 14:00")。如果直接把這個 NSDate(longlong,1970以來的秒數或毫秒數)傳給伺服器,伺服器會把這個時間當成北京時間使用(實際上它卻是GMT時間),這就導致時間差了8小時。
正確的做法是在這個 NSDate 的基礎上加上時差。而時差的計算需要知道目前時區。 [NSTimeZonesystemTimeZone]可以得到目前時區(東8區),然後用 secondsFromGMTForDate: 方法可獲得這個時區(東8區)的時差(以秒計)。程式碼如下:

NSDateFormatter* df=[NSDateFormatter new];
// [dfsetLocale:[NSLocale currentLocale]];
df.dateFormat=@"yyyy-MM-dd HH:mm";
NSDate* date=[dfdateFromString:@"2014-4-4 22:00"];
NSTimeZone *zone =[NSTimeZone systemTimeZone];
NSInteger interval = [zonesecondsFromGMTForDate: date];
NSDate *localeDate =[date dateByAddingTimeInterval:interval];
NSLog(@"%@",localeDate);

103、禁止 UITableViewController 中鍵盤彈出動畫
TableViewController 中內建了鍵盤彈出動畫的程式碼,當儲存格中的輸入控制項彈出軟鍵盤時,tableView 會自動向上捲動。但這個功能有時候會帶來大麻煩,因為有時候輸入控制會被捲到不可視的地方。由於我們無法修改框架的程式碼,所以這種情況下我們必須放棄使用 TableViewController(子類化),而改用一般的UIViewController+UITableView 代替。但有時我們必須使用TableViewContrller-例如想使用它的靜態儲存格,則可以透過下列方法解決。在UITableViewController 子類別中覆寫 viewWillAppear 方法,停用父類別的 viewWillAppear 行為。即不要呼叫[superviewWillAppear:animated]一句:

-(void)viewWillAppear:(BOOL)animated{
// Override super method with don'tcall [super viewWillApper]
}

104、什麼時候應該使用NSCache
NSCache 會自動根據記憶體壓力釋放其中的某個快取物件(例如視圖被銷毀,或快取的物件實在太多) 。因此 NSCache 快取的物件必須是可以重建的,例如這些物件——可以在需要時從網路上下載到的資料。否則,你不應當使用 NSCache——因為物件不知道什麼時候就會被銷毀了。
因此,使用NSCache 時必須注意,如果檢索的物件在cache 中不存在,我們必須重建一個:

-(CachedObject)getCachedObject:(id)key{
id* obj=[NSCacheObjectobjectForKey:key];
if (cb==nil) {
obj=[[CachedObjectalloc]init]; // Recreate cached object
……
}
return obj;
}

105、Pods 在Xcode5 上Archive 的問題
問題描述:
Archive 時出現如下錯誤(debug 時出現如下錯誤(debug 時出現以下錯誤(debug 時出現以下錯誤(debug 時出現以下錯誤(debug 時出現以下錯誤(debug 時)可能是正常的):
ld: library not found for -lPods
問題是由於Xcode5.x 現在會檢測依賴項目的architecture ,其設定必須和主項目一致,否則該依賴項目會被拒絕(即不會編譯)。
解決辦法:
在 Pods 專案的所有 target 下,將他們的 architecture 設定為和主專案一致。
106、如何查看靜態庫支援的Architecture
使用「lipo -info 靜態庫檔案」指令,例如:
lipo -info Unrar4iOS
接著終端會如下顯示:
Architectures in the fat file: Unrar4iOS are: armv7 arm:6arm i386
107、專案中引入某些靜態函式庫會導致在Archive 時報「Undefined symbols forarchitecture armv7s/arm64」錯誤
正如問題105 所述。除了用問題 105 的解決方法,還有一個解決方法。
首先查看該靜態庫的 Architecture(參考問題106)。然後修改 Scheme 為該靜態函式庫支援的 Architecture。接著修改 Buid Settings 中的 Build Active ArchitectureOnly(僅編譯為所選的架構),將數值改為 Yes。然後編譯即可。
108、Autolayout 下,UITableView 的高度不正確
Autolayout 下,如果有導覽欄,視圖上的 UITableView 受 constraints 的限制,運行時高度被 constraints 重新設定為沒有導覽列的高度。此時應該實作viewDidLayoutSubviews 方法,將 constraints 的影響排除:

- (void)viewDidLayoutSubviews {
_table.frame=CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height);
}

109、如何修改預設回傳按鈕的title?
假設導航為:A視圖-->B視圖
如果要改變B視圖返回A視圖的返回按鈕的title,只需在A視圖中使用如下代碼:

self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:nil];
B视图不用做任何操作。

110、有一個空對象,但它既不是nil,也不是null?
它是 NSNull。你可以列印這個物件(用 po 指令或 NSLog),則列印結果是“”,而不是“(null)”(nil 物件)。
由於O-C 的集合物件中不允許插入空值(nil),而 NSNull 並不是 nil,所以就用NSNull 物件來表示這個集合為空(表示列表結束)。而且,與 nil 不同,發送訊息給一個 NSNull 將導致異常。
NSNull有唯一的方法:[NSNull null]你可以用它來測試一個物件是不是 NSNull:

BOOL isNSNull(id any){
return [any isEqual:[NSNullnull]];
}

以上就是iOS 开发百问(9)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn