2013-02-26 25 views
10

當我創建一個自定義導航欄類​​和定製它的使用下面的代碼title屬性:的iOS:「試圖插入從對象無對象[1]」創建字典

self.titleTextAttributes = @{ UITextAttributeFont: bariol, 
           UITextAttributeTextColor: [UIColor whiteColor] 
          }; 

然而,當我運行該代碼,則它返回下列錯誤消息:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[1]' 

我使用的Xcode 4.6和在設備上運行使用的是iOS 6.

回答

6

的文字的參數(值和鍵的字典)不能是nil

如果你更喜歡不太嚴格的構造函數,你可以考慮使用+[NSDictionary dictionaryWithObjectsAndKeys:]來代替。

+11

這並不是那麼嚴格,它只是認爲如果在預期關鍵時發現'nil',參數就會停止。值得注意的是,如果你傳遞一個'nil'對象,你會得到完全相同的異常。 – 2013-02-26 22:34:29

+0

@KevinBallard廢話。從[[NSDictionary dictionaryWithObjectsAndKeys:@「a」,@「a」,nil,@「b」,nil];'?它停止閱讀第一個零對象參數。 – justin 2013-02-26 22:51:58

+0

對不起,我說的對象,當我說的關鍵(倒裝方法)。它無法區分'nil'對象和sentinel'nil'。嘗試使用'nil'作爲鍵,看看我的意思:'[NSDictionary dictionaryWithObjectsAndKeys:@「anObj」,@「aKey」,@「anotherObj」,nil,nil]'。 – 2013-02-26 22:54:42

9

聽起來像你的bariol對象是nil。您不能將nil存儲在字典中。

編輯:

其實,你確定這是代碼行權?您的錯誤參考文獻NSPlaceholderArray,這表明這是一個@[]文字問題,而不是@{}文字。

+0

@justin:'dictionaryWithObjects:forKeys:count:'不使用'NSArray's。它使用C數組。 – 2013-02-26 23:56:24

+0

哎呀 - 廢話返回:)它仍然有可能在構建字典(或調用另一個構造函數)的過程中創建NSArrays,因此異常的消息。 – justin 2013-02-27 00:04:08

+0

@justin:一個'NSDictionary'文字不會構造中間的'NSArray's。所以除非'-setTitleTextAttributes:'做了一些有趣的事情,事實並非如此。 – 2013-02-27 00:22:30

3

這個錯誤似乎是在別的地方。它指向對象'1'處的數組錯誤。在你的情況下,你有一個字典和對象'1'是UITextAttributeTextColor: [UIColor whiteColor]這將永遠不會是零。

+7

是的,對於那些希望確認異常消息[]的用戶,它是失敗(nil)對象的0索引數組偏移量。經測試:NSString * str = nil; NSFileAttributeName:str,NSForegroundColorAttributeName:@「booboo」}; – robm 2015-09-12 06:04:26

+1

@robm BOOM!好一個。 – Benjohn 2017-02-08 14:42:56