iOS小計3

Stephanie發表於2017-09-10

提示:由於水平有限,如發現有疑問或錯誤的地方請毫不客氣的提出、討論,我會在第一時間回覆,感謝在先

在A_ViewController中對使用Xib建立的B_ViewController中IBOUT拉出來的控制元件賦值為空的問題;造成這種結果的原因是:當我們對B_ViewController 拉出來的控制元件賦值的時候,控制元件的初始化還沒有完成.解決方法:

  • B_ViewController中新增一個用於臨時儲存值的屬性.在B_ViewController 初始化完成後給B_ViewController IBOut的控制元件賦值
  • 如果是iOS9以後的版本 可以呼叫[B_ViewController loadViewIfNeeded]方法,iOS9 之前最好不要呼叫[B_ViewController loadView];在新增ViewController的時候最好設定其frame 然後再addChildViewController操作.

注意系統API返回容器是否可變

  • 也許你宣告的時候與寫getter方法的時候返回的是NSMutArray;但是在編碼過程中誤操作把它設定為不可變的 NSArray,然後呼叫可變資料的方法就會崩潰.eg:之前定義的是可變的陣列,但是經過對NSMuArray內容的篩選後返回的是不可變的陣列,返回時不可變的陣列.

關於陣列一些問題:

  • [__NSArrayI removeObject:]:unrecognized selector sent to instance 0xa391640:出現這種崩潰資訊說明陣列已經是NSArray;而不再是NSMutArray;其次可變容器是不能一邊遍歷,一邊進行刪除操作的

SVN一些常見設定

  • UI切圖放在360雲盤裡了,下載的時候自動從壓縮包裡面解壓了,結果是用SVN提交的時候出錯,說有些圖片的字首有不可列印的字元,不能提交,圖片前面會出現?號。解決方法:蘋果電腦上面解壓應用對帶有漢字的壓縮支援不太好,把網盤上面的壓縮包的中文名字改成英文.
  • svn預設會忽略一些檔案. 比如.a檔案是不能提交到svn;
    選擇Versions的選單View–>Show Ignored Items,這樣就會顯示出ignored的檔案,找到你要上傳的.a檔案,右鍵“Add”就行.

LanchScreen在iOS7.0以及之前的版本是不支援的

Xcode中lib、frme搜尋路徑設定

  • 在設定工程的library search path 或者 framework search path 的時候 , 一定要先配置好搜尋的路徑 ,一般都是相對路徑. <使用絕對路徑容易出現問題,比如使用程式碼管控工具,會找不到庫>
    $(SRCROOT)巨集和$(PROJECT_DIR)巨集都指xxx.xcodeproj所在的父目錄;$(inherited) 表示繼承關係.

一定要避免自己寫的類、方法與系統提供的API不能重名,儘量少重寫系統提供的方法.當使用別人提供的第三方庫、或者自己之前寫過的為已知類新增的分類,有可能從寫了系統的方法,這個時候首先執行的是第三方或者是自己新增到類目中方法,排查這種錯誤時候可以打斷點跟蹤一下程式碼執行或者通過搜尋檔案方式去查詢是否存在重寫系統方法的分類.

關於證書的一些問題

  • our build settings specify a provisioning profile with the UUID “XXXXXX”,however, no such provisioning profile was found 引起這種情況有兩種原因:

    1. provision 檔案與證書不匹配;要重新設定一下.
    2. provision檔案丟失.也就是找不到. 檢查你的provision檔案是否被刪除, 如果被刪除重新下載安裝.
      如果還是不行可以進行如下操作:

      1. 找到專案中的**.xcodeproj檔案,點選右鍵,show package contents(開啟包內容).
      2. 開啟後找到project.pbxproj檔案,用文字編輯器開啟。其實就是右鍵,點選open就好了.
      3. 開啟這個檔案後,按command+F,在這個檔案中查詢“PROVISIONING_PROFILE”,找到和這個PROVISIONING_PROFILE=”487F3EAC05FB4A2A9EA031F1F35760EB”;”PROVISIONING_PROFILE[sdk=iphoneos*]” = “487F3EAC-05FB-4A2A-9EA0-31F1F35760EB”;”類似的都刪除.
  • The certificate used to sign “XXXXX” has either expired or has been revoked. An updated certificate is required to sign and install the application;證書已過期或者被revoked需要更新證書)解決方法:

    1. 在開啟Xcode Meun選單下的Preference
    2. 選擇Account>Team>ViewDetails
    3. 在Profileslist中選中任意一個Provisionfile
    4. 右擊選中的ProvisionFile > Show in Finder ,然後把所有Provision刪除
    5. 點選DownLoadAll重新下載ProvisionFile

Property && Synthesize && Dynamic

property:是封裝資料的地方: 除了根據(readwrite/readonly)生成對應的setter、getter方法以外,還會生成一個帶有下劃線與屬性名相同的例項變數.
synthesize:用來指定屬性對應成員變數的名稱.
dynamic:告訴編譯器不要生成getter、setter 方法.

@interface SteStudent : NSObject
@property (copy, nonatomic) NSString* name;
@property (assign, nonatomic) int score;
@end
  
@implementation SteStudent
//生成一個name例項變數.
@synthesize name; 
//生成一個_score的例項變數.
@synthesize score = _score; 
  
- (void)testSynthesize{

    self.name = @"name"; 

/*
Important: If you use @synthesize without specifying an instance variable name, like this:
@synthesize firstName;
the instance variable will bear the same name as the property.
In this example, the instance variable will also be called firstName, without an underscore.
如果沒有指定要生成的例項變數,那麼就會生成一個和屬性名相同的例項變數.
 */
 
_name = @"yourName"; //報錯

/***synthesize小結
如果指定了成員變數的名稱,會生成一個指定的名稱的例項變數.
例如:@synthesize customPro = _customPoy;設定屬性變數可以通過_customPoy來設定.
如果這個例項已經存在了就不再生成了,例如:
@implementation SteStu {
 //已經存在一個_customPoy例項變數就不會再生成.
 id _customPoy ; 
}
如果是@synthesize customPoy;則會生成一個名稱為customPoy的例項變 量-沒有下劃線.
如果是@synthesize property = _foo;生成一個帶下劃線的_foo例項變數
*/

}

什麼情況下不會自動合成屬性變數.

  • 同時重寫setter 和 getter時(可以在implemention裡面單獨實現或者利用synthesize指定)
  • 重寫只讀屬性的 getter 時
  • 使用@dynamic property 時
    (對於上面三種情況,可理解為編譯器認為我們自己需要根據readwrite或者readonly 來手動實現對應的getter、setter方法,所以沒必要合成一個例項變數)
  • 在@protocol 中定義的所有屬性
  • 在category 中定義的所有屬性
  • 子類過載父類的屬性;在子類中訪問父類_property報錯;

iOS新增其他字型
專案中用到了PingFangSC字型,但是在iOS8中並不支援這裡給出兩種解決方法:

  • 下載PingFangSC字型並且新增到工程中,因為字型庫一般很大,這樣會增大包的大小

    1. 根據需要找到所需字型的PostScript然後下載並拖進自己的工程中.
    2. 在Plist檔案中新增 Fonts Provided By application 描述.
    3. 根據需要建立自己所需字型.
      具體細節參考:https://codewithchris.com/com…
  • 動態下載下載到iOS系統中;包大小不會增大.

    1. 找到所需字型的PostScript然後新增到下載列中;如果已經下載就不用再次下載.
    2. 根據需要用UIFont建立所需字型.
      具體細節參考:http://blog.devtang.com/2013/…

AttributedString屬性設定時使用CoreTextApi設定下劃線顏色沒有效果.
設定UILabel.attributedString下劃線時使用CoreTextAPI沒有效果;設定的時候儘量使用Foundation框架裡對應的key去設定


   NSMutableAttributedString* mutAttString =  
   [[NSMutableAttributedString alloc]initWithString:@"Do     what you wanna do!"];

    //這樣設定沒有效果.
    [
    mutAttString 
        addAttribute:(id)kCTUnderlineColorAttributeName  
               value:(id)[UIColor redColor].CGColor  
               range:NSMakeRange(0, 4)
    ];
    
    //使用Foundation中對應的key進行設定.
    [
    mutAttString  
         addAttribute:NSUnderlineColorAttributeName  
                value:[UIColor redColor]   
                range:NSMakeRange(0,4)
    ];
    

相關文章