1. 程式人生 > >專案開發中遇到的問題彙總~持續更新

專案開發中遇到的問題彙總~持續更新

專案開發快進入尾聲了,之前一直較忙,也由於沒有遇到什麼可以記載的問題,故此一直未整理,近期漸漸閒下來,會逐漸將這個專案在開發中遇到的問題彙總出來:

1. 整合藍芽(佳博印表機)要在info裡面進行如下配置

2.  程式在Xcode7.2上執行一切OK,在7.3上一跑就會報 Cannot create __weak reference in file using manual reference counting 錯誤,是因為升級到7.3以後,非ARC下使用__weak就會報錯,在非ARC模式下必須刪除所有的__weak

解決辦法:


三:支付寶支付功能公鑰處理

1. 按照流程生成公鑰私鑰後在後臺填好資料,(重要步驟)

在賬戶資訊中要把公鑰同步


在使用SDWebImage第三方庫是,訪問http站點的圖片不成問題,但當訪問https站點時,會遇到一個提示:

error:  NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

遇到這個提示時,首先說說怎麼解決這個問題。

在SDWebImageDownloaderOperation.m檔案中增加以下方法:

在NSURLConnection 代理方法中處理信任問題:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount]== 0) {
        
        //NSURLCredential 這個類是表示身份驗證憑據不可變物件。憑證的實際型別宣告的類的建構函式來確定。
        NSURLCredential* cre = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [challenge.sender useCredential:cre forAuthenticationChallenge:challenge];
    }
    else{
        
    }
}

這是NSURLConnection delegate的一個方法。

HTTPS 超文字傳輸安全協議(縮寫:HTTPS,英語:Hypertext Transfer Protocol Secure)是超文字傳輸協議SSL/TLS的組合,HTTPS的主要思想是在不安全的網路上建立一安全通道,並可在使用適當的加密包和伺服器證書可被驗證且可被信任時,對竊聽中間人攻擊提供合理的保護。HTTPS的信任繼承基於預先安裝在瀏覽器中的證書頒發機構(如VeriSign、Microsoft等)(意即“我信任證書頒發機構告訴我應該信任的”)。因此,一個到某網站的HTTPS連線可被信任,如果伺服器搭建自己的https 也就是說採用自認證的方式來建立https通道,這樣一般在客戶端是不被信任的,所以我們一般在瀏覽器訪問一些https站點的時候會有一個提示,問你是否繼續。

五:最近在新增活動時遇到一個bug,活動頁面的佈局因為沒用導航欄,每次從有導航欄的頁面進入時,檢視就會莫名的上移20px

查詢原因使用一下方法,在viewWillAppear也就是檢視每次顯示時列印所有的子檢視的位置

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    
    [self.view.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        obj.backgroundColor = kRandomColor;
        NSLog(@"%@- %zi-idx  %@-view",obj,idx,NSStringFromClass([obj class]));
    }];

}

發現每次從有導航欄的頁面進入時,檢視最基本的view的frame發生了變化,高度變了

解決方法: 在viewDidLayoutSubviews裡面重置frame即可

- (void)viewDidLayoutSubviews{
    self.view.frame = CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}

6. (LXS)微信支付過程中伺服器只返回一個訂單號,需要客戶端去微信下單,下單後返回的是XML資料的字串,解析式可以先將XML字串轉換成NSXMLParser,再用XMLDictionary三方庫解析

NSDictionary* dict = [NSDictionarydictionaryWithXMLParser:parser];

<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2958d0b2d48c010e]]></appid>
<mch_id><![CDATA[1965000002]]></mch_id>
<nonce_str><![CDATA[OjuEBoC6elB16tfW]]></nonce_str>
<sign><![CDATA[B9603C6D51C84DB5954F2799E2505244]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx20170467223011315c0430323345d19244]]></prepay_id>
<trade_type><![CDATA[APP]]></trade_type>
</xml>

7.讓UITableView的section header view不懸停的方法

當 UITableView 的 style 屬性設定為 Plain 時,這個tableview的section header在滾動時會預設懸停在介面頂端。取消這一特性的方法有兩種:

  1. 將 style 設定為 Grouped 。這時所有的section header都會隨著scrollview滾動了。不過 grouped 和 plain 的樣式有輕微區別,切換樣式後需要重新調整UI,使用grouped時,會有段尾的高度,如果不想要,可以使用代理設定段尾的高度,但是不能設為0,
    -(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
    {
    return 0.01f;
    }
  2. 過載scrollview的delegate方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat sectionHeaderHeight = 40;
    if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView.contentOffset.y>=0) {
        scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
    } else if (scrollView.contentOffset.y>=sectionHeaderHeight) {
        scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
    }
}
8. 點選UITableViewCell中的按鈕不起作用

在訂單管理介面中UITableViewCell是由UIView改過來的,xib還是UIView建立的,沒有contentView,但是UITableViewCell建立的xib應該是有一個contentView的,直接修改時xib中還是沒有contentView,在創建出來以後,系統會預設將contentView加上,經過多次測試,發現系統新增的contentView會覆蓋在檢視最上層,導致UITableViewCell上所有控制元件的點選事件均失效,在程式碼中加入    [self insertSubview:self.contentView atIndex:0];可解決,或重寫xib亦可。

9. cocoaPods重灌失敗,報錯RPC failed; curl 56 SSLRead()  return error -36問題,因為本人電腦上有三個版本的Xcode,導致路徑不明,更新出現問題,可以使用一下命令列指定路徑進行更新,

sudo xcode-select -switch /Applications/Xcode 8.2.1.app/Contents/Developer
也可以刪除過多的Xcode,只保留一個,名字改為Xcode再更新即可

10. could not insert new outlet connection

xib/storyboard連線屬性時偶爾會報這個錯誤,可以嘗試在要連線屬性的地方加入一個換行試試


11.使用git管理程式碼時,會出現部分路徑拷貝的情況,導致同一個工程有多個路徑


解決辦法,刪除除Podfile之外的pod相關檔案,重新pod install一次即可

12.在用Swift開發專案時,引入了三方庫R.swift,在pod install後偶爾會報以下錯誤


提示找不到R.swift/rswift檔案,加上即可,R.swift所在目錄下的正確檔案截圖如下


13. UIButton實現title有兩行文字

如果兩行文字大小相同,顏色相同,可以直接設定Line Break為Word Wrap,然後在Title中按option+enter就可以增加行數。

要想兩行文字大小不同,顏色不同,那加一個UILabel作為UIButton的subview了應該是最方便的實現方式了。

14.IB_DESIGNABLE 和 IBInspectable 的兩個比較厲害的屬性;

  • IB_DESIGNABLE 讓你的自定 UIView 可以在 IB 中預覽。
  • IBInspectable 讓你的自定義 UIView 的屬性出現在 IB 中 Attributes inspector 。
具體可檢視:http://www.jianshu.com/p/64931d040692

15. exc_bad_access(code=1,address=0x0)問題

原因:訪問了已經釋放的物件導致

出處:宣告引數時一時疏忽,把資料NSArray的用assign引用了,改為strong即可


16. message sent to deallocated instance 0x10b46e7d0

在WLYX開發的過程中,有個加入購物車的動畫,有次出現報錯message sent to deallocated instance 0x10b46e7d0,隨後會閃退,意思是說呼叫了已釋放物件不存在的方法,細查之下發現是因為A,B兩個頁面同時實現了動畫協議,但是在從A頁面跳轉到B頁面時,B頁面也遵守了協議,但是在頁面銷燬的時候沒有取消,解決辦法:需要遵守協議的地方儘量寫在頁面出現的地方(viewDidAppear),在頁面消失的時候進行銷燬(viewWillDisappear)。