2013-02-26 65 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